Мне было интересно, что люди думают об PUT
операции RESTful, которая ничего не возвращает (ноль) в теле ответа.
Мне было интересно, что люди думают об PUT
операции RESTful, которая ничего не возвращает (ноль) в теле ответа.
Ответы:
Спецификация HTTP ( RFC 2616 ) имеет ряд рекомендаций, которые применимы. Вот моя интерпретация:
200 OK
для успешного PUT обновления существующего ресурса. Тело ответа не требуется. (Согласно Разделу 9.6 , 204 No Content
это даже более уместно.)201 Created
для успешного PUT нового ресурса с наиболее конкретным URI для нового ресурса, возвращенного в поле заголовка Location, и любые другие соответствующие URI и метаданные ресурса, отраженные в теле ответа. ( RFC 2616, раздел 10.2.2 )409 Conflict
для PUT, который не выполнен из-за модификации 3- й стороны, со списком различий между попыткой обновления и текущим ресурсом в теле ответа. ( RFC 2616, раздел 10.4.10 )400 Bad Request
для неудачного PUT, с текстом на естественном языке (например, на английском) в теле ответа, который объясняет причину сбоя PUT. ( RFC 2616, раздел 10.4 )No response body needed
по отношению к 200. Фактически тело ответа вообще не упоминается по отношению к PUT. Это только заявляетIf an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to indicate successful completion of the request.
В отличие от большинства ответов здесь, я на самом деле думаю, что PUT должен возвращать обновленный ресурс (в дополнение к HTTP-коду, конечно).
Причина, по которой вы хотите вернуть ресурс в качестве ответа для операции PUT, заключается в том, что когда вы отправляете представление ресурса на сервер, сервер также может применить некоторую обработку к этому ресурсу, поэтому клиент хотел бы знать, как работает этот ресурс. выглядеть после того, как запрос успешно завершен. (в противном случае он должен будет выполнить еще один запрос GET).
Я думаю, что сервер может вернуть содержимое в ответ на PUT. Если вы используете формат конверта ответа, который учитывает загруженные данные (например, формат, используемый данными ember), то вы также можете включить другие объекты, которые могли быть изменены с помощью триггеров базы данных и т. Д. (Загруженные данные явно уменьшают Количество запросов, и это кажется хорошим местом для оптимизации.)
Если я просто принимаю PUT и мне нечего сообщить, я использую код состояния 204 без тела. Если мне есть что сообщить, я использую код состояния 200 и включаю тело.
В спецификации HTTP / 1.1 (раздел 9.6) обсуждаются соответствующие коды ответа / ошибки. Однако это не относится к содержанию ответа.
Чего бы вы ожидали? Простой код ответа HTTP (200 и т. Д.) Кажется мне простым и недвусмысленным.
Если серверная часть REST API является реляционной базой данных SQL, то
Если вы не заботитесь о потерянных обновлениях или если вы хотите заставить своих клиентов делать GET сразу после PUT, то ничего не возвращайте из PUT.
Http код ответа 201 для «Создано» вместе с заголовком «Местоположение», чтобы указать, где клиент может найти вновь созданный ресурс.
Я использовал RESTful API в своих сервисах, и вот мое мнение: сначала мы должны прийти к общему мнению: PUT
используется для обновления ресурса, а не для создания или получения.
Я определил ресурсы с помощью: Stateless resource
и Stateful resource
:
Ресурсы без сохранения состояния Для этих ресурсов достаточно просто вернуть HttpCode с пустым телом, этого достаточно.
Ресурсы с отслеживанием состояния Например: версия ресурса. Для ресурсов такого типа вы должны указать версию, когда хотите ее изменить, поэтому верните полный ресурс или верните версию клиенту, чтобы клиенту не нужно было отправлять запрос на получение после действия обновления.
Но , для службы или системы, сохранить егоsimple
,clearly
,easy to use and maintain
это самое главное.
Подобно тому, как пустое тело запроса соответствует первоначальной цели запроса GET, так и пустое тело ответа соответствует первоначальной цели запроса PUT.
Кажется, все в порядке ... хотя я думаю, что элементарное указание успеха / неудачи / времени отправлено / # байт получено / и т.д. было бы предпочтительнее.
редактировать: я думал о целостности данных и / или ведении записей; метаданные, такие как хеш MD5 или метка времени для полученного времени, могут быть полезны для больших файлов данных.
В идеале это вернет ответ об успехе / неудаче.
Существует разница между заголовком и телом ответа HTTP. PUT никогда не должен возвращать тело, но должен возвращать код ответа в заголовке. Просто выберите 200, если это было успешно, и 4xx, если нет. Нет такого понятия, как нулевой код возврата. почему ты хочешь сделать это?
200
для PUT, DELETE или любого другого метода. Я что-то пропустил? Например, Мозилла становится боссом W3 и IETF? ;) А может, они просто никогда не слышали о принципе устойчивости Постеля.