Ошибка TidHTTP & ldquo; Требуется порт & rdquo; при попытке подключиться

weapon - undefined, поэтому получение name завершается с ошибкой. Вы можете немного сократить код, используя оценку короткого замыкания :

const weapons = coopSchedule.details[0].weapons[0];
const weapon = (weapons.weapon || weapons.coop_special_weapon).name;

0
задан Remy Lebeau 19 January 2019 в 20:16
поделиться

1 ответ

Ошибка «Требуется порт» связана с тем, что свойству Port еще не присвоено значение при вызове Connect().

Но дело в том, что в отличие от других клиентских компонентов TCP, вы НЕ ДОЛЖНЫ вызывать Connect() напрямую при использовании TIdHTTP. Его метод Get() (и другие методы запроса) будут обрабатывать это внутри вас. Итак, вам нужно удалить вызов Connect() из вашего кода.

HTTP - это протокол без сохранения состояния. Базовое TCP-соединение может быть постоянным или может быть отключено между несколькими запросами к одному и тому же серверу. Клиент и сервер согласовывают это на основе запроса. TIdHTTP обрабатывает эти подробности для вас внутренне, анализируя URL-адреса для информации о хосте и порте (как я объяснил в другом сообщении, которое вы упомянули) и отключая / переподключая TCP-соединение по мере необходимости.

Все, что вам нужно сделать, это предоставить действительный URL-адрес Get() (и другим) и позволить TIdHTTP управлять TCP-соединением за вас.

В отдельном примечании не следует использовать свойство Request.CustomHeaders для установки заголовка запроса Accept. Вместо этого используйте свойство Request.Accept.

Попробуйте это:

IdHttp1.Request.Accept := 'application/vnd.hmrc.1.0+json';
try
  Result := IdHTTP1.Get('https://test-api.service.hmrc.gov.uk/hello/world');
except
  on E: Exception do
    Memo1.Lines.Add(E.ClassName + ': ' + E.message);
end;

Что касается кода ответа 406, тот факт, что вы получаете любой ответ вообще, означает, что у вас есть действующее HTTP-соединение с сервером. Но 406 НЕ означает, что соединение небезопасно, как вы утверждаете (на самом деле, это не может быть, так как вы запрашиваете HTTPS-URL). 406 фактически означает, что сервер не может доставить вам свои данные ответа в формате, который вы явно запросили как приемлемый. В этом случае ответ не может быть предоставлен в желаемом формате JSON.

Итак, вам нужно выяснить, почему сервер не отправляет JSON, и исправить это, или вам нужно изменить заголовок запроса Accept, включив в него формат, который сервер хочет использовать вместо этого.

Мое предположение заключается в том, что сервер, вероятно, пытается отправить сообщение об ошибке в формате, отличном от JSON (возможно, в HTML), поэтому попробуйте временно удалить заголовок запроса Accept, чтобы вы могли посмотреть при фактическом ответе, а затем при необходимости обновите код запроса.

0
ответ дан Remy Lebeau 19 January 2019 в 20:16
поделиться
Другие вопросы по тегам:

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