Идея состоит в том, что тело ответа дает вам страницу, которая связывает вас с этим:
201 Создано
Код состояния 201 (Создан) указывает, что запрос был выполнен и привел к созданию одного или нескольких новых ресурсов. Первичный ресурс, созданный запросом, идентифицируется либо полем заголовка Location в ответе, либо, если поле Location не получено, действующим 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="https://stackoverflow.com/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="https://stackoverflow.com/a/36373586/12597">here</A> to view it.
И ETag
s - чисто произвольные значения. Главное, чтобы они были разными при изменении ресурса (и необходимости обновления кешей). ETag обычно представляет собой хэш (например, SHA2). Но это может быть база данных rowversion
или увеличивающийся номер ревизии. Все, что изменится, когда что- то изменится.
Я думаю, что REST API-интерфейс atompub - отличный пример спокойного сервиса. См. Нижеприведенный фрагмент из спецификации atompub:
Сервер сигнализирует об успешном создании с кодом состояния 201. Ответ включает в себя заголовок Location, указывающий URI записи члена записи Atom, и представление этой записи в теле ответа.
Запись, созданная и возвращенная коллекцией, может не соответствовать записи, отправленной клиентом. Сервер МОЖЕТ изменить значения различных элементов в записи, таких как значения atom: id, atom: updated и atom: author, и МОЖЕТ выбрать удаление или добавление других элементов и атрибутов или изменение содержимого элемента и значений атрибутов.
источник
В нескольких словах:
источник
Ознакомьтесь с HTTP: Определения методов: POST .
источник
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19
Это просто пара "ключ-значение", разделенная двоеточиями.
ETag: "xyzzy"
Это могут быть текстовые данные любого типа - я обычно включаю строку JSON с идентификатором созданного элемента. Сама по себе простота тестирования делает его целесообразным.
В этом примере идентификатор, uri и тип созданного элемента являются «характеристиками ресурса и местоположением».
источник
Вывод фактически зависит от запрашиваемого типа содержимого. Однако, как минимум, вы должны поместить созданный ресурс в Location. Точно так же, как шаблон Post-Redirect-Get.
В моем случае я оставляю это поле пустым, пока не будет запрошено иное. Поскольку это поведение JAX-RS при использовании Response.created ().
Однако просто обратите внимание, что браузеры и фреймворки, такие как Angular, не следуют 201 автоматически. Я заметил поведение в http://www.trajano.net/2013/05/201-created-with-angular-resource/
источник
Другой ответ, который я хотел бы получить, - это использовать прагматический подход и упростить ваш контракт REST API . В моем случае я реорганизовал свой REST API, чтобы сделать его более тестируемым, не прибегая к JavaScript или XHR, просто к простым HTML-формам и ссылкам.
Чтобы быть более конкретным по вашему вопросу выше, я бы просто использовал код возврата
200
и возвращенное сообщение содержало сообщение JSON, которое ваше приложение может понять. В зависимости от ваших потребностей может потребоваться идентификатор вновь созданного объекта, чтобы веб-приложение могло получить данные в другом вызове.Одно замечание: в моем отредактированном контракте API ответы POST не должны содержать никаких кешируемых данных, поскольку POST на самом деле не кэшируются, поэтому ограничьте его идентификаторами, которые можно запросить и кэшировать с помощью запроса GET.
источник