Jaki jest najprostszy sposób wywołania HTTP GET url za pomocą Delphi?

Jest usługa sieciowa, którą chcę wywołać w mojej aplikacji, mogę jej użyć przy importowaniu WSDL lub po prostu użyć "HTTP GET" z adresem URL i parametrami, więc wolę później, ponieważ to prosta rzecz.

Wiem, że mogę użyć indy idhttp.dostać, do pracy, ale jest to bardzo prosta rzecz i nie chcę dodawać skomplikowanego kodu indy do mojej aplikacji.

UPDATE: sorry if I was not clear, I mean by "not to add complex Indy code", that I don ' t want add indy komponenty do tego prostego zadania i preferują bardziej lżejszy sposób.

Author: Sahil Mahajan Mj, 2008-11-19

8 answers

Możesz użyć WinINet API w następujący sposób:

uses WinInet;

function GetUrlContent(const Url: string): string;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1024] of Char;
  BytesRead: dWord;
begin
  Result := '';
  NetHandle := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

  if Assigned(NetHandle) then 
  begin
    UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);

    if Assigned(UrlHandle) then
      { UrlHandle valid? Proceed with download }
    begin
      FillChar(Buffer, SizeOf(Buffer), 0);
      repeat
        Result := Result + Buffer;
        FillChar(Buffer, SizeOf(Buffer), 0);
        InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
      until BytesRead = 0;
      InternetCloseHandle(UrlHandle);
    end
    else
      { UrlHandle is not valid. Raise an exception. }
      raise Exception.CreateFmt('Cannot open URL %s', [Url]);

    InternetCloseHandle(NetHandle);
  end
  else
    { NetHandle is not valid. Raise an exception }
    raise Exception.Create('Unable to initialize Wininet');
end;

Źródło: http://www.scalabium.com/faq/dct0080.htm

API WinINet używa tych samych rzeczy, których używa InternetExplorer, więc możesz również uzyskać dowolne ustawienia połączenia i serwera proxy ustawione przez InternetExplorer za darmo.

 27
Author: Lars Truijens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-19 12:42:26

Wywołanie RESTful web service za pomocą Indy jest dość proste.

Dodaj IdHTTP do klauzuli uses. Pamiętaj, że IdHTTP potrzebuje prefiksu "HTTP: / /" na Twoich adresach URL.

function GetURLAsString(const aURL: string): string;
var
  lHTTP: TIdHTTP;
begin
  lHTTP := TIdHTTP.Create;
  try
    Result := lHTTP.Get(aURL);
  finally
    lHTTP.Free;
  end;
end;
 34
Author: Bruce McGee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-20 12:34:28

Właściwie kod w zaakceptowanej odpowiedzi nie zadziałał dla mnie. Więc zmodyfikowałem go trochę tak, że faktycznie zwraca String i z wdziękiem zamyka wszystko po wykonaniu. Przykład zwraca pobrane dane jako UTF8String, więc będzie działać dobrze zarówno dla ASCII, jak i dla stron UTF8.

uses WinInet;

function GetUrlContent(const Url: string): UTF8String;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1023] of byte;
  BytesRead: dWord;
  StrBuffer: UTF8String;
begin
  Result := '';
  NetHandle := InternetOpen('Delphi 2009', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(NetHandle) then
    try
      UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
      if Assigned(UrlHandle) then
        try
          repeat
            InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
            SetString(StrBuffer, PAnsiChar(@Buffer[0]), BytesRead);
            Result := Result + StrBuffer;
          until BytesRead = 0;
        finally
          InternetCloseHandle(UrlHandle);
        end
      else
        raise Exception.CreateFmt('Cannot open URL %s', [Url]);
    finally
      InternetCloseHandle(NetHandle);
    end
  else
    raise Exception.Create('Unable to initialize Wininet');
end;

Mam nadzieję, że pomoże to komuś takiemu jak ja, który szukał łatwego kodu, jak odzyskać zawartość strony w Delphi. Pozdrawiam, Aldis :)

 17
Author: Aldis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-13 20:45:24

W nowszych wersjach Delphi lepiej jest użyć THTTPClient z jednostki System.Net.HttpClient, ponieważ jest ona standardowa i wieloplatformowa. Prostym przykładem jest

function GetURL(const AURL: string): string;
var
  HttpClient: THttpClient;
  HttpResponse: IHttpResponse;
