Quelle est la façon la plus simple d'appeler Http GET url en utilisant Delphi?

il y a un service web que je veux appeler dans mon application, je peux l'utiliser avec l'importation de la WSDL ou tout simplement utiliser" HTTP GET " avec L'URL et les paramètres, donc je préfère la dernière parce que c'est chose simple.

je sais que je peux utiliser indy idhttp.obtenir, pour faire le travail, mais c'est très simple et je ne veux pas ajouter des indy code de mon application.

UPDATE : désolé si je n'étais pas clair, je voulais dire par " ne pas ajouter complexe indy code", que je ne veux pas ajouter de composants indy pour cette simple tâche, et préfère une manière plus légère pour cela.

40
demandé sur Sahil Mahajan Mj 2008-11-19 13:52:34

8 réponses

vous pouvez utiliser le WinInet API comme ceci:

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;

source: http://www.scalabium.com/faq/dct0080.htm

L'API WinINet utilise la même chose Qu'InternetExplorer utilise, de sorte que vous obtenez également n'importe quels paramètres de connexion et de proxy définis par InternetExplorer gratuitement.

25
répondu Lars Truijens 2008-11-19 12:42:26

appeler un service Web reposant en utilisant Indy est assez simple.

ajouter IdHTTP à votre clause d'utilisation. Rappelez-vous que IdHTTP a besoin du préfixe "HTTP://" sur vos URLs.

function GetURLAsString(const aURL: string): string;
var
  lHTTP: TIdHTTP;
begin
  lHTTP := TIdHTTP.Create;
  try
    Result := lHTTP.Get(aURL);
  finally
    lHTTP.Free;
  end;
end;
33
répondu Bruce McGee 2016-03-20 12:34:28

en fait le code dans la réponse acceptée n'a pas fonctionné pour moi. Je l'ai donc modifié un peu pour qu'il renvoie la chaîne et ferme tout avec élégance après l'exécution. Exemple retourne les données récupérées comme UTF8String de sorte qu'il fonctionnera bien pour ASCII aussi bien que pour les pages 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;

espérons que cela aide quelqu'un comme moi qui était à la recherche de code facile Comment récupérer le contenu de la page dans Delphi. Cheers, Aldis:)

13
répondu Aldis 2011-10-13 20:45:24

si vous pouvez télécharger vers un fichier, vous pouvez utiliser TDownloadURL depuis L'unité ExtActns. Beaucoup plus simple que D'utiliser WinInet directement.

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;

il est également possible d'obtenir des notifications de progrès en utilisant ceci. Il suffit d'assigner un gestionnaire d'événements à L'événement OnDownloadProgress de TDownloadURL.

7
répondu Michael Madsen 2014-08-30 07:15:07

dans les nouvelles versions Delphi il est préférable d'utiliser THTTPClient de System.Net.HttpClient unité, car il est standard et multi-plateforme. Un exemple Simple est

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;
6
répondu EugeneK 2016-12-30 17:44:31

utiliser L'API HTTP de Windows pourrait être facile aussi.

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;

dans le code ci-dessus, J'implique que COM a déjà été initialisé pour le fil principal VCL. Il pourrait ne pas être toujours le cas pour les applications simplistes ou pour les applications LCL. Aussi il serait certainement pas le cas pour les async (multithread).

ci-dessous est la puce du code réel en cours d'exécution. Note - la fonctionnalité est un bonus. Il n'est pas nécessaire de travailler. Donc, bien que j'émette des demandes, Je ne me soucie pas de leurs résultats, ce résultat est ignoré et jeté.

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;
4
répondu Arioch 'The 2017-06-16 14:16:46

utilisez la fonction Synapse TCP/IP dans L'unité HTTPSEND ( HTTPGetText, HTTPGetBinary ). Il fera L'attraction HTTP pour vous et ne nécessite pas de DLL externe autre que Winsock. La dernière version de SVN fonctionne parfaitement dans Delphi 2009. Cela utilise des appels de fonction de blocage, donc pas d'événements à programmer.

mise à jour: les unités sont très légères, et ne sont pas basées sur des composants. La dernière version de SVN fonctionne parfaitement bien à Delphi XE4 aussi.

2
répondu skamradt 2013-06-23 19:02:14

si votre application est Windows-seulement, je suggérerais d'utiliser WinSock. C'est assez simple, permet d'exécuter n'importe quelle requête HTTP, peut fonctionner à la fois de manière synchrone et asynchrone (en utilisant WSASend/WSARecv sans blocage avec des callbacks ou bon vieux send/recv dans un thread dédié).

0
répondu user2024154 2013-11-15 18:14:03