TIndyHTTP 的POST 方法可以非常快速地多次调用吗?
Can TIndyHTTP's POST method be called multiple times very quickly?
我正在使用 Indy ver 10.5498 post 一些 multipart/form 数据,包括 api 的附件。我的代码改编自 Remy 在 post, with protocol error handling taken from 中提供给我的代码。
我现在使用的代码运行良好,在 post.
后大约 2 秒,我从服务器收到了包含数据的响应
但是有时我可能需要非常快速地多次执行 post,例如通过循环遍历从数据库中编辑的数据集 return 并为每个执行 post记录。
有什么我需要知道的或我需要编写的任何特殊代码来处理我可能在第一个 POST 完成发送之前进行第二个 POST 的情况(或者至少在收到服务器的响应之前?或者 POST 是一个阻塞调用,直到收到响应才 return 控制?
目前 TIdHTTP 组件是放在表单上的,不是动态创建的。我可以为每个 post 创建一个新的 TIdHTTP 对象,然后在必要时销毁它。
我现在用来执行 post 的代码如下
function TForm1.Upload(url: string; params, filenames: TStrings): string;
var
FormData : TIdMultiPartFormDataStream;
ResponseText : string;
i : integer;
begin
FormData := TIdMultiPartFormDataStream.Create;
try
for i := 0 to params.Count - 1 do
FormData.AddFormField(params.Names[i], params.ValueFromIndex[i]);
for i := 0 to filenames.Count - 1 do
FormData.AddFile('attachment', filenames[i]);
//add authorisation header
IdHTTP1.Request.CustomHeaders.Add('Authorization:Basic ' + U_generalStuff.base64encodeStr(ATHORISATION_STR));
//way to use just one try except yet get the full text server response whether its a 400 error or a success response
//see
// Make sure it uses HTTP 1.1, not 1.0, and disable EIdHTTPProtocolException on errors
IdHTTP1.ProtocolVersion := pv1_1;
IdHTTP1.HTTPOptions := IdHTTP1.HTTPOptions + [hoKeepOrigProtocol, hoNoProtocolErrorException, hoWantProtocolErrorContent];
try
ResponseText := IdHTTP1.Post(url, FormData); //post to the api
except
on E: Exception do
begin
ResponseText := E.ClassName + ': ' + E.message;
raise;
end;
end; //try-except
finally
result := ResponseText;
end; //try finally
end;
我已经看到 讨论线程和使用并行库。这是我应该调查以回答我的问题的东西吗?
像 Indy 中的大多数东西一样,TIdHTTP.Post()
是一个 同步 操作。它不会 return 返回给调用者,直到收到完整的响应(或直到发生错误)。所以,如果你在一个简单的循环中调用 TIdHTTP.Post()
,你不能发送一个新的 POST
请求,直到前一个请求完全完成。如果你需要这样做,你将不得不通过在多个工作线程中调用它来调用 TIdHTTP.Post()
异步 (并给每个线程它自己的 TIdHTTP
对象,因为您不能在多个并发请求中重复使用 TIdHTTP
对象。
我正在使用 Indy ver 10.5498 post 一些 multipart/form 数据,包括 api 的附件。我的代码改编自 Remy 在
但是有时我可能需要非常快速地多次执行 post,例如通过循环遍历从数据库中编辑的数据集 return 并为每个执行 post记录。
有什么我需要知道的或我需要编写的任何特殊代码来处理我可能在第一个 POST 完成发送之前进行第二个 POST 的情况(或者至少在收到服务器的响应之前?或者 POST 是一个阻塞调用,直到收到响应才 return 控制?
目前 TIdHTTP 组件是放在表单上的,不是动态创建的。我可以为每个 post 创建一个新的 TIdHTTP 对象,然后在必要时销毁它。
我现在用来执行 post 的代码如下
function TForm1.Upload(url: string; params, filenames: TStrings): string;
var
FormData : TIdMultiPartFormDataStream;
ResponseText : string;
i : integer;
begin
FormData := TIdMultiPartFormDataStream.Create;
try
for i := 0 to params.Count - 1 do
FormData.AddFormField(params.Names[i], params.ValueFromIndex[i]);
for i := 0 to filenames.Count - 1 do
FormData.AddFile('attachment', filenames[i]);
//add authorisation header
IdHTTP1.Request.CustomHeaders.Add('Authorization:Basic ' + U_generalStuff.base64encodeStr(ATHORISATION_STR));
//way to use just one try except yet get the full text server response whether its a 400 error or a success response
//see
// Make sure it uses HTTP 1.1, not 1.0, and disable EIdHTTPProtocolException on errors
IdHTTP1.ProtocolVersion := pv1_1;
IdHTTP1.HTTPOptions := IdHTTP1.HTTPOptions + [hoKeepOrigProtocol, hoNoProtocolErrorException, hoWantProtocolErrorContent];
try
ResponseText := IdHTTP1.Post(url, FormData); //post to the api
except
on E: Exception do
begin
ResponseText := E.ClassName + ': ' + E.message;
raise;
end;
end; //try-except
finally
result := ResponseText;
end; //try finally
end;
我已经看到
像 Indy 中的大多数东西一样,TIdHTTP.Post()
是一个 同步 操作。它不会 return 返回给调用者,直到收到完整的响应(或直到发生错误)。所以,如果你在一个简单的循环中调用 TIdHTTP.Post()
,你不能发送一个新的 POST
请求,直到前一个请求完全完成。如果你需要这样做,你将不得不通过在多个工作线程中调用它来调用 TIdHTTP.Post()
异步 (并给每个线程它自己的 TIdHTTP
对象,因为您不能在多个并发请求中重复使用 TIdHTTP
对象。