Пишу мобильное приложение под Android на Delphi 10. Моя программа отправляет post и get запросы использую компонент THTTPClient. Скрипт на сервере принимает запросы в формате json, по этому при отправке запроса нужно обязательно указать в заголовке "Content Type: application/json". Дело в том, что у меня не получается изменить Content Type. При отправке Get запроса он изменятся, а при отправке Post запроса - нет.
Использую примерно такой код:
procedure ThomeForm.Button1Click(Sender: TObject);
var
data: TStringList;
H: THTTPClient;
begin
data := TStringList.Create;
data.Add('{"phone":"' + HomeForm.Phone.Text + '"}');
h := THTTPClient.Create;
h.ContentType := 'application/json';
h.Accept := 'application/json, text/plain, */*';
log.Text := h.Post('https://site.ru/api/phone', data).ContentAsString();
end;
Почему такое происходит и как это исправить?
Ответ
У HttpClient есть 4 перегруженных (overload) Post метода:
// Post a raw file without multipart info
function Post(
const AURL: string;
const ASourceFile: string;
const AResponseContent: TStream = nil;
const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload;
// Post TStrings values adding multipart info
function Post(
const AURL: string;
const ASource: TStrings;
const AResponseContent: TStream = nil;
const AEncoding: TEncoding = nil;
const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload;
// Post a stream without multipart info
function Post(
const AURL: string;
const ASource: TStream;
const AResponseContent: TStream = nil;
const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload;
// Post a multipart form data object
function Post(
const AURL: string;
const ASource: TMultipartFormData;
const AResponseContent: TStream = nil;
const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload;
Первый и третий методы отправляют данные как есть, второй метод (которым вы воспользовались) отправляет данные как application/x-www-form-urlencoded, четвёртый метод отправляет данные как multipart/form-data
Таким образом, вам нужно использовать первый или третий метод, если вы хотите отправлять сырые данные с указанием своего Content-Type.
Пример, с использованием третьего метода:
var
data: TStringStream;
H: THTTPClient;
begin
data := TStringStream.Create;
try
data.WriteString('{"phone":"' + HomeForm.Phone.Text + '"}');
h := THTTPClient.Create;
try
h.ContentType := 'application/json';
h.Accept := 'application/json, text/plain, */*';
log.Text := h.Post('https://site.ru/api/phone', data).ContentAsString();
finally
h.Free;
end;
finally
data.Free;
end;
end;
Комментариев нет:
Отправить комментарий