Я использую 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;
С тех пор я видел этот пост, в котором говорится о многопоточность и использование параллельной библиотеки. Это что-то, что я должен исследовать, чтобы ответить на мой вопрос?