Ответ на идемпотентный запрос HTTP POST

Часть нашего RESTful API позволит пользователям регистрировать элемент с серийным номером. Поскольку серийный номер не уникален глобально, он не может использоваться как идентификатор ресурса, поэтому мы будем использовать POST для родительского ресурса, который будет генерировать идентификатор, например.

POST /my/items

В случае, когда элемент еще не зарегистрирован, семантика HTTP определена корректно. Мы возвращаем заголовок Location и зарегистрированный элемент как тело объекта, например.

HTTP 201 Created
Location: /my/items/1234

Однако в случае, когда элемент уже зарегистрирован, API должен быть идемпотентным и вернуть ранее зарегистрированный элемент без создания нового. Мое лучшее предположение состоит в том, что он должен затем вернуть код состояния 200 OK и использовать заголовок Content-Location, чтобы указать, откуда пришел элемент, например

HTTP 200 OK
Content-Location: /my/items/1234

Казалось бы, это разумно? Я не совсем понимаю, подходит ли Location или Content-Location во втором случае.

2 ответа

У меня было подобное требование в последнее время. Для идемпотентных операций PUT - лучший способ. Вы правы, существует несоответствие между внешним и внутренним. Я решил это, создав выделенный ресурс для цели внешнего идентификатора:

PUT /api-user/{username}/items/{serialNumber}

Внутренне я разрешаю его как CREATE, если у меня нет элемента для 'username' и 'ABCDEF' серийного номера или UPDATE в случае, если я это делаю.

В случае, если это CREATE, я возвращаю 201 для UPDATE 200. Кроме того, возвращаемая полезная нагрузка содержит как идентификатор homegrown, так и внешний серийный номер, как вы указали в своей полезной нагрузке.


Здесь интересная дискуссия об использовании двух заголовков. Он утверждает, что Content-Location не определен для PUT или POST, поэтому расположение, возможно, является лучшим вариантом в вашем случае. Это, конечно, не четкое сокращение, которое лучше, хотя.

В целом я думаю, что ваш подход имеет смысл, хотя.

licensed under cc by-sa 3.0 with attribution.