如何使用异步TNetHTTPClient?我尝试了以下代码,但它显示错误。
procedure TForm1.Button1Click(Sender: TObject);
var
httpclient: TNetHTTPClient;
output: string;
begin
httpclient := TNetHTTPClient.Create(nil);
try
httpclient.Asynchronous := True;
output := httpclient.Get('https://google.com').ContentAsString;
finally
httpclient.Free;
end;
end;
错误:
查询标题时出错:对于请求的操作,句柄处于错误的状态
2条答案
按热度按时间2admgd591#
在异步模式下,顾名思义,客户端在后台线程中异步运行请求。
当执行以下代码时,
ContentAsString
失败,因为此时请求未完成。如果您想在异步模式下使用HTTP客户端,则必须使用完成处理程序在请求完成后运行相应的代码。
在异步模式下使用HTTP客户端通常比在后台线程的同步模式下使用它更复杂(特别是从内存管理方面)。
下面是使用匿名后台线程的等效示例:
当然,您也可以使用
TTask
或自定义线程来代替匿名线程。tuwxkamq2#
这里你有两个版本-一个用于GET,一个用于POST(带响应)。小心你想使用它的服务器上的Modsecurity问题和其他服务器设置,这可能会导致代码无法按预期工作(就像我在服务器上处理POST时发生的那样)。
对于POST,我使用Params.Add('input =' + TNetEncoding.URL.Encode(AText));你也可以使用text=代替input=,我将响应存储在URLMemo中,你可以根据需要更改它。