Получение / хранение данных корзины через API REST - PullRequest
0 голосов
/ 03 мая 2018

Я управляю несколькими магазинами, и, поскольку это становится проблемой, я хочу перейти к новой настройке, где есть один API, который используется всеми магазинами. Я хочу использовать Laravel для магазинов, а также для API. Поскольку приложения ориентированы на электронную коммерцию, мне нужно где-то хранить тележки клиентов, и я хочу, чтобы они также были доступны через API. Дело в том, что у меня нет большого опыта в «Restfull» и программировании / мышлении без сохранения состояния, особенно в том, что касается сохранения чего-то вроде данных корзины, но я действительно хочу узнать об этом.

Таким образом, корзины нельзя хранить в сеансе PHP / Laravel, как в обычном веб-приложении, поскольку 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,1. Если для уникального идентификатора нет корзины, создайте новую корзину и выполните действие с новой корзиной.

    // On the API server
    $newCart = Cart::create(['cart_identifier' => 'qgbwaqt4jibijycDhY4U']);
    $newCart->addToCart(['product_id' => 1]);
  1. Laravel использует временные метки, поэтому временные метки таблицы корзины будут изменены при добавлении чего-либо в корзину. поэтому я просто хочу запустить скрипт, который очищает таблицу базы данных, удаляя все старые корзины, которые имеют отметку времени updated_at, которая старше, например, на 3 месяца. К тому времени сеанс клиентского приложения уже давно истек, и эти тележки все равно не будут доступны.

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

Итак, теперь мой вопрос: является ли это хорошим решением (и я знаю, что оно действительно субъективно) для извлечения и хранения данных корзины через RESTfull API? Это безопасно или есть какие-то уязвимости? Я никогда не программировал что-то подобное раньше, и я просто хочу проверить, вписывается ли мой образ мышления в образ мышления без состояния / RESTfull и в правильном ли я положении.

Заранее спасибо !!

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Звучит так, будто у вас есть что-то, что работает ... так что вы можете оставить все как есть. Однако, если мы просто будем мозговым штурмом ~, я мог бы сделать что-то вроде этого ...

  1. Поместить состояние в Redis с 3-месячным TTL на записи.
  2. Хранить cart_identifier в местном хранилище
  3. Используйте узел / redis для заполнения карты при загрузке сайта или периодически.

Примерно так:

  • сохранить состояние вне сеансов, что вы правильно делаете, чтобы вы могли масштабировать.
  • разрешить событиям на стороне php / server (например, нет в наличии) обновлять redis и отправлять в браузер с узла.
  • еще одно фантастическое преимущество - вот список из 3!
0 голосов
/ 03 мая 2018

Альтернативное решение:

Может быть попытаться использовать: Касса Laravel в серверной части.

Мой опыт показывает, что использование RESTfull API хорошо для этого, однако вы должны обеспечить некоторую защиту от CSRF, XSS, XST-атак (используя, например, файлы cookie только для http с CSRF_TOKEN и т. Д.) В пограничной части внешнего интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...