Веб-сайт Amazon Elasticbeanstalk не работает из Google Dialogflow, но работает из Postman [duplicate]

Оператор == проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals() проверьте фактическое содержимое строки (значение).

Обратите внимание, что метод .equals() принадлежит классу Object (суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.

  • Случай 1
    String s1 = "Stack Overflow";
    String s2 = "Stack Overflow";
    s1 == s2;      //true
    s1.equals(s2); //true
    
    Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле.
  • Случай 2
    String s1 = new String("Stack Overflow");
    String s2 = new String("Stack Overflow");
    s1 == s2;      //false
    s1.equals(s2); //true
    
    Причина. Если вы создаете объект String с использованием ключевого слова new, ему выделяется отдельное пространство в куче.
289
задан Vidya 10 November 2017 в 21:51
поделиться

7 ответов

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

За исключением случаев, когда он отвечает на запрос 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"
}
39
ответ дан Alexey Guseynov 15 August 2018 в 15:25
поделиться

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

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

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

3
ответ дан Ankur Bhutani 15 August 2018 в 15:25
поделиться
  • 1
    Я получал ошибку http 400, я проверил, что у моего запроса были специальные символы. Чтобы исправить это, я передал chasset = UTF-8 в типе содержимого. – Kislay Kishore 24 August 2017 в 09:53

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

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

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

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

Сервер понял запрос, но отказывается его выполнять. Авторизация не поможет, и запрос НЕ ДОЛЖЕН повториться.

10
ответ дан Cochise Ruhulessin 15 August 2018 в 15:25
поделиться
  • 1
    нет, 415 - это то, когда объект считается неправильным, например, image/gif вместо text/json в заголовке Content-Type:. - предположительно, это также применимо, если указанная часть мультипартии имеет неправильный тип, см. tools.ietf.org/html/rfc4918 , где он обсуждает 422 для более подробного обсуждения, – Jasen 8 September 2017 в 00:21

Подумайте о ожиданиях.

Как клиентское приложение, вы ожидаете узнать, что что-то пошло не так на стороне сервера. Если серверу необходимо выбросить ошибку, если отсутствует blah или значение requestedResource неверно, чем ошибка 400.

7
ответ дан film42 15 August 2018 в 15:25
поделиться

Из w3.org

10.4.1 400 Bad Request

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

58
ответ дан Jason Sperske 15 August 2018 в 15:25
поделиться
  • 1
    Правильность возврата ошибки 400 не основана на полем и значении, а на запросе в целом. Я думаю, что HTTP 400 - хороший способ пойти – Jason Sperske 30 October 2013 в 01:56
  • 2
    Вы имеете в виду, что 400 ответов будут использоваться, чтобы сообщить клиентам, что что-либо, т. Е. URL, заголовки, тело и т. Д., В запросе может быть неправильным, а не только телом? – testerjoe2 1 November 2017 в 20:03
  • 3
    ну для url правильный код 404, для заголовков, я думаю, что это поднять, 403 (запрещено) кажется правильным путем, если заголовки отклоняют личность, но что, если заголовки определяют формат вывода? о единственном пути, который, как мне кажется, кажется правильным для 400, в ситуации, когда запрашивается действие, которое не имеет смысла и не должно повторяться. Я написал этот ответ 4 года назад, в эти дни я чувствую, что даже ошибки должны возвращать 200, и что ошибки должны применяться только к передаче http, а не к полезной нагрузке. – Jason Sperske 1 November 2017 в 22:33
  • 4
    Этот ответ покрывает много этого, хотя я еще не прочитал все диаграммы stackoverflow.com/a/34324179/16959 – Jason Sperske 1 November 2017 в 22:37

В любом случае «синтаксис искажен». Это неправильная семантика. Следовательно, ИМХО 400 не подходит. Вместо этого было бы целесообразно вернуть 200 вместе с каким-то объектом ошибки, таким как { "error": { "message": "Unknown request keyword" } } или что-то еще.

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

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

Например, в jQuery я бы предпочел не писать один обработчик ошибок, который имеет дело с такими вещами, как 500 и некоторые семантические ошибки, специфичные для приложения. Другие фреймворки, Ember для одного, также обрабатывают ошибки HTTP, такие как 400 и 500, одинаково, как большие отказы жира, требующие от программиста обнаружить, что происходит и что происходит, в зависимости от того, является ли это «реальной» ошибкой или нет.

21
ответ дан user 15 August 2018 в 15:25
поделиться
  • 1
    +1, P в HTTP означает Protocol , и если ответ является ошибкой HTTP, это должна быть проблема низкого уровня. В течение многих лет я избегал много сложностей в коде, используя подход, описанный torazaburo. Было бы меньше боли на земле REST, если бы мы все писали код resilient , а не так часто взорвали ошибки HTTP. – Dem Pilafian 4 August 2016 в 03:55
  • 2
    200 означает, что запрос обработан, поэтому на клиенте должна быть выполнена обычная логика успеха. Здесь у нас определенно есть ошибка, поэтому ответ не может иметь код 2xx или 3xx. Это не может быть 5xx либо потому, что это ошибка на стороне сервера, и у нас есть ошибка на стороне клиента. Так что это должна быть ошибка 4xx. Но описание ошибки в корпусе ответа - это правильная вещь, и на самом деле это метод, рекомендованный спецификацией HTTP. – Alexey Guseynov 22 September 2016 в 16:38

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

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

По этой логике оба указанных вами сценария должны быть 400.

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

311
ответ дан Vidya 15 August 2018 в 15:25
поделиться
  • 1
    Я согласен с вами до «По этой логике оба сценария, которые вы предоставили, должны быть 400». Я не думаю, что содержание JSON должно иметь здесь значение. Когда вы говорите неправильно, я бы хотел поверить, что решает проблемы в формате отправляемых вами данных, например, если вы пропустите поле в JSON, вы должны получить 400. – Geethanga 7 August 2014 в 04:24
  • 2
    Существует достойный набор кодов ответа REST в restapitutorial.com/httpstatuscodes.html . Это также может зависеть от того, как вы хотите обрабатывать действительный запрос, такой как 406 (Не допускается) или 405 метод не допускается. Однако 400 является подходящим, потому что «запрос не может быть понят сервером из-за искаженного синтаксиса. Клиент НЕ ДОЛЖЕН повторять запрос без изменений. & Quot; – Andrew Scott Evans 30 October 2015 в 20:12
  • 3
    Я с тобой согласен – koogua 6 June 2016 в 02:57
  • 4
    Таким образом, "Запрос, который не может быть понят сервером из-за искаженного синтаксиса & quot; , может быть либо из запроса (например, один из HTTP-заголовков, которые были искажены), либо данные , переносимые запросом (например, значение JSON отсутствует)? – MC Emperor 3 January 2017 в 16:12
  • 5
    Видья говорит: «XML никогда не пройдет проверку схемы». Точка заключается в том, что анализаторы XML различают хорошо сформированный документ (то есть синтаксически звуковой) и действительный (то есть семантически звуковой, например, согласно схеме). Описание 400-кода «запрос не может быть понят сервером из-за искаженного синтаксиса ». - поэтому он не должен использоваться для ошибок проверки, imho. – Martin Lie 6 March 2017 в 05:28
Другие вопросы по тегам:

Похожие вопросы: