Загрузка XML не удается с помощью NetHTTPClient - PullRequest
0 голосов
/ 26 сентября 2018

Я использую Delphi 10.2.3.

Я хочу загрузить ежедневные курсы обмена с http://www.boi.org.il/currency.xml

Моя настройка компонента времени разработки:

NetHTTPClient1.AllowCookies := True;
NetHTTPClient1.HandleRedirects := True;
NetHTTPClient1.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36';

NetHTTPRequest1.MethodString := 'GET';
NetHTTPRequest1.URL := 'http://www.boi.org.il/currency.xml';

Мойкод очень прост:

XML := NetHTTPRequest1.Execute().ContentAsString();

Что я получаю в переменной XML:

<html><body><script>document.cookie='sssssss=6ed9ca3asssssss_6ed9ca3a; path=/';window.location.href=window.location.href;</script></body></html>

Когда я пытаюсь использовать веб-браузер (в моем случае Opera), я вижу правильноXML с использованием того же URL, что и выше.Я не мог понять, в чем проблема.

Любая помощь приветствуется.

Редактировать : Прочитав комментарии @NineBerry, я использовал Fiddler длясмотреть каждый пакет на сайт.Это показало мне, что браузер делает запрос три раза, прежде чем он действительно может загрузить XML.Второй запрос, браузер добавляет ссылку на cookie в ответ на первый запрос.3-й запрос аналогичен 2ns-запросу.

После изучения ниже приведен рабочий код для меня, и я не изменяю параметр TNetHTTPClient.UserAgent:

function DownloadExchangeRates(const URL: string; out XML: string): Boolean;
var
  Cookie: string;
  Path: string;
  AURI: TURI;
  AClient: TNetHTTPClient;
  ARequest: TNetHTTPRequest;
begin
  AClient := nil;
  ARequest := nil;
  try
    AClient := TNetHTTPClient.Create(nil);
    AClient.AllowCookies := True;
    AClient.HandleRedirects := True;

    ARequest := TNetHTTPRequest.Create(nil);
    ARequest.Client := AClient;
    ARequest.Asynchronous := False;
    ARequest.MethodString := 'GET';
    ARequest.URL := URL;
    ARequest.CustomHeaders['Pragma'] := 'no-cache';

    try
      XML := ARequest.Execute().ContentAsString();
      if XML.Length > 5 then
      begin
        if UpperCase(XML.Substring(0, 6)) = '<HTML>' then
        begin
          Cookie := GetCookie(XML);
          AURI := TURI.Create(URL);
          Path := AURI.SCHEME_HTTP + '://' + AURI.Host + '/';
          AClient.CookieManager.AddServerCookie(Cookie, Path);
          AClient.CookieManager.AddServerCookie(Cookie, URL);
          ARequest.CustomHeaders['Referer'] := URL;
          XML := ARequest.Execute().ContentAsString();
          if XML.Length > 5 then
          begin
            if UpperCase(XML.Substring(0, 6)) = '<HTML>' then
            begin
              XML := ARequest.Execute().ContentAsString();
            end;
          end;
        end;
      end;
    except
      on E: Exception do
      begin
        Exit(False);
      end;
    end;
  finally
    ARequest.Free();
    AClient.Free();
  end;

  Result := (XML.Length > 2) and (XML[2] = '?');
end;

1 Ответ

0 голосов
/ 26 сентября 2018
uses 
  System.Net.HttpClient;

function TUpdater.DownloadFile(const aURL: string; aStream: TStream): boolean;
var
  vHTTP: THTTPClient;
begin
  Assert(aStream <> nil);
  vHTTP := THTTPClient.Create;
  try
     Result := vHTTP.Get(aURL, aStream).StatusCode = 200;
  finally
    vHTTP.Free;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...