У меня есть запрос JSON, который я публикую на HTTP-URL.
Должно ли это рассматриваться как поле, 400
где requestedResource
существует поле, но "Roman"
является ли оно недопустимым для этого поля?
[{requestedResource:"Roman"}]
Должно ли это рассматриваться как поле, 400
где "blah"
поля вообще не существует?
[{blah:"Roman"}]
Roman
, им просто нужно заплатить вам больше :)Ответы:
400 означает, что запрос был искажен. Другими словами, поток данных, отправленный клиентом на сервер, не соответствовал правилам.
В случае REST API с полезной нагрузкой JSON 400 обычно и, я бы сказал, правильно, указывают на то, что JSON каким-то образом недопустим в соответствии со спецификацией API для службы.
По этой логике оба сценария должны быть 400-х годов.
Представьте себе, что это XML, а не JSON. В обоих случаях XML никогда не пройдет проверку схемы - либо из-за неопределенного элемента, либо из-за неправильного значения элемента. Это было бы плохой просьбой. То же самое здесь.
источник
С w3.org
источник
Выбор кода ответа HTTP является довольно простой задачей и может быть описан с помощью простых правил. Единственная сложная часть, о которой часто забывают, это пункт 6.5 из RFC 7231:
Правила следующие:
Так что в вашем случае я вернул 400 ошибок и что-то вроде этого, если «Roman» получен из пользовательского ввода и клиент должен иметь конкретную реакцию:
или более общая ошибка, если такая ситуация является ошибкой логической ошибки в клиенте и не ожидается, если разработчик не сделал что-то не так:
источник
Ни в том, ни в другом случае «неправильный синтаксис». Это неправильная семантика. Следовательно, ИМХО 400 неуместно. Вместо этого было бы целесообразно вернуть 200 вместе с каким-либо объектом ошибки, таким как
{ "error": { "message": "Unknown request keyword" } }
или что-то еще.Рассмотрим пути обработки клиента. Ошибка в синтаксисе (например, неверный JSON) является ошибкой в логике программы, другими словами, ошибкой какого-то рода, и должна обрабатываться соответствующим образом, как, скажем, 403; другими словами, что-то плохое пошло не так.
Ошибка в значении параметра, с другой стороны, является ошибкой семантики, возможно, из-за плохо проверенного пользовательского ввода. Это не ошибка HTTP (хотя я предполагаю, что это может быть 422). Путь обработки будет другим.
Например, в jQuery я бы предпочел не писать ни одного обработчика ошибок, который бы обрабатывал как 500, так и некоторую семантическую ошибку приложения. Другие фреймворки, Ember for one, также обрабатывают ошибки HTTP, такие как 400 и 500, одинаково, как большие полные сбои, требующие от программиста обнаружения происходящего и перехода в зависимости от того, является ли это «настоящей» ошибкой или нет.
источник
Использование
400
кодов состояния для любой другой цели, кроме указания того, что запрос искажен, просто неправильно.Если полезная нагрузка запроса содержит последовательность байтов, которая не может быть проанализирована как
application/json
(если сервер ожидает этот формат данных), соответствующий код состояния415
:Если полезная нагрузка запроса синтаксически верна, но семантически неверна,
422
можно использовать нестандартный код ответа или стандартный403
код состояния:источник
image/gif
вместо того , чтобыtext/json
вContent-Type:
заголовке. - предположительно, это также применимо, если для компонента составного элемента указан неправильный тип, см. tools.ietf.org/html/rfc4918, где обсуждается 422 для дальнейшего обсуждения,Подумай об ожиданиях.
Как клиентское приложение, вы ожидаете знать, что что-то не так на стороне сервера. Если серверу нужно выдать ошибку, если
blah
она отсутствует илиrequestedResource
значение неверно, то подойдет ошибка 400.источник
В качестве дополнения, для тех, кто может столкнуться с той же проблемой, что и я, я использую
$.ajax
для отправки данных формы на сервер, и я400
сначала получил ошибку.Предположим, у меня есть переменная JavaScript,
Не используйте переменную
formData
напрямую в качестве значения ключа,data
как показано ниже:Вместо этого используйте JSON.stringify для инкапсуляции,
formData
как показано ниже:В любом случае, как показали другие, ошибка заключается в том, что сервер не может распознать запрос, так как синтаксис искажен, я просто привожу пример на практике. Надеюсь, это будет полезно для кого-то.
источник
Сначала проверьте URL, это может быть неправильно, если это правильно, затем проверьте тело запроса, которое вы отправляете, возможная причина - запрос, который вы отправляете, отсутствует правильный синтаксис.
Чтобы уточнить, проверьте наличие специальных символов в строке запроса. Если используется (специальный символ), это является основной причиной этой ошибки.
попробуйте скопировать запрос и проанализировать все данные тегов.
источник