用Delphi调用Http GET url最简单的方法是什么?

在我的应用程序中有一个Web服务需要调用,我可以在导入WSDL时使用它,或者只使用带有URL和参数的“HTTP GET”,所以我更喜欢后面的,因为它很简单。

我知道我可以使用indy idhttp.get来完成这项工作,但这是非常简单的事情,我不想将复杂的indy代码添加到我的应用程序中。

更新 :对不起,如果我不清楚,我的意思是“不添加复杂的indy代码”,我不想为这个简单的任务添加indy组件,而更喜欢更轻的方式。

你可以像这样使用WinINet API :

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; 

来源: http : //www.scalabium.com/faq/dct0080.htm

WinINet API使用与InternetExplorer使用的相同的东西,因此您也可以免费获得InternetExplorer设置的任何连接和代理设置。

使用Indy调用REST风格的Web服务非常简单。

将IdHTTP添加到您的使用条款。 请记住,IdHTTP在您的url上需要使用“HTTP://”前缀。

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

其实代码在接受的答案没有为我工作。 所以我修改了一下,所以它实际上返回String,并在执行完后closures所有东西。 示例将检索到的数据作为UTF8String返回,因此对于ASCII和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; 

希望这有助于像我这样的人在Delphi中寻找简单的代码如何检索页面内容。 干杯,Aldis 🙂

如果可以下载到文件,则可以使用ExtActns单元中的TDownloadURL。 比直接使用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; 

使用此function时也可以获得进度通知。 只需将一个事件处理程序分配给TDownloadURL的OnDownloadProgress事件。

使用Windows HTTP API可能也很容易。

 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; 

在上面的代码中,我暗示COM已经初始化为主VCL线程。 据说对于简单的应用程序或LCL应用程序来说,情况可能并非总是如此。 也绝对不是这样的asynchronous(multithreading)的工作。

以下是从运行的真实代码中剪下来的代码。 注 – function是奖金。 这不是必需的工作。 所以当我做请求的时候,我不关心他们的结果,结果被忽略和倾倒。

 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; 

在较新的Delphi版本中,最好使用System.Net.HttpClient单元中的THTTPClient ,因为它是标准的和跨平台的。 简单的例子是

 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; 

使用HTTPSEND单元( HTTPGetText,HTTPGetBinary )中的Synapse TCP / IPfunction。 它将为你做HTTP拉,不需要任何外部DLL的Winsock以外。 最新的SVN版本在Delphi 2009中运行得非常好。它使用了阻塞函数调用,所以没有事件可以编程。

更新:单位很轻,不是基于组件的。 从SVN的最新版本也在Delphi XE4中运行得非常好。

如果您的应用程序是仅Windows,我会build议使用WinSock。 它足够简单,允许执行任何HTTP请求,可以同步和asynchronous工作(使用具有callback的非阻塞WSASend / WSARecv或在专用线程中良好的旧send / recv)。