weapon
- undefined
, поэтому получение name
завершается с ошибкой. Вы можете немного сократить код, используя оценку короткого замыкания :
const weapons = coopSchedule.details[0].weapons[0];
const weapon = (weapons.weapon || weapons.coop_special_weapon).name;
Ошибка «Требуется порт» связана с тем, что свойству 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
, чтобы вы могли посмотреть при фактическом ответе, а затем при необходимости обновите код запроса.