Код статуса HTTP для обновления и удаления?


1375

Какой код статуса я должен установить для UPDATE( PUT) и DELETE(например, продукт успешно обновлен)?

Ответы:


2104

Для запроса PUT : HTTP 200 или HTTP 204 должны означать «ресурс обновлен успешно».

Для запроса DELETE : HTTP 200 или HTTP 204 должны означать «ресурс успешно удален». HTTP 202 также может быть возвращен, что будет означать, что инструкция была принята сервером и «ресурс был помечен для удаления».

ПОЛОЖИЛ

Если существующий ресурс изменен, то должны быть отправлены либо коды ответа 200 (ОК), либо 204 (Нет содержимого)>, чтобы указать успешное завершение запроса.

УДАЛЯТЬ

Успешный ответ ДОЛЖЕН быть 200 (ОК), если ответ включает в себя объект, описывающий состояние, 202 (Принят), если действие еще не было выполнено, или 204 (Нет содержимого), если действие было выполнено, но ответ не включает сущность.

Источник: W3.org: HTTP / 1.1 Определения методов

HTTP 200 OK: стандартный ответ для успешных запросов HTTP. Фактический ответ будет зависеть от используемого метода запроса.

HTTP 204 Нет содержимого: сервер успешно обработал запрос, но не возвращает никакого содержимого

Источник: список кодов состояния HTTP: 2xx Success


40
Очень полезный пост! Однако мне интересно, каким должен быть код состояния HTTP, если запрос, отправленный клиентом, действителен (DELETE mySite / entity / 123 ), а сущность для удаления не существует.
— Мартин

64
@Martin: В этом случае служба должна возвращать HTTP 404. Строго говоря, DELETE или запрос GET для ресурса , который не существует в не «действительный» запрос - то есть. клиент не должен повторять этот запрос, потому что он никогда не будет успешным ... Протокол HTTP определяет 2 категории проблем: проблемы с кодом состояния 4xx, когда клиент должен изменить запрос перед повторной попыткой, и проблемы со статусом 5xx код, который указывает, что служба столкнулась с проблемой, и клиент должен / может повторить тот же самый точный запрос, не меняя его.
— Даниэль Вассалло

17
@JeffMartin Это может быть так с точки зрения пользователя, но что касается сервера, если ресурс не существует, сервер должен вернуть 404.
— Randolpho

17
@Randolpho, Idempotence - это все о получении одного и того же результата, независимо от того, вызываете ли вы операцию один или несколько раз. Клиент просит вас убедиться, что ресурс удален. Какая выгода от возвращения 404? Почему это нужно знать в любом случае? Теперь клиентская логика должна обрабатывать два отдельных кода ответа вместо одного.
— Гили

26
@Gili: возможно, вики объяснит лучше: методы PUT и DELETE определены как идемпотентные ... обратите внимание, что идемпотентность относится к состоянию системы после выполнения запроса, поэтому во время действия, выполняемого сервером (например, удаление записи ) или код ответа, который он возвращает, может отличаться при последующих запросах, состояние системы будет одинаковым каждый раз.
— Рандольфо

859

Краткий ответ: для PUT и DELETE вы должны отправить либо 200 (OK), либо 204 (No Content).

Длинный ответ: вот полная схема решения (нажмите, чтобы увеличить).

Схема принятия решения HTTP 1.1

Источник: https://github.com/for-GET/http-decision-diagram


37
Диаграмма потрясающая. Существует ли версия для печати с более высоким разрешением?
— КиКи

1
В контексте POST существующего ресурса, другое обсуждение SO ( stackoverflow.com/questions/3825990/… ) предлагает отправить 409 Conflict или 302 Found вместо добавления контента.
— Коппор

7
Мне любопытно, если ответ 204 и 200 после удаления должен быть обратным, и если они верны, как есть, почему? Удаляется? -> Ответ включает в себя сущность? -> да -> 204 Нет контента; нет -> 200 OK
— Matth

62
Обновленная версия изображения находится здесь: raw.github.com/for-GET/http-decision-diagram/master/httpdd.png
— zaius

19
Отсутствует патч.
— дореми

151

Вот несколько советов:

УДАЛЯТЬ

  • 200 (если вы хотите отправить некоторые дополнительные данные в ответе) или 204 (рекомендуется).

  • 202 Операция удалена, еще не было совершено.

  • Если нечего удалять, используйте 204 или 404 (операция УДАЛИТЬ идемпотентна, удаление уже удаленного элемента - операция успешна , поэтому вы можете вернуть 204 , но это правда, что идемпотент не обязательно подразумевает тот же ответ)

Другие ошибки:

  • 400 Bad Request (неправильный синтаксис или неверный запрос странный, но возможный).
  • 401 Ошибка неавторизованной аутентификации
  • 403 Запрещено : ошибка авторизации или неверный идентификатор приложения.
  • 405 Не разрешено . Конечно.
  • 409 Конфликт ресурсов возможен в сложных системах.
  • И 501 , 502 в случае ошибок.

ПОЛОЖИЛ

Если вы обновляете элемент коллекции

  • 200/204 по тем же причинам, что и УДАЛИТЬ выше.
  • 202, если операция еще не была совершена.

Указанный элемент не существует:

  • PUT может быть 201 (если вы создали элемент, потому что это ваше поведение)
  • 404 Если вы не хотите создавать элементы через PUT.

  • 400 Bad Request (неправильный синтаксис или неправильный запрос, более распространенный, чем в случае DELETE).

  • 401 Несанкционированный
  • 403 Запрещено : ошибка аутентификации или неверный идентификатор приложения.
  • 405 Не разрешено . Конечно.
  • 409 Конфликт ресурсов возможен в сложных системах, например, в DELETE.
  • 422 Непроцессируемый объект Помогает различить «неверный запрос» (например, неверный XML / JSON) и недопустимые значения полей
  • И 501 , 502 в случае ошибок.

