Часть нашего RESTful API позволит пользователям регистрировать элемент с серийным номером. Поскольку серийный номер не уникален глобально, он не может использоваться как идентификатор ресурса, поэтому мы будем использовать POST для родительского ресурса, который будет генерировать идентификатор, например.Реагирование на идемпотентный запрос HTTP POST
POST /my/items
<item serial-number="ABCDEF" />
В случае если элемент еще не зарегистрирован, семантика HTTP четко определена. Мы возвращаем заголовок Location и зарегистрированный элемент как тело объекта, например.
HTTP 201 Created
Location: /my/items/1234
<item id="1234" serial-number="ABCDEF" />
Однако, в том случае, когда элемент уже зарегистрирован, то API должен быть идемпотентным и вернуть ранее зарегистрированный элемент, не создавая новый. Я полагаю, что он должен вернуть код состояния 200 OK и использовать заголовок Content-Location, чтобы указать, откуда пришел элемент, например.
HTTP 200 OK
Content-Location: /my/items/1234
<item id="1234" serial-number="ABCDEF" />
Было ли это разумным? Я не совсем понимаю, подходит ли Location или Content-Location во втором случае.
Хм, да, на самом деле мне это нравится. Хотя серийные номера не могут быть глобально уникальными, существует почти 100% вероятность того, что они будут уникальными в рамках пользователя, поэтому он может действовать как уникальный идентификатор с областью. Это также решит мою проблему о том, как устройство может проверить, уже ли оно зарегистрировано, используя GET на этом URL-адресе и проверяя, является ли ответ 200 или 404. Спасибо! –