45 votes

Quelle est la manière la plus simple d'appeler une url Http GET avec Delphi ?

Il y a un service web que je veux appeler dans mon application, je peux l'utiliser en important le WSDL ou en utilisant simplement "HTTP GET" avec l'URL et les paramètres, je préfère cette dernière solution parce qu'elle est simple.

Je sais que je peux utiliser le code indy idhttp.get, pour faire le travail, mais il s'agit d'une chose très simple et je ne veux pas ajouter un code indy complexe à mon application.

MISE À JOUR Je suis désolé si je n'ai pas été clair, je voulais dire par "ne pas ajouter de code indy complexe", que je ne veux pas ajouter de composants indy pour cette simple tâche, et que je préfère une méthode plus légère pour cela.

0 votes

Pensez-vous que l'utilisation de HTTP GET est suffisante pour invoquer une fonction de webservice ?

0 votes

Il l'est s'il s'agit d'un service web RESTful.

0 votes

Je ne savais pas que REST pouvait aussi avoir un wsdl

34voto

Bruce McGee Points 12225

L'appel d'un service web RESTful à l'aide d'Indy est assez simple.

Ajoutez IdHTTP à votre clause d'utilisation. N'oubliez pas que IdHTTP a besoin du préfixe "HTTP://" dans vos URL.

function GetURLAsString(const aURL: string): string;
var
  lHTTP: TIdHTTP;
begin
  lHTTP := TIdHTTP.Create;
  try
    Result := lHTTP.Get(aURL);
  finally
    lHTTP.Free;
  end;
end;

5 votes

La question était de ne pas ajouter de code Indy complexe. Le code n'est pas complexe.

0 votes

Bruce, Lars a raison, j'ai dit dans mes questions que je ne voulais pas utiliser indyt "idhttp.get", c'est la façon la plus simple mais je voulais la façon la plus claire :)

1 votes

L'option la plus légère consiste à utiliser du code externe, qu'il s'agisse d'Indy, de Synapse ou de WinINet. Si vous ne pouvez ou ne voulez pas utiliser les composants ou les classes Delphi, utilisez les fonctions d'enveloppe de Delphi autour de WinINet. Il s'agit également d'un code externe, mais au moins la DLL est installée avec Windows.

29voto

Lars Truijens Points 24005

Vous pouvez utiliser le API WinINet 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 les mêmes éléments qu'InternetExplorer, ce qui vous permet d'obtenir gratuitement tous les paramètres de connexion et de proxy définis par InternetExplorer.

1 votes

Comme le dit bruce, si vous aviez un IE mal configuré pour utiliser un proxy qui est en panne, par exemple, vous seriez également dans l'embarras. Obscur et frustrant, si cela se produit.

1 votes

J'ai appris par expérience que vous obtenez également tous les bogues de wininet.dll d'IE qui est installé sur le système de votre client, gratuitement, y compris le redoutable bogue TIMEOUT. SOYEZ VIGILANTS.

0 votes

@Warren : ces derniers sont corrigés dans les mises à jour de sécurité et les services packs, alors que votre propre code ou celui de n'importe qui d'autre ne bénéficie pas du même examen critique de la part d'autant d'yeux.

17voto

Aldis Points 131

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 effectivement une chaîne de caractères et qu'il ferme tout de manière élégante après l'exécution. L'exemple renvoie les données récupérées sous forme de chaîne UTF8, il fonctionnera donc aussi bien pour les pages ASCII 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;

J'espère que cela aidera quelqu'un qui, comme moi, cherchait un code simple pour récupérer le contenu d'une page en Delphi. Merci, Aldis :)

0 votes

Cela ne fonctionne que si la réponse est effectivement codée en ASCII ou UTF-8, ce qui n'est pas garanti.

7voto

Michael Madsen Points 30610

Si le téléchargement vers un fichier est possible, vous pouvez utiliser TDownloadURL de l'unité ExtActns. C'est 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 progression lors de l'utilisation de ce système. Il suffit d'affecter un gestionnaire d'événement à l'événement OnDownloadProgress de TDownloadURL.

2voto

skamradt Points 13049

Utiliser le Synapse TCP/IP dans l'unité HTTPSEND ( HTTPGetText, HTTPGetBinary ). Il effectuera le tirage HTTP pour vous et ne nécessite aucune DLL externe autre que Winsock. La dernière version SVN fonctionne parfaitement dans Delphi 2009. Elle utilise des appels de fonction bloquants, 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 du SVN fonctionne parfaitement dans Delphi XE4.

1 votes

Les appels HTTP en Indy sont également bloquants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X