7
Этот ответ почти целиком состоит из двух больших цитат, но авторства здесь нет. Откуда вы цитируете?
— Квентин

Является ли 204 правильным статусом для возврата для запроса PUT, если состояние не изменяется эффективно? Например, вы просите деактивировать пользователя, но он уже неактивен.
— Ε Г И І И О

Запрос PUT идемпотентен, поэтому вы можете вернуть 204, потому что объект изменился в системе. PUT - это не PATCH, поэтому вы не уверены, какое поле вы хотите изменить. Вы можете отправить обратно 501 - 502, если ваш дизайн должен знать, был ли объект точно таким же, как объект в запросе, но ... мне это не очень нравится .. Я предпочитаю 204 или, если вы хотите деактивировать пользователя, не меняя больше полей, возможно, вы можете использовать PATCH.
— Альфонсо Тиенда

1
Я бы добавил HTTP 422 Unprocessable Entity. Это помогает различать «неверный запрос» (например, некорректный XML / JSON) и недопустимые значения полей.
— vdboor


10

В дополнение к 200 и 204, 205 (Reset Content) может быть действительным ответом.

Сервер выполнил запрос, и пользовательскому агенту СЛЕДУЕТ сбросить представление документа, из-за которого был отправлен запрос ... [например] очистка формы, в которой вводятся данные.


6

Поскольку возникает вопрос, должен ли DELETE возвращать 200 против 204, стоит учесть, что некоторые люди рекомендуют возвращать объект со ссылками, поэтому предпочтение отдается 200 .

«Вместо того, чтобы возвращать 204 (без содержимого), API должен быть полезным и предлагать места, куда можно пойти. В этом примере я думаю, что одна очевидная ссылка, которую нужно предоставить, - это« куда-то.com/container/ »(минус« ресурс ») - контейнер, из которого клиент только что удалил ресурс. Возможно, клиент захочет удалить больше ресурсов, так что это будет полезной ссылкой ».

http://blog.ploeh.dk/2013/04/30/rest-lesson-learned-avoid-204-responses/

Если клиент встречает ответ 204, он может либо сдаться, либо перейти к точке входа API, либо вернуться к предыдущему ресурсу, который он посетил. Ни один из вариантов не особенно хорош.

Лично я бы не сказал, что 204 неправильно (как и автор, он говорит «раздражает»), потому что хорошее кэширование на стороне клиента имеет много преимуществ. Лучше всего быть последовательным в любом случае.


6

Вот код состояния, который вы должны знать для своих знаний.

1XX Информационные ответы

  • 100 Продолжить
  • 101 протокол переключения
  • 102 Обработка
  • 103 ранних намеков

2XX Успех

  • 200 ОК
  • 201 Создано
  • 202 Принято
  • 203 Неофициальная информация
  • 204 Нет содержимого
  • 205 Сбросить содержимое
  • 206 Частичное содержание
  • 207 мульти-статус
  • 208 уже сообщили
  • 226 IM Используется

3XX Redirection

  • 300 множественных вариантов
  • 301 перемещено навсегда
  • 302 найдено
  • 303 См. Другое
  • 304 Не модифицировано
  • 305 Использовать прокси
  • 306 Switch Proxy
  • 307 Временный редирект
  • 308 постоянный редирект

Ошибки клиента 4XX

  • 400 плохих запросов
  • 401 Несанкционированный
  • 402 Требуется оплата
  • 403 Запрещено
  • 404 не найден
  • 405 метод не разрешен
  • 406 неприемлемо
  • 407 Proxy Authentication Required
  • 408 Время ожидания запроса
  • 409 конфликт
  • 410 ушел
  • 411 длина требуется
  • 412 Не выполнено предварительное условие
  • 413 Слишком большая нагрузка
  • 414 URI слишком длинный
  • 415 неподдерживаемый тип носителя
  • 416 Неудовлетворительный диапазон
  • 417 Ожидание не удалось
  • 418 я чайник
  • 420 Ошибка метода
  • 421 неправильный запрос
  • 422 необработанного объекта
  • 423 заблокирован
  • 424 Неудачная зависимость
  • 426 Требуется обновление
  • 428 Требуется предварительное условие
  • 429 слишком много запросов
  • 431 слишком большие поля заголовка запроса
  • 451 недоступен по юридическим причинам

5XX Ошибки сервера

  • 500 Внутренняя ошибка сервера
  • 501 не реализовано
  • 502 Bad Gateway
  • 503 Сервис недоступен
  • Тайм-аут шлюза 504
  • Http-версия 505 не поддерживается
  • 506 Varient Также ведутся переговоры
  • 507 Недостаточно памяти
  • 508 петля обнаружена
  • 510 не продлен
  • 511 Требуется сетевая аутентификация

3

В июне 2014 RFC7231 устарел RFC2616 . Если вы выполняете REST через HTTP, тогда RFC7231 точно описывает поведение, ожидаемое от GET, PUT, POST и DELETE.


-1

Когда ресурс изменяется, код ответа должен быть 200 («ОК») . Если состояние ресурса изменяется таким образом, что URI изменяется на ресурс (например, учетная запись пользователя переименовывается), код ответа - 301 («Перемещено постоянно»), а заголовок Location должен предоставлять новый URI.

Когда объект удаляется, код ответа должен быть 200 («ОК»).

Перейдите по ссылке ниже для получения более подробной информации - код состояния для отдыха

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.