Действительно ли сеанс, хранящийся в базах данных, нарушает RESTfulness?

Я читал много статей, в которых говорилось, что сеансы нарушают безгражданство в отношении REST.

Если пользователь входит на сервер, сервер передает клиенту файл cookie сеанса (ssid) и сохраняет данные сеанса (данные пользователя) на сервере, в данном случае в памяти.

Логично, что это нарушает безгражданство.

Но как насчет хранения сеанса в базе данных?

Если пользователь входит на сервер, сервер передает клиенту файл cookie сеанса (ssid) и сохраняет данные сеанса в базе данных mysql, а не в памяти.

Это тоже нарушение безгражданства?

Если это так, то в чем разница между «хранением сеанса в базе данных» и «запросом пользователя, который делает запрос к данным базы данных?»

Оба они извлекают некоторые данные из базы данных при выполнении запроса клиента.

Очевидно, что последнее не нарушает безгражданства, иначе REST архитектура никогда не была бы такой популярной.

мой предыдущий вопрос, Нарушение RESTfulness в отношении базы данных, ответчик говорит, что «это не нарушает»

Наоборот, Действительно ли сеансы нарушают RESTfulness? ответчик говорит "да, это нарушение". но этот ответ может быть связан только с серверной стороной (памятью).

Так запутался.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
280
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Отсутствие состояния в REST, в частности, относится для информативности сообщений.

Это означает, что каждый запрос должен содержать всю информацию, необходимую серверу для обработки сообщения. Запрос не может ссылаться на предыдущие запросы контекста. Связанный документ (диссертация Филдинга, происхождение REST) ​​довольно подробно описывает Зачем, что ограничение полезно для распределенных систем.

Таким образом, в конце концов, не имеет значения, находится ли что-то в базе данных или в памяти на сервере, клиент не должен полагаться на ранее установленное состояние диалога для последующих запросов.

Подумайте об этом так: клиент может отложить свои следующие запросы на несколько дней, или клиент может выполнить запрос из какой-либо формы закладок, или запрос может отправиться на другой сервер, чем все предыдущие запросы. Или это может быть первый запрос, который делает клиент. Все это должно работать точно так же.

Еще один важный момент заключается в том, что «состояние сеанса» отличается от связанных с бизнесом вещей, хранящихся в базах данных (на которые вы, похоже, ссылаетесь). Конечно, сервер может хранить информацию, связанную с бизнесом, в своей базе данных, он может даже хранить или кэшировать (в памяти) данные входа в систему или состояние разговора, если он этого хочет, и все в порядке. Однако клиент и сервер могут нет «обогатить» запрос контекстом из предыдущих запросов.

Таким образом, клиент может запросить выполнение запроса к некоторой базе данных, которая, очевидно, имеет некоторое «состояние». Чего он может не делать, так это сказать: выполните этот запрос с дополнительными параметрами (такими как логин), указанными в каком-то предыдущем запросе, который я сделал.

Эта линия может размываться в некоторых случаях, например, когда сервер позволяет создавать «транзакции» для клиентов в качестве ресурсов. Но если вы сомневаетесь, всегда знайте Зачем, что вам нужно это свойство и какое значение вы хотите получить от него в вашей конкретной архитектуре.

Хорошее объяснение! Можете ли вы привести пример «дополнения запроса контекстом из предыдущих запросов»? Я почти там.

koo 09.04.2019 12:32

Типичным примером является, конечно, информация для входа в систему, такая как имя пользователя, права или роли, определенные в запросе «входа», сделанном ранее. Но может включать в себя такие вещи, как: бизнес-объект, над которым вы «в настоящее время» работаете (текущий клиент, которого вы обслуживаете, и т. д.), последние выполненные запросы и т. д.

Robert Bräutigam 09.04.2019 12:49

У меня еще один вопрос, если можно! Как насчет сеанса корзины покупок? когда клиент кладет товар в корзину, сервер сохраняет эту информацию как сеанс. Но, как вы сказали, похоже, что следующий запрос может не относиться к предыдущему контексту. Все, что хранит пользователь, не повлияет на следующий запрос. Так что это не нарушает безгражданство REST. Надеюсь я правильно понял!

koo 09.04.2019 13:04

Корзина покупок на сервере мог нарушает REST и безгражданство, если реализована таким образом. Однако обычно это состояние, связанное с бизнесом, поддерживаемое сервером, а не состояние связи между сервером и клиентом, что было бы нормально. Но, как я уже сказал, некоторые вещи сводятся к интерпретации. Теоретически вы также можете хранить корзину покупок на клиенте, что сделает дизайн менее двусмысленным. Оба работают, и оба совместимы с REST и безгражданством, если все сделано правильно.

Robert Bräutigam 09.04.2019 13:23

"может нарушить" имеет смысл. Также было бы важно быть гибким, только чтобы не исправлять реализацию после REST. ценить это.

koo 09.04.2019 13:33

Другие вопросы по теме