Значение кода ошибки HTTP 400 BAD request?

У меня есть JSON-запрос, который я отправляю в HTTP URL.

Должен ли он рассматриваться как 400, где поле requestedResource существует, но "Roman" является недопустимым значением для этого поля?

[{requestedResource:"Roman"}] 

Должно ли это рассматриваться как 400, где поле "blah" вообще не существует?

[{blah:"Roman"}]
Комментарии к вопросу (2)

Ответ 400 означает, что запрос был неправильно сформирован. Другими словами, поток данных, отправленный клиентом на сервер, не соответствовал правилам.

В случае REST API с полезной нагрузкой JSON, 400-е обычно, и я бы сказал, правильно, используются для указания того, что JSON является недействительным в некотором роде в соответствии со спецификацией API для сервиса.

По этой логике, оба сценария, которые вы предоставили, должны быть 400's.

Представьте, что это XML, а не JSON. В обоих случаях XML никогда не пройдет проверку схемы - либо из-за неопределенного элемента, либо из-за неправильного значения элемента. Это был бы плохой запрос. То же самое и здесь.

Комментарии (6)

От w3.org

10.4.1 400 Bad Request

Запрос не может быть понят сервером из-за неправильного синтаксиса. Клиент НЕ ДОЛЖЕН повторять запрос без модификации.

Комментарии (5)

Выбор кода ответа HTTP является довольно простой задачей и может быть описан простыми правилами. Единственная сложная часть, о которой часто забывают, это параграф 6.5 из RFC 7231:

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

Правила следующие:

  1. Если запрос был успешным, то возвращается код 2xx (3xx для редиректа). Если на сервере произошла внутренняя логическая ошибка, то возвращается 5xx. Если в запросе клиента что-то не так, то возвращается код 4xx.
  2. Просмотрите доступные коды ответов из выбранной категории. Если один из них имеет название, которое хорошо подходит к вашей ситуации, вы можете использовать его. В противном случае просто вернитесь к коду x00 (200, 400, 500). Если вы сомневаетесь, вернитесь к коду x00.
  3. Верните описание ошибки в тело ответа. Для кодов 4xx оно должно содержать достаточно информации для разработчика клиента, чтобы понять причину и исправить клиента. Для 5xx по соображениям безопасности никакие детали не должны быть раскрыты.
  4. Если клиенту необходимо различать разные ошибки и иметь разную реакцию в зависимости от этого, определите машиночитаемый и расширяемый формат ошибки и используйте его везде в вашем API. Это хорошая практика, чтобы сделать это с самого начала.
  5. Помните, что разработчик клиента может делать странные вещи и пытаться разобрать строки, которые вы возвращаете как человекочитаемое описание. И изменив строки, вы сломаете таких плохо написанных клиентов. Поэтому всегда предоставляйте машиночитаемое описание и старайтесь не сообщать дополнительную информацию в тексте.

Так что в вашем случае я бы вернул ошибку 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"
}
Комментарии (0)

Ни в одном случае не является "и синтаксических ошибок и". Это'ы семантику, что не правы. Отсюда, ИМХО 400 неуместно. Вместо этого, было бы целесообразно вернуть 200 вместе с какой-то ошибкой объект, такой как { "по ошибке": { "Мои сообщения и": "по неизвестным запросу сайта и" } } или любой другой.

Рассмотрим путь обработки клиента(ов). Ошибка в синтаксисе (например, недопустимый формат JSON) - это ошибка в логике программы, другими словами баг какой-то, и должны быть обработаны соответствующим образом, в некотором смысле похож на 403, скажем; другими словами, что-то плохое случилось.

Ошибка в значении параметра, с другой стороны, ошибка семантики, возможно, из-за сказать, плохо проверенные действия пользователя. Это не ошибка http (хотя я предполагаю, что это может быть 422). Путь обработки будет отличаться.

Например, в jQuery, я бы предпочел не иметь, чтобы написать один обработчик ошибок, который касается как вещей, как 500 и некоторые приложения-специфические семантические ошибки. Другие рамки, угли для, а также лечить как ошибки HTTP 400-е и 500-е тож как большой жирный сбои, требующие программисту обнаружить, что's идя на И ветке в зависимости от того,'ы и "Реал" по ошибке или нет.

Комментарии (3)

Используя 400 коды состояния для любых других целей, нежели указывая, что запрос уродлива-просто неправильно.

Если запрос полезной нагрузки содержит байт-последовательность, которая не может быть переведен как приложение/JSON (если сервер ожидает, что dataformat), соответствующий код состояния 415:

сервер отказывается обработать запрос, так как объект запрос в формате, не поддерживаемом запрошенным ресурсом для запрашиваемый метод.

Если запрос полезной нагрузки является синтаксически правильные, но семантически неправильные, нестандартные 422 ответ код может быть использован, или стандартный 403 код состояния:

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

Комментарии (1)

Думаю, об ожиданиях.

В качестве клиентского приложения, вы планируете знать, если что-то пойдет не так на стороне сервера. Если сервер должен выдать сообщение об ошибке, когда мля отсутствует или requestedResource неправильное значение, чем ошибка 400 будут уместны.

Комментарии (0)

Сначала проверьте URL-адрес, это может быть неправильным, если она правильная, то проверьте текст запроса, который вы отправляете, возможной причиной является запрос, который вы отправляете отсутствует правильный синтаксис.

Разработка , проверка на специальные символы в строке запроса. Если это (специальный символ) используется это является причиной этой ошибки.

попробуйте скопировать запрос и проанализировать все данные теги.

Комментарии (1)

В качестве дополнительного, для тех, кто может отвечать тот же вопрос, как у меня, я'м через $.Аякс для отправки данных формы на сервер и я также получил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); 
    }
});

В любом случае, как уже показано, эта ошибка происходит потому, что сервер не может распознать запрос причиной синтаксических ошибок, я'м просто воспитание на практике. Надеюсь, что это будет полезно для кого-то.

Комментарии (0)