Должен ли я вернуть сущность из POST во всех случаях? - PullRequest
2 голосов
/ 08 ноября 2011

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

Я не раб REST при создании общедоступных API, особенно когда я считаю, что по причинам удобства использования или архитектуры это не имеет смысла, но одна вещь, о которой я всегда задумывался и никогдаdone возвращает 204 No Content из POST, создавая новые объекты (особенно большие по размеру).Это может сократить полосу пропускания для пользователей, делающих много запросов, и быстрее отвечать на мои вопросы.

Это приемлемая практика, или она заставляет вас умереть немного внутри?Обратите внимание, что я не рассмотрел бы это без предоставления конечной точки для извлечения этой сущности по причинам тестирования.

РЕДАКТИРОВАТЬ: Я ищу отдельные наблюдения или конкретные примеры того, почему этот конкретный вариант использования может быть вредным, даже еслиэто было хорошо задокументировано.

Ответы [ 2 ]

5 голосов
/ 08 ноября 2011

В документе, на который вы ссылаетесь, есть ответ на заданный вами вопрос:

Если ресурс был создан на исходном сервере, ответ ДОЛЖЕН быть 201 (Создан) и содержать сущностькоторый описывает состояние запроса и ссылается на новый ресурс и заголовок Location (см. раздел 14.30).

Ответы на этот метод не могут быть кэшированы, если ответ не включает в себя соответствующие поля заголовка Cache-Control или Expires,Однако ответ 303 (см. «Другое») можно использовать для указания агенту пользователя на получение кэшируемого ресурса.

4 голосов
/ 08 ноября 2011

Относительно использования 204 No Content, в соответствии со спецификацией, вы вернете это (или 200), когда POST создаст ресурс, который не идентифицирован URI.Если это правильно описывает ваш вариант использования, тогда будет уместным 204.

Как указывает @Dmitry в своем комментарии, возвращаемая сущность не обязательно должна быть новым ресурсом.Например, если идентификатор ресурса назначен сервером, ответом может быть объект, содержащий только этот идентификатор, сгенерированный сервером.

Конкретный пример этого показан в документации CouchDB для POST .

Для этого примера запроса:

POST /somedatabase/ HTTP/1.0
Content-Length: 245
Content-Type: application/json

{
  "Subject":"I like Plankton",
  "Author":"Rusty",
  "PostedDate":"2006-08-15T17:30:12-04:00",
  "Tags":["plankton", "baseball", "decisions"],
  "Body":"I decided today that I don't like baseball. I like plankton."
}

ответом сервера будет объект, содержащий статус, идентификатор и версию:

HTTP/1.1 201 Created
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Type: application/json
Connection: close

{"ok":true, "id":"123BAC", "rev":"946B7D1C"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...