Я использую THTTPClient в Delphi 10.3 для выполнения операции POST и получения данных с сервера.Параметры в формате JSON.Проблема:
- При компиляции как Win32 приложение прекрасно работает как при выполнении асинхронного вызова, так и без него.
- При компиляции как Android приложение, оно не работает в асинхронном вызове и нормально работает в обычном режиме.
Ошибка сбоя указывает на то, что запрос как-то не передает параметры json (что происходит только в асинхронном режиме).Режим). Например: если удаленному серверу требуется передать два параметра (скажем, имя и возраст), я получу удаленную ошибку «имя является обязательным полем».
Мой кодоснованный на образце загрузки Delphi.Что-то, что я должен изменить, чтобы это работало в Android?Спасибо!
Вот соответствующий код:
//the content of mmoParams.Text is a JSON string:
//{"name":"somebody","salary":"1000","age":"51"}
Params := TStringStream.Create(mmoParams.Text, TEncoding.UTF8);
Params.Position := 0;
// prepare the request
HTTPClient.ContentType := 'application/json';
HTTPClient.Accept := 'application/json';
if chkAsync.IsChecked then begin
// prepare the request
HTTPClient.ContentType := 'application/json';
HTTPClient.Accept := 'application/json';
// make the request and handle in the callback
HTTPResult:= HTTPClient.BeginPost(DoEndPost,edtURL.Text,Params);
end
else begin
// make the request
HTTPResponse := HTTPClient.Post(edtURL.Text,Params);
// handle response
lblStatusCode.Text := HTTPResponse.StatusCode.ToString;
mmoResult.Text := HTTPResponse.ContentAsString(TEncoding.UTF8);
end;
и вот процедура обратного вызова, когда выполняется асинхронный вызов (BeginPost).
procedure TMainForm.DoEndPost(const AsyncResult: IAsyncResult);
begin
try
HTTPResponse := THTTPClient.EndAsyncHTTP(AsyncResult);
TThread.Synchronize(nil,
procedure
begin
// handle result
lblStatusCode.Text := HTTPResponse.StatusCode.ToString;
mmoResult.Text := HTTPResponse.ContentAsString(TEncoding.UTF8);
end);
finally
end;
end;