#rest
#rest
Вопрос:
С моей точки зрения, сессия нарушает RESTfulness
либо когда она хранится в памяти, либо в БД.
В случае сеанса, хранящегося в памяти, трудно масштабировать сервер, используя подобную балансировку нагрузки, поскольку серверы не совместно используют данные сеанса.
Аналогично, в случае сеанса, хранящегося в базе данных, база данных будет перегружена, когда множество серверов одновременно выполняют запросы.
Моя проблема связана со вторым случаем.
Долгое время я думал, что сервер и база данных разные.
Мое прошлое предположение)
Когда клиент отправляет запрос на сервер с определенными данными, сервер сохраняет эти данные в базе данных, такой как mysql или mongo и т.д.
Таким образом, серверу не нужно заботиться о состоянии клиента, поскольку база данных полностью контролирует их.
Сервер может самостоятельно реагировать на запрос клиента, поскольку сервер может выполнять запрос к базе данных всякий раз, когда хочет узнать, кто является клиентом.
Итак, мои два вопроса заключаются в том, что,
- Всякий раз, когда упоминается, что «сервер RESTful автономно выполняет запрос клиента», включает ли этот «сервер» базу данных?
- Если да, и если существует пользовательская модель и постмодель, связанные с отношением «один ко многим», разве это также не нарушает RESTfulness?
Я уверен, что второй вопрос не имеет смысла, поскольку, если ответ на второй вопрос верен, то RestAPI никогда бы не был таким полезным.
Но я не могу понять разницу между сеансом в базе данных, нарушающим RESTfulness, и пользовательским сообщением, не нарушающим Restfulness.
Я думаю, что оба они следуют одной и той же процедуре клиент-сервер-база данных.
Как я могу легко разобраться в этой проблеме?
Ответ №1:
Что обычно подразумевается под безгражданством, резюмируется следующим образом: вся информация для выполнения HTTP-запроса содержится в запросе самостоятельно.
Некоторые последствия заключаются в том, что:
- Я могу отключить TCP-сокет и повторно открыть его, или я могу сохранить TCP-соединение открытым, и это не имеет никакого значения. Вся информация для выполнения запроса содержится в запросе.
- В случае идемпотентных методов я могу повторно выполнить точно такой же запрос и в конечном итоге получить то же состояние, как если бы я сделал это только один раз.
Другими словами,
Существуют более полные описания безгражданства и HTTP, но важно то, что безгражданство здесь НЕ означает, что сервер вообще не может иметь никакого состояния. Большинство служб REST, вероятно, бесполезны, если нет состояния.
Теперь к вопросу о том, нарушает ли проведение сеанса принципалы REST. Я думаю, что в любом случае трудно объективно заявить об этом. Важными частями в отношении вашего вопроса является то, что для обеспечения RESTful вам нужна концепция ресурсов, концепция возможности обращаться к ним и концепция передачи состояния между клиентом и сервером. (есть и другие вещи, которые составляют службу REST, но вот несколько релевантных фрагментов).
Я не думаю, что наличие средств аутентификации предотвращает это, выполняется ли аутентификация через Authorization
заголовок или Cookie
header на самом деле не так важно.
Если файлы cookie сеанса и связанные с ними данные сеанса начинают вмешиваться в этот процесс другими способами, функция, связанная с сеансом, может нарушать принципы REST, но я не думаю, что это в целом верно.
Если есть «много статей», в которых говорится, что сеансы нарушают REST, я не думаю, что для этого есть какие-либо реальные основания. Существует множество мусорных описаний REST, которые распространяются. Я действительно думаю, что использование файлов cookie для аутентификации может быть вредным по другим причинам. Это создает потенциал для проблем с безопасностью.
Комментарии:
1. исправлено //@Evert Благодарю за ваш ответ. Но я хотел бы повторно спросить, все ли в порядке. Включает ли «сервер» также базу данных? Как вы сказали, «HTTP-запрос является автономным» действительно сбивает с толку. Это может быть токен, подобный jwt, который содержит всю информацию, относящуюся к клиенту. но как насчет запроса, который содержит информацию, которая гласит: «Мне нужны данные post, связанные с пользователем, идентификатор которого равен 1». Сервер извлечет эти записи из базы данных и передаст их пользователю. Как это звучит? Нарушает ли это REST?
2. @koo: Да, хранить состояние в базе данных совершенно нормально. HTTP-клиент не знает, что вы использовали для сохранения состояния, и это не имеет значения.
3. боже.. таким образом, если сервер сохраняет сеанс клиента в базе данных, такой как mysql, а не в памяти, это не нарушает состояние без сохранения состояния!
4. по той же причине, что и выборка сообщений из базы данных, верно?
5. @koo, нет .. с точки зрения HTTP-клиента и сервера вы даже не можете сказать, было ли что-то сохранено в памяти или в базе данных. Это неважная деталь
Ответ №2:
Сервер Restful отделен от базы данных. Restful server, если такая вещь существует, является просто веб-сервером. REST — это просто архитектура, скажем, методология, которая доставляет информацию с сервера клиенту и наоборот по HTTP.
Комментарии:
1. то есть вы имеете в виду, что сеанс не нарушает RESTfulness? даже независимо от того, что хранится в базе данных? во многих статьях говорится, что использование сеанса само по себе нарушает REST
2. Сеансы выходят за рамки REST. И что с того, что они это сделают, и что с того, что если они этого не сделают. Какую проблему это вызывает в вашем приложении?
3. спасибо за ваш комментарий. почему голосование против? но на самом деле я не могу полностью понять, что вы имеете в виду. почему люди говорят, что использование сеанса нарушает RestAPI?
4. Не могли бы вы, пожалуйста, ответить на мой вопрос более подробно?