Можно ли очень быстро вызывать метод POST TIndyHTTP несколько раз?

Я использую Indy ver 10.5498 для отправки некоторых данных из нескольких частей/форм, включая прикрепленный файл, в API. Мой код адаптирован из кода, предоставленного мне Реми в этот пост с обработкой ошибок протокола, взятой из здесь. Код, который у меня сейчас есть, работает хорошо, и я получаю ответ от сервера с данными примерно через 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;

С тех пор я видел этот пост, в котором говорится о многопоточность и использование параллельной библиотеки. Это что-то, что я должен исследовать, чтобы ответить на мой вопрос?


person user2834566    schedule 09.05.2019    source источник


Ответы (1)


Как и большинство вещей в Indy, TIdHTTP.Post() является синхронной операцией. Он не возвращается обратно вызывающей стороне до тех пор, пока ответ не будет получен полностью (или пока не произойдет ошибка). Таким образом, если вы вызываете TIdHTTP.Post() в простом цикле, вы НЕ МОЖЕТЕ отправить новый запрос POST до тех пор, пока предыдущий запрос не будет полностью завершен. Если вам нужно это сделать, вам придется вызывать TIdHTTP.Post() асинхронно, вызывая его в нескольких рабочих потоках (и давать каждому потоку свой собственный объект TIdHTTP, так как вы не можете повторно использовать объект TIdHTTP в нескольких одновременных потоках). Запросы).

person Remy Lebeau    schedule 10.05.2019
comment
Спасибо. Теперь я понимаю поведение, с которым я могу работать. - person user2834566; 12.05.2019