Подтвердить что ты не робот

Создайте запрос с POST, какие коды ответов 200 или 201 и контент

Предположим, что я пишу службу REST, целью которой является добавить новый элемент данных в систему.

Я планирую POST на

http://myhost/serviceX/someResources

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

Я смотрю определения кодов ответов HTTP и вижу следующие возможности:

200: возвращает объект, описывающий или содержащий результат действия;

201: это означает СОЗДАНИЕ. Значение * Запрос выполнен и привел к созданию нового ресурса. На вновь созданный ресурс можно ссылаться на URI (ы), возвращенные в сущности ответа, с самым конкретным URI для ресурса, заданного полем заголовка Location. Ответ СЛЕДУЕТ включать объект, содержащий список характеристик и местоположения ресурсов, из которых пользователь или пользователь может выбрать наиболее подходящий. Формат сущности определяется типом носителя, указанным в поле заголовка Content-Type. *

Последний звучит скорее в соответствии с спецификацией Http, но я не совсем понимаю, что

Ответ ДОЛЖЕН включать объект содержащий список ресурсов характеристики и местоположение (ы)

средства.

Рекомендации? Интерпретации?

4b9b3361

Ответ 1

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19

Это просто ключ-значение с двоеточием.

ETag: "xyzzy"

Это может быть любой тип текстовых данных - я обычно включаю строку JSON с идентификатором созданного элемента. Простота тестирования сама по себе делает его целесообразным.

ETag: "{ id: 1234, uri: 'http://domain.com/comments/1234', type: 'comment' }"

В этом примере идентификатор, uri и тип созданного элемента являются "характеристиками и местоположением ресурсов".

Ответ 2

Я думаю, atompub REST API - отличный пример спокойной службы. См. Фрагмент ниже из спецификации atompub:

POST /edit/ HTTP/1.1
Host: example.org
User-Agent: Thingio/1.0
Authorization: Basic ZGFmZnk6c2VjZXJldA==
Content-Type: application/atom+xml;type=entry
Content-Length: nnn
Slug: First Post

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
</entry>

Сервер сигнализирует об успешном создании с кодом состояния 201. Ответ включает в себя заголовок местоположения, указывающий URI-член ввода-записи Atom, и представление этой записи в теле ответа.

HTTP/1.1 201 Created
Date: Fri, 7 Oct 2005 17:17:11 GMT
Content-Length: nnn
Content-Type: application/atom+xml;type=entry;charset="utf-8"
Location: http://example.org/edit/first-post.atom
ETag: "c180de84f991g8"  

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
  <link rel="edit"
      href="http://example.org/edit/first-post.atom"/>
</entry>

Ввод, созданный и возвращенный сборкой, может не соответствовать записи, отправленной клиентом. Сервер МОЖЕТ изменить значения различных элементов в записи, такие как значения atom: id, atom: updated и atom: author, и МОЖЕТЕ выбрать удаление или добавление других элементов и атрибутов или изменение содержимого элемента и значений атрибутов.

Ответ 3

Идея состоит в том, что тело ответа дает вам страницу, которая связывает вас с вещью:

201 Создан

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

Это означает, что вы должны включить Location в заголовок ответа, который дает URL-адрес, где вы можете найти вновь созданную вещь:

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597

Тело реакции

Затем они далее упоминают, что вы должны включить в тело ответа:

Ответная полезная нагрузка 201 обычно описывает и ссылается на созданный ресурс.

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

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: text/html

Your answer has been saved! 
Click <A href="/a/36373586/12597">here</A> to view it.

Если страница будет использоваться только роботом, имеет смысл получить ответ на компьютер:

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/xml

<createdResources>
   <questionID>1860645</questionID>
   <answerID>36373586</answerID>
   <primary>/a/36373586/12597</primary>
   <additional>
      <resource>http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586</resource>
      <resource>http://stackoverflow.com/a/1962757/12597</resource>
   </additional>
</createdResource>

Или, если вы предпочитаете:

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/json

{ 
   "questionID": 1860645, 
   "answerID": 36373586,
   "primary": "/a/36373586/12597",
   "additional": [
      "http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586",
      "http://stackoverflow.com/a/36373586/12597"
   ]
}

Ответ полностью зависит от вас; это произвольно, что бы вы хотели.

Кэш-код

Наконец, есть оптимизация, которую я могу предварительно кэшировать созданный ресурс (потому что у меня уже есть контент, я просто загрузил его). Сервер может вернуть дату или ETag, которые я могу сохранить, только что загруженный контент:

См. Раздел 7.2 для обсуждения смысла и цели полей заголовка валидатора, таких как ETag и Last-Modified, в ответе 201.

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/23704283/12597
Content-Type: text/html
ETag: JF2CA53BOMQGU5LTOQQGC3RAMV4GC3LQNRSS4
Last-Modified: Sat, 02 Apr 2016 12:22:39 GMT 

Your answer has been saved! 
Click <A href="/a/36373586/12597">here</A> to view it.

И ETag - это чисто произвольные значения. Если они меняются, когда меняется ресурс (и кеши должны быть обновлены), все это имеет значение. ETag обычно является хешем (например, SHA2). Но это может быть база данных rowversion или инкрементный номер ревизии. Все, что изменится, когда вещь изменится.

Ответ 4

Проверьте HTTP: Определения метода: POST.

Действие, выполняемое методом POST, может не привести к ресурсу, который может быть идентифицирован с помощью URI. В этом случае либо 200 (OK), либо 204 (No Content) - это соответствующий статус ответа, в зависимости от того, включает ли ответ объект, который описывает результат.

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

Ответ 5

В нескольких словах:

  • 200, когда объект создается и возвращается
  • 201, когда объект создан, но возвращается только его ссылка (например, идентификатор или ссылка)

Ответ 6

Вывод фактически зависит от запрашиваемого типа контента. Однако, как минимум, вы должны поместить ресурс, созданный в Location. Как и шаблон Post-Redirect-Get.

В моем случае я оставляю его пустым, пока не потребует иного. Так как это поведение JAX-RS при использовании Response.created().

Однако обратите внимание, что браузеры и фреймворки, такие как Angular, не следуют 201 автоматически. Я отметил поведение в http://www.trajano.net/2013/05/201-created-with-angular-resource/

Ответ 7

Еще один ответ, который я хотел бы сделать для этого, - это принять прагматичный подход и упростить договор REST API. В моем случае я реорганизовал свой REST API, чтобы сделать что-то более проверяемым, не прибегая к JavaScript или XHR, просто к формам и ссылкам HTML.

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

Одно замечание: в моем реорганизованном контракте API ответы POST не должны содержать кэшируемых данных, поскольку POST не являются кэшируемыми, поэтому ограничивайте их идентификаторами, которые можно запросить и кэшировать с помощью запроса GET.