【问题标题】:Retrieving/storing cart data over REST api通过 REST api 检索/存储购物车数据
【发布时间】:2018-10-14 04:32:31
【问题描述】:

我正在管理多个商店,由于这变得很麻烦,我想转移到一个新设置,在该设置中,所有商店都使用一个 API。我想将 Laravel 用于商店和 API。由于该应用程序专注于电子商务,因此我确实需要将客户购物车存储在某个地方,并且我希望它们也可以通过 API 使用。问题是我在“Restfull”和无状态编程/思考方面没有很多经验,尤其是在保存购物车数据之类的主题方面,但我真的很想了解它。

因此,由于 API 是无状态的,因此购物车不能像在普通 Web 应用程序中那样存储在 PHP/Laravel 会话中。因此我想出了以下解决方案(将产品添加到购物车的示例):

  1. 在执行对购物车端点的调用时,检查客户端应用的会话中是否有购物车标识符,如果没有,则创建一个。在 API 上请求与购物车相关的端点时,始终发送此唯一标识符。

    // On the client app
    $http->post('https://api.mainapp.com/cart/add', 'json' => [
      'product_id' => 1,
      'cart_identifier' => session()->get('cart_identifier'),
    ]);
    
  2. 购物车端点检查是否提供了唯一标识符并通过唯一标识符从数据库中检索购物车

    // On the API server
    $cart = Cart::where(['cart_identifier', 'qgbwaqt4jibijycDhY4U'])->firstOrFail();
    return $cart->addToCart(['product_id' => 1]);
    

3.1。如果唯一标识符没有购物车,则创建一个新购物车并在新购物车上执行操作。

    // On the API server
    $newCart = Cart::create(['cart_identifier' => 'qgbwaqt4jibijycDhY4U']);
    $newCart->addToCart(['product_id' => 1]);
  1. Laravel 使用时间戳,所以当有东西被添加到购物车时,购物车表的时间戳会被修改。因此,我只想运行一个脚本来清理 db 表,删除所有具有 updated_at 时间戳的旧购物车,例如 3 个月。到那时,客户端应用的会话早已过期,无论如何这些购物车都不会被访问。

    // On the API server
    $cart = Cart::where(['updated_at', '<=', Carbon::now()->subMonths(3)])->delete();
    

所以现在我的问题是:对于通过 RESTfull API 检索和存储购物车数据,这是一个好的解决方案(我知道这真的很主观)吗?它是安全的还是有任何漏洞?我以前从未编写过这样的程序,我只是想检查一下我的思维方式是否适合无状态/RESTfull 思维方式,以及我是否走上正轨。

提前致谢!!

【问题讨论】:

    标签: php laravel rest api


    【解决方案1】:

    听起来你有一些有用的东西......所以你可以把它留在那里。但是,如果我们只是头脑风暴~我可能会做这样的事情......

    1. 将状态放入 redis 中,记录 3 个月的 TTL。
    2. 将 cart_identifier 保存在本地存储中
    3. 使用节点/redis 在站点加载时或定期填充卡。

    类似上面的东西会:

    • 在会话之外保持状态,您已经这样做是正确的,以便您可以扩展。
    • 允许 php/server 端事件(如缺货)更新 redis 并从节点推送到浏览器。
    • 另一个奇妙的好处是在这里完成 3 个列表!

    【讨论】:

    • 感谢您提供见解,真的很有帮助!一些问题:您会将购物车数据保存在 Redis 数据库中,并使用 cart_identifier 作为键,而不是将购物车保存在 SQL/关系数据库中?你能解释一下为什么吗?并且您会将唯一的 cart_identifier 保存在浏览器的本地存储中而不是 Laravel 会话中? API 调用现在将在服务器端完成,所以这是我必须考虑的事情。将 cart_identifier 作为元标记存储在 HTML 的头部是否也安全?提前致谢!
    【解决方案2】:

    替代解决方案:

    可以尝试在后端部分使用:Laravel Cashier

    我的经验表明,使用 RESTfull API 对此有好处,但是您应该在前端-后端边缘部分针对 CSRF、XSS、XST 攻击(例如使用带有 CSRF_TOKEN 等的 http-only cookie)进行一些保护。

    【讨论】:

    • 感谢您的回答,但 Laravel Cashier 是一个用于支付的 API/服务。不是为了存储购物车数据,不是吗?我不认为 Cashier 是通过 API 存储/检索购物车数据的解决方案。
    • Cashier 只是后端部分(不是 Restful-api 部分)——据我所知,它存储购物车数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2018-05-28
    • 2019-08-15
    • 1970-01-01
    • 2015-11-09
    • 2013-02-05
    相关资源
    最近更新 更多