Я знаю, что TRESTRequest
не предназначен для отправки body
запросов DELETE
. Но в настоящее время многие серверы принимают такие запросы.
Есть ли способ как-то обойти этот недостаток компонента?
Например, , это можно сделать с помощью TIdHTTP
.
P.S. Действительно, TRESTRequest
поддерживает запрос DELETE
с помощью body
в Embarcadero Delphi версии 10.3 и более поздних версий. (версия 10.2 и более ранние – не поддерживается)
Я знаю, что
TRESTRequest
не предназначен для отправки телаDELETE
запросов.
На самом деле, так оно и задумано, по крайней мере, в Delphi 10.3 и более поздних версиях (у меня нет Delphi 10.2, чтобы проверить).
Есть ли способ как-то обойти этот недостаток компонента?
Добавьте элемент в свойство TRESTRequest.Params
и присвойте его свойству Kind
значение pkREQUESTBODY
. Вы можете хранить данные о своем теле в свойстве Stream
или Value
элемента.
Альтернативно вы можете использовать TRESTRequest.AddBody()
, который добавит для вас элемент pkREQUESTBODY
в TRESTRequest.Params
.
Я сам не пробовал, но просто смотрю исходный код TRESTRequest.Execute()
в 10.3 и 12.0, если тело присутствует, то для него готовится TStream
и передается TRESTClient.HttpClient.Delete()
(TRESTHTTP
), который передает его THTTPClient.Execute()
. Навскидку я не вижу там ничего, что могло бы помешать отправке тела для запроса DELETE
, если только это не происходит внутри какого-либо API ОС, который THTTPClient
использует внутри себя (например, WinHTTP в Windows и т. д.).
Посмотрите поближе. TRESTHTTP
имеет две версии Execute
. Для GET
и DELETE
— используйте TRESTHTTP.Execute(const AMethod: string; AURL: string; AResponseContent: TStream)
. Для PUT
и POST
- TRESTHTTP.Execute(const AMethod: string; AURL: string; ASource, AResponseContent: TStream)
, где ASource
— это body
запроса. Таким образом, запрос DELETE не отправляет тело. AResponseContent — данные ответа.
В 10.3 и более поздних версиях. TRESTHTTP.Delete()
имеет перегрузку, которая принимает поток ASource
, и эта перегрузка вызывается TCustomRESTRequest.Execute()
для запроса DELETE
: case Method of ... TRESTRequestMethod.rmDELETE: FClient.HTTPClient.Delete(LURL, LBodyStream, LResponseStream); ... end;
Похоже, что эта функция отсутствует в 10.2, а TRESTHTTP.Execute()
есть private
, поэтому вы не можете вызвать ее самостоятельно. Итак, я думаю, что вы SOL без обновления.
Получается, что моя версия - 10.2 была последней, которая не поддерживала отправку body
с delete
запросами? Я такой «счастливчик»! Спасибо за совет. Что означает СОЛ?
@HeathRow SOL = "Черт возьми, не повезло"
Да, мы можем добавить тело через
TRESTRequest.AddBody()
илиParams.AddItem
Kind := pkREQUESTBODY
Но если мы вызовем процедуруRESTRequest.Execute
сRESTRequest.Method := rmDELETE
, то в любом случае запрос будет отправлен безbody
. В версии 10.3 это работает по-другому?