Нарушение режима RESTfulness в отношении базы данных

#rest

#rest

Вопрос:

С моей точки зрения, сессия нарушает RESTfulness либо когда она хранится в памяти, либо в БД.

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

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

Моя проблема связана со вторым случаем.

Долгое время я думал, что сервер и база данных разные.


Мое прошлое предположение)

Когда клиент отправляет запрос на сервер с определенными данными, сервер сохраняет эти данные в базе данных, такой как mysql или mongo и т.д.

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

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


Итак, мои два вопроса заключаются в том, что,

  1. Всякий раз, когда упоминается, что «сервер RESTful автономно выполняет запрос клиента», включает ли этот «сервер» базу данных?
  2. Если да, и если существует пользовательская модель и постмодель, связанные с отношением «один ко многим», разве это также не нарушает 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. Не могли бы вы, пожалуйста, ответить на мой вопрос более подробно?