Какой код статуса HTTP я должен вернуть для POST, если ресурс не создан? - PullRequest
4 голосов
/ 15 апреля 2019

Я отправляю изображение на свой сервер (используя Java и Spring).

Может произойти пара вещей:

  • Если все пойдет хорошо, я вернусь 200 и идентификатор изображения.
  • Изображение не может быть сохранено в файловой системе (SaveFileException).
  • База данных не может обновить новую запись изображения новым URL-адресом (DatabaseException).
  • Или выбросить IOException.

Короче говоря, я не могу сохранить / создать изображение.

Какой код HTTP я должен вернуть?

Должен ли я возвращать более одного кода и более одного сообщения в соответствии с Exception?

Ответы [ 4 ]

8 голосов
/ 15 апреля 2019

Прежде всего, позвольте мне подчеркнуть, что коды состояния предназначены для указания результата попытки сервера понять и удовлетворить запрос клиента.

Если все идет хорошо, тогда яreturn 200 и идентификатор изображения.

Кажется, все в порядке, но я бы посоветовал вам вернуть 201 вместе с заголовком Location,Цитируя RFC 7231 относительно метода POST:

Если на исходном сервере был создан один или несколько ресурсов в результате успешной обработки запроса POST,исходный сервер ДОЛЖЕН отправить ответ 201 (Создан), содержащий поле заголовка Location, которое предоставляет идентификатор для созданного первичного ресурса и представление, которое описывает состояние запроса при обращении к новому ресурсу (-ам).

Наряду с 201 заголовок Location предназначен для указания местоположения вновь созданного ресурса.Если заголовок Location не предоставлен, клиент должен предположить, что ресурс идентифицирован по действующему URI запроса:

6.3.2.201 Создан

Код состояния 201 (Создан) указывает, что запрос был выполнен и привел к созданию одного или нескольких новых ресурсов.Основной ресурс, созданный запросом, идентифицируется либо полем заголовка Location в ответе, либо, если поле Location не получено, эффективным URI запроса.[...]


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

Может ли клиент выполнить новый запрос и устранить проблему?Если это так, выберите код состояния в диапазоне 4xx:

6.5.Ошибка клиента 4xx

Класс состояния кода 4xx (ошибка клиента) указывает на то, что клиент, похоже, допустил ошибку.За исключением ответа на запрос HEAD, сервер ДОЛЖЕН отправить представление, содержащее объяснение ситуации с ошибкой, а также является ли это временным или постоянным условием.Эти коды состояния применимы к любому методу запроса.

Майкл Кропат собрал очень полезный набор блок-схем , которые могут дать вам некоторые идеи.Чтобы определить наиболее подходящий код состояния 4xx, см. Следующую таблицу:

Choosing a 4xx status code

Вот некоторые допустимые параметры, в зависимости от причины ошибки:

6.5.11.413 Слишком большая полезная нагрузка

Код состояния 413 (Слишком большая полезная нагрузка) указывает, что сервер отказывается обрабатывать запрос, поскольку полезная нагрузка запроса больше, чем сервер хочет или можетобрабатывать.[...]

6.5.13.415 Неподдерживаемый тип носителя

Код состояния 415 (Неподдерживаемый тип носителя) указывает, что исходный сервер отказывается обслуживать запрос, поскольку полезная нагрузка находится в формате, не поддерживаемом этим методомна целевом ресурсе.Проблема с форматированием может быть связана с указанием в запросе Content-Type или Content-Encoding или из-за прямой проверки данных.

6.5.1.400 Bad Request

Код состояния 400 (Bad Request) указывает, что сервер не может или не будет обрабатывать запрос из-за того, что воспринимается как ошибка клиента (например,неправильный синтаксис запроса, неверное формирование сообщения запроса или обманчивая маршрутизация запроса).


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

Если ошибка была вызвана сервером, то код состояния в5xx диапазон будет точным:

6,6.Ошибка сервера 5xx

Класс состояния кода 5xx (Ошибка сервера) указывает, что сервер знает, что он допустил ошибку или не может выполнить запрошенный метод. За исключением ответа на запрос HEAD, сервер ДОЛЖЕН отправить представление, содержащее объяснение ситуации с ошибкой, а также является ли это временным или постоянным условием.

См. Следующую блок-схему:

Choosing a 5xx status code

Я бы предложил 500:

6.6.1. 500 Внутренняя ошибка сервера

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

2 голосов
/ 15 апреля 2019

Зависит от проблемы, препятствующей публикации изображения на сервере.

Если изображение или запрос не отформатированы правильно, должно быть 4XX.

например: общее 400 Bad Request или конкретное 415 Unsupported Media Type, 409 Conflict, 413 Request Entity Too Large.

Если проблема связана с ошибкой на стороне сервера, код ошибки должен быть на 5XX:

например. Общий: 500 Internal Server Error или 503 Service Unavailable, особенности: 507 Insufficient Storage (WebDAV) 504 Gateway Timeout

Иногда конкретная информация об ошибке может помочь найти решение для работы POST. Но это зависит от того, хотите ли вы, чтобы ошибка была устранена и исправлена.

1 голос
/ 15 апреля 2019

Изображение не может быть сохранено в файловой системе (исключение сохранения файла).

База данных не может обновить новую запись изображения с новым URL (DatabaseException).

Или выбросить IOException.

Короче не могу сохранить / создать изображение.

Какой http код я должен вернуть?

Все конкретные примеры, которые вы приводите - это будет Внутренняя ошибка сервера (Http Status - 500). Есть и чехлы на 409.

См. Это

Должен ли я возвращать более одного кода и более одного сообщения в соответствии Исключению.

Настройка сообщений в соответствии с явным исключением более полезна, но, на мой взгляд, это чрезмерная инженерия клиента, но не тот, кто собирается решить проблему с такого рода ошибками. Если его клиент, который должен исправить свой запрос, тогда помещает сообщение в соответствии с этим (но обычно это имеет место для Http Status 400 - Bad Request).

Если клиент не тот, кто должен предпринимать действия, чтобы каким-либо образом решить проблему (т.е. решить проблему в любом случае), и ему просто нужна информация об ошибке, поэтому поместите простое сообщение & Http Status 500.

0 голосов
/ 15 апреля 2019

Вы можете вернуть 500 Внутренний сервер исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...