begin
  HttpClient := THTTPClient.Create;
  try
    HttpResponse := HttpClient.Get(AURL);
    Result := HttpResponse.ContentAsString();
  finally
    HttpClient.Free;
  end;
end;
 9
Author: EugeneK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-30 17:44:31

Jeśli pobieranie do pliku jest w porządku, możesz użyć TDownloadURL z jednostki ExtActns. Znacznie prostsze niż bezpośrednie korzystanie z WinInet.

procedure TMainForm.DownloadFile(URL: string; Dest: string);
var
  dl: TDownloadURL;
begin
  dl := TDownloadURL.Create(self);
  try
    dl.URL := URL;
    dl.FileName := Dest;
    dl.ExecuteTarget(nil); //this downloads the file
  finally
    dl.Free;
  end;
end;

Możliwe jest również otrzymywanie powiadomień o postępach podczas korzystania z tej funkcji. Po prostu Przypisz obsługę zdarzenia do zdarzenia Ondownloadurl w tdownloadprogress.

 7
Author: Michael Madsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-30 07:15:07

Korzystanie z Windows HTTP API może być również łatwe.

procedure TForm1.Button1Click(Sender: TObject);
var http: variant;
begin
 http:=createoleobject('WinHttp.WinHttpRequest.5.1');
 http.open('GET', 'http://lazarus.freepascal.org', false);
 http.send;
 showmessage(http.responsetext);
end;

W powyższym kodzie sugeruję, że COM został już zainicjowany dla głównego wątku VCL. Podobno nie zawsze może tak być w przypadku aplikacji uproszczonych lub aplikacji LCL. Również na pewno nie byłoby w przypadku pracy asynchronicznej (wielowątkowej).

Poniżej fragment z prawdziwy kod działa. Uwaga-funkcjonalność jest bonus. Nie jest wymagane do pracy. Tak więc podczas gdy ja wydaję prośby, Nie dbam o ich wyniki, wynik ten jest ignorowany i porzucany.

procedure TfmHaspList.YieldBlinkHTTP(const LED: boolean; const Key_Hardware_ID: cardinal);
var URL: WideString;
begin
  URL := 'http://127.0.0.1:1947/action.html?blink' +
    IfThen( LED, 'on', 'off') + '=' + IntToStr(Key_Hardware_ID);

  TThread.CreateAnonymousThread(
    procedure
    var Request: OleVariant;
    begin
      // COM library initialization for the current thread
      CoInitialize(nil);
      try
        // create the WinHttpRequest object instance
        Request := CreateOleObject('WinHttp.WinHttpRequest.5.1');
        // open HTTP connection with GET method in synchronous mode
        Request.Open('GET', URL, False);
        // set the User-Agent header value
//        Request.SetRequestHeader('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0');
        // sends the HTTP request to the server, the Send method does not return
        // until WinHTTP completely receives the response (synchronous mode)
        Request.Send;
//        // store the response into the field for synchronization
//        FResponseText := Request.ResponseText;
//        // execute the SynchronizeResult method within the main thread context
//        Synchronize(SynchronizeResult);
      finally
        // release the WinHttpRequest object instance
        Request := Unassigned;
        // uninitialize COM library with all resources
        CoUninitialize;
      end;
    end
  ).Start;
end;
 5
Author: Arioch 'The,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-14 12:59:14

Użyj funkcji Synapse TCP / IP w jednostce HTTPSEND (HTTPGetText, HTTPGetBinary). To zrobi HTTP pull dla Ciebie i nie wymaga żadnych zewnętrznych DLL innych niż Winsock. Najnowsze wydanie SVN działa doskonale w Delphi 2009. Wykorzystuje to blokowanie wywołań funkcji, więc nie ma żadnych zdarzeń do zaprogramowania.

Aktualizacja: jednostki są bardzo lekkie i nie są oparte na komponentach. Najnowsza wersja Z SVN działa doskonale również w Delphi XE4.

 2
Author: skamradt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-23 19:02:14

Jeśli Twoja aplikacja jest tylko Windows, sugerowałbym użycie WinSock. Jest dość prosty, pozwala na wykonanie dowolnego żądania HTTP, może pracować zarówno synchronicznie jak i asynchronicznie (używając nieblokującego WSASend/WSARecv z wywołaniami zwrotnymi lub starego dobrego send/recv w dedykowanym wątku).

 0
Author: user2024154,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-15 18:14:03