При работе над API-интерфейсом REST (json) я столкнулся с ситуацией, когда у нас есть представление ресурса user
, где Я хотел предотвратить, чтобы поле (email
) было переопределено в пределах PUT
. Если я правильно понимаю, тогда PUT должен содержать полное представление ресурса для замены старого.Разрешено ли использовать код состояния 409, чтобы предотвратить обновление некоторых полей в запросе HTTP PUT.
Так, например, при извлечении пользователя из API (некоторые заголовки опущены для простоты):
> GET /user/123 HTTP/1.1
> Host: example.com
> Authorization: Bearer XXXXX
> Accept: application/json
< HTTP/1.1 200 OK
< Content-Type: application/json
<
< { "name": "John Smiht"
< , "email": "[email protected]"
< }
И вы хотите, чтобы исправить опечатку в имени Джон Smiths, вы могли бы сделать:
> PUT /user/123 HTTP/1.1
> Host: example.com
> Content-Type: application/json
>
> { "name": "John Smith"
> , "email": "[email protected]"
> }
< HTTP/1.1 201 No Content
Теперь, если кто-то поставить другой адрес электронной почты, могу ли я использовать 409, чтобы указать запрос не был обработан?
> PUT /user/123 HTTP/1.1
> Host: example.com
> Content-Type: application/json
>
> { "name": "John Smith"
> , "email": "[email protected]"
> }
< HTTP/1.1 409 Conflict
< Content-Type: application/json
<
< { "errorNumber": "XXX"
< , "errorMessage": "Not allowed to change e-mail address this way"
< }
Согласно https://tools.ietf.org/html/rfc2616
- 400 Bad Request указывает некорректный синтаксис (что это не так)
- 403 Forbidden можно было бы использовать, но мне кажется, что это больше о доступе к весь ресурс, а не его часть
- A 409 Conflict, по-видимому, связано с технической причиной того, что он не может выполнить запрос, а не о том, чтобы иметь какие-либо привилегии.
Итак, мой вопрос: какой код состояния следует использовать?
Редактировать: в свете принятого ответа; ответ станет
> PUT /user/123 HTTP/1.1
> Host: example.com
> Content-Type: application/json
>
> { "name": "John Smith"
> , "email": "[email protected]"
> }
< HTTP/1.1 403 Forbidden
< Content-Type: application/json
<
< { "errorNumber": "XXX"
< , "errorMessage": "Not allowed to change e-mail address this way"
< }
Правильно, я думаю, что согласен с вашими рассуждениями. Принимая это как ответ :-) – mhogerheijde