Если операция RESTful «PUT» возвращает что-то

Мне было интересно, какие мнения людей относятся к операции RESTful PUT которая ничего не возвращает (null) в тело ответа.

Спецификация HTTP ( RFC 2616 ) содержит ряд рекомендаций, которые применимы. Вот моя интерпретация:

  • Код состояния HTTP 200 OK для успешного выполнения обновления существующего ресурса. Не требуется тело ответа. (В разделе 9.6 , 204 No Content еще более уместно.)
  • Код статуса HTTP 201 Created для успешного PUT нового ресурса, с самым конкретным URI для нового ресурса, возвращаемого в поле заголовка Location, и любых других соответствующих URI и метаданных ресурса, эхом в теле ответа. ( RFC 2616, раздел 10.2.2 )
  • Код состояния HTTP 409 Conflict для PUT, который не увенчался успехом из-за модификации 3- го партнера, со списком различий между попыткой обновления и текущим ресурсом в теле ответа. ( RFC 2616, раздел 10.4.10 )
  • Код состояния HTTP 400 Bad Request неудачного PUT с текстом на естественном языке (например, на английском языке) в теле ответа, который объясняет, почему PUT не удалось. ( RFC 2616, раздел 10.4 )

В отличие от большинства ответов здесь, я действительно думаю, что PUT должен вернуть обновленный ресурс (в дополнение к HTTP-коду, конечно).

Причина, по которой вы хотели бы вернуть ресурс в ответ на операцию PUT, заключается в том, что когда вы отправляете представление ресурса на сервер, сервер может также применить некоторую обработку к этому ресурсу, поэтому клиент хотел бы знать, как этот ресурс как после успешного завершения запроса. (в противном случае ему придется выдать другой запрос GET).

Код ответа Http 201 для «Создано» вместе с заголовком «Местоположение», чтобы указать, где клиент может найти вновь созданный ресурс.

Спецификация HTTP / 1.1 (раздел 9.6) обсуждает соответствующие коды ответов / ошибок. Однако он не учитывает контент ответа.

Что бы вы ожидали? Простой код ответа HTTP (200 и т. Д.) Кажется мне простым и однозначным.

Я думаю, что сервер может вернуть содержимое в ответ на PUT. Если вы используете формат конверта ответа, который позволяет загружать данные (например, формат, потребляемый данными ember-data), то вы можете также включать в себя другие объекты, которые могут быть изменены с помощью триггеров базы данных и т. Д. (Данные с боковой загрузкой явно сокращают # запросов, и это кажется прекрасным местом для оптимизации.)

Если я просто соглашусь с PUT и не буду сообщать об этом, я использую код статуса 204 без тела. Если мне нужно что-то сообщить, я использую код состояния 200 и включаю тело.

Я использовал RESTful API в своих сервисах, и вот мое мнение: сначала мы должны перейти к общему мнению: PUT используется для обновления ресурса, который не создается или не получается.

Я определил ресурсы с помощью ресурса Stateless resource Stateful resource :

  • Ресурсы без сохранения. Для этих ресурсов просто верните HttpCode с пустым телом, этого достаточно.

  • Учетные ресурсы Например: версия ресурса. Для такого рода ресурсов вы должны предоставить версию, когда хотите ее изменить, поэтому верните полный ресурс или верните версию клиенту, поэтому клиенту не нужно отправлять запрос на получение после действия обновления.

Но для службы или системы, держать ее simple , clearly , easy to use and maintain является самой важной вещью.

кажется, нормально … хотя я бы подумал, что рудиментарное указание на успех / неудачу / время отправлено / # байтов получено / и т. д. было бы предпочтительнее.

edit: Я думал о принципах целостности данных и / или ведении записей; метаданные, такие как hash MD5 или timestamp для полученного времени, могут быть полезны для больших файлов данных.

В идеале это вернет ответ успеха / неудачи.

Подобно тому, как пустое тело запроса соответствует исходной цели запроса GET, а пустой орган ответа соответствует исходной цели запроса PUT.

Существует разница между заголовком и телом ответа HTTP. PUT никогда не должен возвращать тело, но должен возвращать код ответа в заголовке. Просто выберите 200, если он был успешным, и 4xx, если нет. Нет такой вещи, как нулевой код возврата. почему ты хочешь сделать это?

Interesting Posts

Почему вектор :: ссылка не возвращает ссылку на bool?

Оказание другой формы с помощью ajax заставляет его состояние представления потеряться, как мне добавить это обратно?

AppDelegate, rootViewController и presentViewController

Как использовать UTF-8 в свойствах ресурсов с помощью ResourceBundle

Понимание значения термина и концепции – RAII (Инициализация ресурсов – Инициализация)

Как объявить глобальные переменные в Android?

Linux: Постоянно синхронизировать файлы, в одну сторону

Как загружать classы во время выполнения из папки или JAR?

Как измерить производительность диска под Windows?

Невозможно изменить Windows 8.1 полностью на английском языке

Объединение XML-документов

Запретить скрытие адресной строки в мобильных браузерах

Использование опций Java 8 с Stream :: flatMap

Программное обеспечение для будильника, которое может включить компьютер?

Как «записать» ISO / img / cue + bin на USB-накопитель?

Давайте будем гением компьютера.