Представьте себе конечную точку HTTP REST, ...
По словам самого Филдинга
Конечная точка REST не существует. Ресурсы есть. Счетно бесконечный набор ресурсов, связанных только ограничениями на длину URL. ( Источник )
Так что технически это идемпотент, который обычно склоняется к PUT или PATCH ...
Идемпотентность - это важное свойство для клиента в отношении временных сетевых проблем, которое позволяет ему автоматически повторно отправить запрос в случае, если он не получил ответа в течение разумного периода времени. В таком случае клиент не знает, получил ли сервер первоначальный запрос или просто потерял ответ. Идемпотентность не имеет ничего общего с вашим требованием разрешить запись в ресурс только один раз. Кроме того, PATCH
по умолчанию не идемпотентен. Идемпотент просто означает, что обработка запроса всегда приводит к одному и тому же результату, независимо от того, сколько раз вы отправляете этот запрос на сервер.
Каждое отдельное сообщение идентифицируется уникальным идентификатором, например значением GUID некоторого вида
... каждое отдельное сообщение должно быть однозначно идентифицировано его полем идентификатора, и что если другое сообщение отправлено с тем же идентификатором, оно просто считается дубликатом.
Ресурс всегда однозначно идентифицируется через его URI, поскольку сам URI может ссылаться только на один единственный ресурс. Однако один ресурс может иметь несколько URI, т. Е. Один с другим без доступных параметров запроса. URI - это сокращение от унифицированного идентификатора ресурса , где uniform означает , остающееся неизменным во всех случаях и всегда . Это делает требование для поля id , на мой взгляд, избыточным.
Насколько я понял ваш вопрос, фактический текст сообщения не определяет, является ли сообщение дубликатом или нет . Итак, в основном
PUT /messages/eaff31bd-5291-4287-a7dd-fbe5b1e47b67 HTTP/1.1
Host: www.acme.com
Content-Type: application/json; charset="utf-8"
...
{
"text": "original text"
}
и
PUT /messages/eb1db214-d231-4a50-916c-8de2d64c7d3a HTTP/1.1
Host: www.acme.com
Content-Type: application/json; charset="utf-8"
...
{
"text": "original text"
}
- это запросы для двух разных сообщений, поскольку они нацелены на разные ресурсы, в то время как вы не хотите разрешать что-то вроде
PUT /messages/eaff31bd-5291-4287-a7dd-fbe5b1e47b67 HTTP/1.1
Host: www.acme.com
Content-Type: application/json; charset="utf-8"
...
{
"text": "amended text"
}
, так как это обновит существующее сообщение.
В таком случае я бы полностью отключил PUT
для сообщений, не поддерживая его, но разрешив создание новых сообщений только через POST
. Пример запроса / ответа может выглядеть так:
POST /messages HTTP/1.1
Host: www.acme.com
Content-Type: application/json; charset="utf-8"
Accept: application/json
...
{
"text": "Some other text"
}
, что может дать ответ, например:
HTTP/1.1 201 Created
Content-Type: application/json; charset="utf-8"
Location: http://www.acme.com/messages/740177d2-1de9-41bd-bd5b-6a52f39bf227
Etag: 33a64df551425fcc55e4d42a148795d9f25f89d4
{
"text": "some other text"
}
Попытка обновить такой ресурс через
PUT /messages/740177d2-1de9-41bd-bd5b-6a52f39bf227 HTTP/1.1
Host: www.acme.com
Content-Type: application/json; charset="utf-8"
Etag: 33a64df551425fcc55e4d42a148795d9f25f89d4
{
"text": "updated text"
}
должен привести к ответу
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD
, в котором говорится, что сервер знает указанную операцию PUT, но не поддерживает эту операцию на целевом ресурсе . Обязательный заголовок Allow
, кроме того, сообщает вашему клиенту о допустимых HTTP-операциях, поддерживаемых этим ресурсом.
Для целей этого вопроса предположим, что используемый маршрут всегда имеет форму / ... / message, а не в форме /.../message/{id}. В этом случае мне интересно, означает ли автоматическое ограничение схемы маршрута /.../message POST.
В таком случае PUT
не подходит для вас, если только этот запрос содержит все сообщения, которые должны быть доступны после обработки запроса. Семантика PUT определяется как замена текущего представления, хранящегося в целевом ресурсе, на представление, предоставленное в полезных данных запроса. Итак, если вы отправляете запрос PUT на «ресурс сбора», вы технически заменяете все сообщения, доступные в настоящее время, на те, которые определены в запросе.