Оператор ==
проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals()
проверьте фактическое содержимое строки (значение).
Обратите внимание, что метод .equals()
принадлежит классу Object
(суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.
String s1 = "Stack Overflow";
String s2 = "Stack Overflow";
s1 == s2; //true
s1.equals(s2); //true
Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле. String s1 = new String("Stack Overflow");
String s2 = new String("Stack Overflow");
s1 == s2; //false
s1.equals(s2); //true
Причина. Если вы создаете объект String с использованием ключевого слова new
, ему выделяется отдельное пространство в куче. Выбор кода ответа HTTP - довольно простая задача и может быть описана простыми правилами. Единственная сложная часть, которая часто забывается, - это параграф 6.5 из RFC 7231:
За исключением случаев, когда он отвечает на запрос HEAD, сервер ДОЛЖЕН отправить представление, содержащее объяснение ситуации ошибки, и является временным или постоянным условием.
blockquote>Правила следующие:
- Если запрос был успешным, верните код 2xx (3xx для перенаправления). Если на сервере возникла внутренняя логическая ошибка, верните 5xx. Если в запросе клиента есть что-то не так, верните код 4xx.
- Просмотрите доступный код ответа из выбранной категории. Если у одного из них есть имя, которое хорошо соответствует вашей ситуации, вы можете его использовать. В противном случае просто отмените код x00 (200, 400, 500). Если вы сомневаетесь, откиньтесь на x00-код.
- . Возвратите описание ошибки в теле ответа. Для кодов 4xx он должен содержать достаточно информации для разработчика клиента, чтобы понять причину и исправить клиента. Для 5xx из соображений безопасности детали не должны раскрываться.
- Если клиенту необходимо различать разные ошибки и иметь различную реакцию в зависимости от него, определите машиносчитываемый и расширяемый формат ошибок и используйте его везде в вашем API. Это хорошая практика, чтобы сделать это с самого начала.
- Имейте в виду, что клиентский разработчик может делать странные вещи и пытаться проанализировать строки, которые вы возвращаете как удобное для чтения описание. И, изменив строки, вы сломаете таких плохо написанных клиентов. Поэтому всегда предоставляйте машиносчитываемое описание и старайтесь избегать сообщения дополнительной информации в тексте.
Итак, в вашем случае я вернул ошибку 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" }
Сначала проверьте URL-адрес, который может быть неправильным, если он правильный, проверьте корпус запроса, который вы отправляете, возможной причиной является запрос, который вы отправляете, отсутствует правильный синтаксис.
Чтобы разработать, проверьте специальные символы в строке запроса. Если используется (специальный символ), это является основной причиной этой ошибки.
попытайтесь скопировать запрос и проанализировать все данные тэгов.
Использование кодов статуса 400
для любой другой цели, кроме указания неправильного запроса , является просто неправильным.
Если полезная нагрузка запроса содержит байтовую последовательность, которая может не анализируется как application/json
(если сервер ожидает, что dataformat), соответствующий код состояния 415
:
Сервер отказывается обслуживать запрос, поскольку объект запроса в формате, не поддерживаемом запрошенным ресурсом для запрошенного метода.
blockquote>Если полезная нагрузка запроса является синтаксически правильной, но семантически некорректной, может использоваться нестандартный
422
код ответа или стандартный403
код состояния:Сервер понял запрос, но отказывается его выполнять. Авторизация не поможет, и запрос НЕ ДОЛЖЕН повториться.
blockquote>
image/gif
вместо text/json
в заголовке Content-Type:
. - предположительно, это также применимо, если указанная часть мультипартии имеет неправильный тип, см. tools.ietf.org/html/rfc4918 , где он обсуждает 422 для более подробного обсуждения,
– Jasen
8 September 2017 в 00:21
Подумайте о ожиданиях.
Как клиентское приложение, вы ожидаете узнать, что что-то пошло не так на стороне сервера. Если серверу необходимо выбросить ошибку, если отсутствует blah
или значение requestedResource
неверно, чем ошибка 400.
Из w3.org
10.4.1 400 Bad Request
Запрос не мог быть понят сервером из-за искаженного синтаксиса , Клиент НЕ ДОЛЖЕН повторять запрос без изменений.
В любом случае «синтаксис искажен». Это неправильная семантика. Следовательно, ИМХО 400 не подходит. Вместо этого было бы целесообразно вернуть 200 вместе с каким-то объектом ошибки, таким как { "error": { "message": "Unknown request keyword" } }
или что-то еще.
Рассмотрим пути (ы) обработки клиента. Ошибка в синтаксисе (например, недопустимый JSON) является ошибкой в логике программы, другими словами, какой-то ошибкой, и ее следует обрабатывать соответствующим образом, аналогично 403; Другими словами, что-то плохое пошло не так.
Ошибка в значении параметра, с другой стороны, является ошибкой семантики, возможно, из-за плохо подтвержденного ввода пользователем. Это не ошибка HTTP (хотя я полагаю, что это может быть 422). Путь обработки был бы другим.
Например, в jQuery я бы предпочел не писать один обработчик ошибок, который имеет дело с такими вещами, как 500 и некоторые семантические ошибки, специфичные для приложения. Другие фреймворки, Ember для одного, также обрабатывают ошибки HTTP, такие как 400 и 500, одинаково, как большие отказы жира, требующие от программиста обнаружить, что происходит и что происходит, в зависимости от того, является ли это «реальной» ошибкой или нет.
400 означает, что запрос был искажен. Другими словами, поток данных, отправленный клиентом на сервер, не соответствовал правилам.
В случае REST API с полезной нагрузкой JSON 400, как правило, и, я бы сказал, используется, чтобы указать, что JSON некорректен в соответствии со спецификацией API для службы.
По этой логике оба указанных вами сценария должны быть 400.
Представьте себе, что это были XML, а не JSON. В обоих случаях XML никогда не будет проходить проверку схемы - либо из-за неопределенного элемента, либо из-за неправильного значения элемента. Это будет плохая просьба. То же самое дело.