通过REST API

时间:2018-05-03 19:01:25

标签: php laravel rest api

我正在管理多个商店,因为这变得很麻烦,我想转移到一个新的设置,其中有一个API被所有商店消耗。我想将Laravel用于商店以及API。由于应用程序是以电子商务为重点,我需要将客户购物车存储在某个地方,我希望它们也可以通过API获得。问题是我没有很多关于'Restfull'和无状态编程/思考的经验,特别是没有关于保存像购物车数据这样的主题,但我真的很想了解它。

因此,购物车无法存储在PHP / Laravel会话中,就像它们在普通的Web应用程序中一样,因为API是无状态的。因此,我提出了以下解决方案(将产品添加到购物车的示例):

  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. 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();
      
    2. 所以现在我的问题是:这是一个很好的解决方案(我知道这是非常主观的),可以通过RESTfull API检索和存储购物车数据吗?它是安全的还是有任何漏洞?我之前从未编写过类似的东西,我只是想检查一下我的思维方式是否符合无状态/ RESTfull思维模式以及我是否正常运行。

      提前致谢!!

1 个答案:

答案 0 :(得分:1)

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

  1. 将状态置于redis中,记录上有3个月的TTL。
  2. 将cart_identifier保留在localstorage
  3. 使用node / redis在网站加载时定期填充卡片。
  4. 上面的内容会:

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