У меня есть JSON-запрос, который я отправляю в HTTP URL.
Должен ли он рассматриваться как 400
, где поле requestedResource
существует, но "Roman"
является недопустимым значением для этого поля?
[{requestedResource:"Roman"}]
Должно ли это рассматриваться как 400
, где поле "blah"
вообще не существует?
[{blah:"Roman"}]
Ответ 400 означает, что запрос был неправильно сформирован. Другими словами, поток данных, отправленный клиентом на сервер, не соответствовал правилам.
В случае REST API с полезной нагрузкой JSON, 400-е обычно, и я бы сказал, правильно, используются для указания того, что JSON является недействительным в некотором роде в соответствии со спецификацией API для сервиса.
По этой логике, оба сценария, которые вы предоставили, должны быть 400's.
Представьте, что это XML, а не JSON. В обоих случаях XML никогда не пройдет проверку схемы - либо из-за неопределенного элемента, либо из-за неправильного значения элемента. Это был бы плохой запрос. То же самое и здесь.
От w3.org
10.4.1 400 Bad Request
Запрос не может быть понят сервером из-за неправильного синтаксиса. Клиент НЕ ДОЛЖЕН повторять запрос без модификации.
Выбор кода ответа HTTP является довольно простой задачей и может быть описан простыми правилами. Единственная сложная часть, о которой часто забывают, это параграф 6.5 из RFC 7231:
За исключением ответа на запрос HEAD, сервер ДОЛЖЕН посылать в ответ на запрос HEAD. представление, содержащее объяснение ситуации с ошибкой, и является ли она временной или постоянной.
Правила следующие:
Так что в вашем случае я бы вернул ошибку 400 и что-то вроде этого, если "Roman" получен из пользовательского ввода и клиент должен иметь специфическую реакцию:
{
"error_type" : "unsupported_resource",
"error_description" : "\"Roman\" is not supported"
}
или более общую ошибку, если такая ситуация является плохой логической ошибкой клиента и не ожидается, если только разработчик не сделал что-то не так:
{
"error_type" : "malformed_json",
"error_description" : "\"Roman\" is not supported for \"requestedResource\" field"
}
Ни в одном случае не является "и синтаксических ошибок и". Это'ы семантику, что не правы. Отсюда, ИМХО 400 неуместно. Вместо этого, было бы целесообразно вернуть 200 вместе с какой-то ошибкой объект, такой как { "по ошибке": { "Мои сообщения и": "по неизвестным запросу сайта и" } }
или любой другой.
Рассмотрим путь обработки клиента(ов). Ошибка в синтаксисе (например, недопустимый формат JSON) - это ошибка в логике программы, другими словами баг какой-то, и должны быть обработаны соответствующим образом, в некотором смысле похож на 403, скажем; другими словами, что-то плохое случилось.
Ошибка в значении параметра, с другой стороны, ошибка семантики, возможно, из-за сказать, плохо проверенные действия пользователя. Это не ошибка http (хотя я предполагаю, что это может быть 422). Путь обработки будет отличаться.
Например, в jQuery, я бы предпочел не иметь, чтобы написать один обработчик ошибок, который касается как вещей, как 500 и некоторые приложения-специфические семантические ошибки. Другие рамки, угли для, а также лечить как ошибки HTTP 400-е и 500-е тож как большой жирный сбои, требующие программисту обнаружить, что's идя на И ветке в зависимости от того,'ы и "Реал" по ошибке или нет.
Используя 400
коды состояния для любых других целей, нежели указывая, что запрос уродлива-просто неправильно.
Если запрос полезной нагрузки содержит байт-последовательность, которая не может быть переведен как приложение/JSON
(если сервер ожидает, что dataformat), соответствующий код состояния 415
:
сервер отказывается обработать запрос, так как объект запрос в формате, не поддерживаемом запрошенным ресурсом для запрашиваемый метод.
Если запрос полезной нагрузки является синтаксически правильные, но семантически неправильные, нестандартные 422
ответ код может быть использован, или стандартный 403
код состояния:
сервер понял запрос, но отказывается выполнять его. разрешение не поможет, и запрос не должен быть повторен.
Думаю, об ожиданиях.
В качестве клиентского приложения, вы планируете знать, если что-то пойдет не так на стороне сервера. Если сервер должен выдать сообщение об ошибке, когда мля
отсутствует или requestedResource
неправильное значение, чем ошибка 400 будут уместны.
Сначала проверьте URL-адрес, это может быть неправильным, если она правильная, то проверьте текст запроса, который вы отправляете, возможной причиной является запрос, который вы отправляете отсутствует правильный синтаксис.
Разработка , проверка на специальные символы в строке запроса. Если это (специальный символ) используется это является причиной этой ошибки.
попробуйте скопировать запрос и проанализировать все данные теги.
В качестве дополнительного, для тех, кто может отвечать тот же вопрос, как у меня, я'м через $.Аякс для отправки данных формы на сервер и я также получил
400` ошибка в первую очередь.
Предположим, у меня есть JavaScript-переменной,
var formData = {
"name":"Gearon",
"hobby":"Be different"
};
Не использовать переменную виде FormData
непосредственно в качестве значения ключа "данные", как показано ниже:
$.ajax({
type: "post",
dataType: "json",
url: "http://localhost/user/add",
contentType: "application/json",
data: formData,
success: function(data, textStatus){
alert("Data: " + data + "\nStatus: " + status);
}
});
Вместо этого, использовать JSON.преобразовать в строки для инкапсуляции виде FormData
, как показано ниже:
$.ajax({
type: "post",
dataType: "json",
url: "http://localhost/user/add",
contentType: "application/json",
data: JSON.stringify(formData),
success: function(data, textStatus){
alert("Data: " + data + "\nStatus: " + status);
}
});
В любом случае, как уже показано, эта ошибка происходит потому, что сервер не может распознать запрос причиной синтаксических ошибок, я'м просто воспитание на практике. Надеюсь, что это будет полезно для кого-то.