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

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

12 ответов

Решение

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

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

9,6 ставок

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

9.7 УДАЛИТЬ

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

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

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

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

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

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

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

https://raw.githubusercontent.com/for-GET/http-decision-diagram/master/httpdd.png

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

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

УДАЛЯТЬ

  • 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 в случае ошибок.

RFC 2616 описывает, какие коды состояния использовать.

И нет, это не всегда 200.

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

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 прокси-аутентификация
  • 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 Требуется сетевая аутентификация

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

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

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

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

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

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

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

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

{
    "VALIDATON_ERROR": {
        "code": 512,
        "message": "Validation error"
    },
    "CONTINUE": {
        "code": 100,
        "message": "Continue"
    },
    "SWITCHING_PROTOCOLS": {
        "code": 101,
        "message": "Switching Protocols"
    },
    "PROCESSING": {
        "code": 102,
        "message": "Processing"
    },
    "OK": {
        "code": 200,
        "message": "OK"
    },
    "CREATED": {
        "code": 201,
        "message": "Created"
    },
    "ACCEPTED": {
        "code": 202,
        "message": "Accepted"
    },
    "NON_AUTHORITATIVE_INFORMATION": {
        "code": 203,
        "message": "Non Authoritative Information"
    },
    "NO_CONTENT": {
        "code": 204,
        "message": "No Content"
    },
    "RESET_CONTENT": {
        "code": 205,
        "message": "Reset Content"
    },
    "PARTIAL_CONTENT": {
        "code": 206,
        "message": "Partial Content"
    },
    "MULTI_STATUS": {
        "code": 207,
        "message": "Multi-Status"
    },
    "MULTIPLE_CHOICES": {
        "code": 300,
        "message": "Multiple Choices"
    },
    "MOVED_PERMANENTLY": {
        "code": 301,
        "message": "Moved Permanently"
    },
    "MOVED_TEMPORARILY": {
        "code": 302,
        "message": "Moved Temporarily"
    },
    "SEE_OTHER": {
        "code": 303,
        "message": "See Other"
    },
    "NOT_MODIFIED": {
        "code": 304,
        "message": "Not Modified"
    },
    "USE_PROXY": {
        "code": 305,
        "message": "Use Proxy"
    },
    "TEMPORARY_REDIRECT": {
        "code": 307,
        "message": "Temporary Redirect"
    },
    "PERMANENT_REDIRECT": {
        "code": 308,
        "message": "Permanent Redirect"
    },
    "BAD_REQUEST": {
        "code": 400,
        "message": "Bad Request"
    },
    "UNAUTHORIZED": {
        "code": 401,
        "message": "Unauthorized"
    },
    "PAYMENT_REQUIRED": {
        "code": 402,
        "message": "Payment Required"
    },
    "FORBIDDEN": {
        "code": 403,
        "message": "Forbidden"
    },
    "NOT_FOUND": {
        "code": 404,
        "message": "Not Found"
    },
    "METHOD_NOT_ALLOWED": {
        "code": 405,
        "message": "Method Not Allowed"
    },
    "NOT_ACCEPTABLE": {
        "code": 406,
        "message": "Not Acceptable"
    },
    "PROXY_AUTHENTICATION_REQUIRED": {
        "code": 407,
        "message": "Proxy Authentication Required"
    },
    "REQUEST_TIMEOUT": {
        "code": 408,
        "message": "Request Timeout"
    },
    "CONFLICT": {
        "code": 409,
        "message": "Conflict"
    },
    "GONE": {
        "code": 410,
        "message": "Gone"
    },
    "LENGTH_REQUIRED": {
        "code": 411,
        "message": "Length Required"
    },
    "PRECONDITION_FAILED": {
        "code": 412,
        "message": "Precondition Failed"
    },
    "REQUEST_TOO_LONG": {
        "code": 413,
        "message": "Request Entity Too Large"
    },
    "REQUEST_URI_TOO_LONG": {
        "code": 414,
        "message": "Request-URI Too Long"
    },
    "UNSUPPORTED_MEDIA_TYPE": {
        "code": 415,
        "message": "Unsupported Media Type"
    },
    "REQUESTED_RANGE_NOT_SATISFIABLE": {
        "code": 416,
        "message": "Requested Range Not Satisfiable"
    },
    "EXPECTATION_FAILED": {
        "code": 417,
        "message": "Expectation Failed"
    },
    "IM_A_TEAPOT": {
        "code": 418,
        "message": "I'm a teapot"
    },
    "INSUFFICIENT_SPACE_ON_RESOURCE": {
        "code": 419,
        "message": "Insufficient Space on Resource"
    },
    "METHOD_FAILURE": {
        "code": 420,
        "message": "Method Failure"
    },
    "UNPROCESSABLE_ENTITY": {
        "code": 422,
        "message": "Unprocessable Entity"
    },
    "LOCKED": {
        "code": 423,
        "message": "Locked"
    },
    "FAILED_DEPENDENCY": {
        "code": 424,
        "message": "Failed Dependency"
    },
    "PRECONDITION_REQUIRED": {
        "code": 428,
        "message": "Precondition Required"
    },
    "TOO_MANY_REQUESTS": {
        "code": 429,
        "message": "Too Many Requests"
    },
    "REQUEST_HEADER_FIELDS_TOO_LARGE": {
        "code": 431,
        "message": "Request Header Fields Too"
    },
    "UNAVAILABLE_FOR_LEGAL_REASONS": {
        "code": 451,
        "message": "Unavailable For Legal Reasons"
    },
    "INTERNAL_SERVER_ERROR": {
        "code": 500,
        "message": "Internal Server Error"
    },
    "NOT_IMPLEMENTED": {
        "code": 501,
        "message": "Not Implemented"
    },
    "BAD_GATEWAY": {
        "code": 502,
        "message": "Bad Gateway"
    },
    "SERVICE_UNAVAILABLE": {
        "code": 503,
        "message": "Service Unavailable"
    },
    "GATEWAY_TIMEOUT": {
        "code": 504,
        "message": "Gateway Timeout"
    },
    "HTTP_VERSION_NOT_SUPPORTED": {
        "code": 505,
        "message": "HTTP Version Not Supported"
    },
    "INSUFFICIENT_STORAGE": {
        "code": 507,
        "message": "Insufficient Storage"
    },
    "NETWORK_AUTHENTICATION_REQUIRED": {
        "code": 511,
        "message": "Network Authentication Required"
    }
}

Протокол передачи гипертекста (HTTP/1.1): семантика и контент

Кратко объяснил! Узнайте больше о кодах статуса

В общем, 200 OKа также 201 Createdлучше всего подходят для успешного PUTзапрос.

За DELETEметод, 202 Acceptedа также 204 No Contentбудет лучшим выбором.

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

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

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

Другие вопросы по тегам