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.
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.
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;
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:)
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.
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;
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;
- https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa382925.aspx
- http://forum.lazarus.freepascal.org/index.php?topic=14609.0
- enregistrer un fichier téléchargé via WinHTTP sur disque, en utilisant Delphi XE
- comment utiliser "WinHttp.WinHttpRequest.5.1" de manière asynchrone?
- http://www.delphigroups.info/2/4/217167.html
- https://github.com/fabriciocolombo/delphi-rest-client-api/blob/master/src/HttpConnectionWinHttp.pas
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;
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.
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é).