可以快速地多次调用TIndyHTTP的POST方法吗?

时间:2019-05-09 16:09:17

标签: post indy

我正在使用Indy版本10.5498将一些包含附件的多部分/表单数据发布到api。我的代码改编自this帖子中Remy提供给我的代码,协议错误处理取自here。 我现在拥有的代码运行良好,发布帖子后大约2秒钟,我从服务器返回了响应,并提供了数据。

但是,有时我可能需要非常快地执行多次发布操作,例如,通过遍历从数据库返回的数据集并为每条记录执行一次发布操作。

我是否需要知道任何信息或需要编写任何特殊代码,以应对可能在第一个POST完成发送之前(或至少在服务器的响应完成之前)进行第二个POST的情况还是POST是阻止调用,直到收到响应后才返回控制权?

目前,TIdHTTP组件已放置在表单上,​​而不是动态创建的。我可以为每个帖子创建一个新的TIdHTTP对象,然后在需要时销毁它。

我现在用于发布帖子的代码如下

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 https://stackoverflow.com/questions/54475319/accessing-json-data-after-indy-post
    // 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;

此后,我已经看到this post谈论线程化和使用并行库。那是我应该调查以回答我的问题的东西吗?

1 个答案:

答案 0 :(得分:1)

与Indy中的大多数事情一样,TIdHTTP.Post()同步操作。直到收到完整的响应(或直到发生错误),它才返回给调用方。因此,如果您在一个简单的循环中调用TIdHTTP.Post(),则您无法发送新的POST请求,直到前一个请求完全完成为止。如果需要这样做,则必须通过在多个工作线程中调用TIdHTTP.Post() 来异步调用它们(并为每个线程提供自己的TIdHTTP对象)不能在多个同时请求中重用TIdHTTP对象。