我正在使用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谈论线程化和使用并行库。那是我应该调查以回答我的问题的东西吗?
答案 0 :(得分:1)
与Indy中的大多数事情一样,TIdHTTP.Post()
是同步操作。直到收到完整的响应(或直到发生错误),它才返回给调用方。因此,如果您在一个简单的循环中调用TIdHTTP.Post()
,则您无法发送新的POST
请求,直到前一个请求完全完成为止。如果需要这样做,则必须通过在多个工作线程中调用TIdHTTP.Post()
来异步调用它们(并为每个线程提供自己的TIdHTTP
对象)不能在多个同时请求中重用TIdHTTP
对象。