2015-08-17 2 views
2

Что касается хорошего дизайна REST API, то стоит ли возвращать id из вновь созданного ресурса? Скажем, у меня есть API:REST API: возврат нового идентификатора ресурса?

api/resource POST 

Я видел некоторые гуру, который имеет такое API для возврата пустой JSON и вставить URI в с Location заголовком в ответ. Я думаю, что возвращение

{ 'id': '1000' } 

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

+3

При успешном создании нового ресурса вы должны вернуть ответ кода состояния «201 Created», который включает в себя заголовок «Местоположение», указывающий на URI, где новый ресурс можно найти - по крайней мере, это общий подход. Просто включение идентификатора ресурса в ответе не является RESTful, поскольку это заставляет клиента иметь некоторую логику о сервере и его структуре. Подобно веб-ресурсам, вы хотите сохранить только один URI - точку входа. Все другие ссылки получаются через обмен сообщениями/ответами –

+0

Не должен ли этот комментарий быть поднят до фактического ответа? – morsor

+0

@ RomanVottner не знает, какой возвращаемый идентификатор ресурса или весь новый ресурс имеет общее с * логикой о сервере и инфраструктуре *? Не могли бы вы прояснить? – Opal

ответ

3

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

Общий метод создания новых ресурсов по HTTP POST - это возврат кода состояния 201 Created. Следовательно, ответ должен содержать текущее состояние ресурса как тело субъекта и заголовок местоположения, указывающий на URI, что ресурс может быть найден. Не делать этого, может сломать некоторых клиентов и предотвратить их правильное взаимодействие с сервисом. Клиентами могут быть браузеры, индивидуальные приложения languageOfYourChoice или даже другие сервисы.

В идеальном мире RESTful клиент знает только об одном единственном URI, чтобы начать (например, входной URI службы, например, http://service.company.com/). Ответ вызова этого URI должен вернуть документ, который может быть понят клиентом, и содержит дополнительные ссылки, которые клиент может использовать, если они заинтересованы. Эта концепция похожа на HTML-файл большого брата и аналогичные веб-ресурсы, используемые людьми каждый день, когда ссылки могут использоваться для перехода от начальной страницы к подстраницам или даже к внешним ресурсам или другим ресурсам гиперссылок. REST - это просто абстракция и обобщение веб-вещи.

Несмотря на то, что этот вопрос не является частью фактического вопроса, и это скорее основано на мнениях, между RESTful devolopers обсуждается полезность общих и специализированных типов документов (типы mime, ...). Я думаю, что должен быть стандартизованный общий формат REST для JSON, XML, ... Просто просто application/json недостаточно, так как это не определяет, как должны включаться ссылки и схемы. Даже HAL недостаточно описателен (IMO) относительно исполняемых действий в URI и каких форматах документов ожидать при вызове этих URI и какие аргументы необходимо передать службе.

Форматы документов (типы носителей a.k.a) являются одной из основных концепций акронима Roy Fieldings HATEOAS. Клиентам не нужны никакие предварительные знания, отличные от точки входа, и типы медиа, понятные клиентам (таким образом, предыдущий абзац). Все возможные действия описываются с помощью спецификации протокола HTTP и понимания того, что выражают соответствующие типы носителей.

Поэтому, возвращая URI вместо идентификатора имеет несколько преимуществ:

  • URIs сам по себе уникальным, разным производителям, хотя могут иметь одинаковые идентификаторы
  • Клиент не нуждается знаний о том, как сервер создавая эти URI, сервер, с другой стороны, может предоставить их почти бесплатно. Возврат идентификатора продукта 1234 имеет почти мгновенные способы объединения в URI клиентом - поэтому клиенту необходимы специальные знания о том, как создать URI, чтобы сервер действительно мог правильно обработать запрос.
  • Сервер может перемещать ресурсы без необходимости изменения клиентов, поскольку клиенты (в идеальном мире RESTful) будут получать URI ресурса в ответ на дополнительный запрос. Поэтому клиенту требуется только семантическое знание того, что возвращаемое поле «означает»
Смежные вопросы