Страницы

Поиск по вопросам

среда, 12 июня 2019 г.

Как изменить Content Type в THTTPClient Delphi

Пишу мобильное приложение под 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;

Комментариев нет:

Отправить комментарий