Запрос DELETE с телом TRESTRequest

Я знаю, что TRESTRequest не предназначен для отправки body запросов DELETE. Но в настоящее время многие серверы принимают такие запросы.

Есть ли способ как-то обойти этот недостаток компонента?

Например, , это можно сделать с помощью TIdHTTP.

P.S. Действительно, TRESTRequest поддерживает запрос DELETE с помощью body в Embarcadero Delphi версии 10.3 и более поздних версий. (версия 10.2 и более ранние – не поддерживается)

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я знаю, что TRESTRequest не предназначен для отправки тела DELETE запросов.

На самом деле, так оно и задумано, по крайней мере, в Delphi 10.3 и более поздних версиях (у меня нет Delphi 10.2, чтобы проверить).

Есть ли способ как-то обойти этот недостаток компонента?

Добавьте элемент в свойство TRESTRequest.Params и присвойте его свойству Kind значение pkREQUESTBODY. Вы можете хранить данные о своем теле в свойстве Stream или Value элемента.

Альтернативно вы можете использовать TRESTRequest.AddBody(), который добавит для вас элемент pkREQUESTBODY в TRESTRequest.Params.

Да, мы можем добавить тело через TRESTRequest.AddBody() или Params.AddItemKind := pkREQUESTBODY Но если мы вызовем процедуру RESTRequest.Execute с RESTRequest.Method := rmDELETE, то в любом случае запрос будет отправлен без body. В версии 10.3 это работает по-другому?

HeathRow 10.04.2024 20:03

Я сам не пробовал, но просто смотрю исходный код TRESTRequest.Execute() в 10.3 и 12.0, если тело присутствует, то для него готовится TStream и передается TRESTClient.HttpClient.Delete() (TRESTHTTP), который передает его THTTPClient.Execute(). Навскидку я не вижу там ничего, что могло бы помешать отправке тела для запроса DELETE, если только это не происходит внутри какого-либо API ОС, который THTTPClient использует внутри себя (например, WinHTTP в Windows и т. д.).

Remy Lebeau 10.04.2024 21:04

Посмотрите поближе. 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 — данные ответа.

HeathRow 10.04.2024 22:52

В 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 без обновления.

Remy Lebeau 10.04.2024 23:36

Получается, что моя версия - 10.2 была последней, которая не поддерживала отправку body с delete запросами? Я такой «счастливчик»! Спасибо за совет. Что означает СОЛ?

HeathRow 11.04.2024 12:13

@HeathRow SOL = "Черт возьми, не повезло"

Remy Lebeau 11.04.2024 19:22

Другие вопросы по теме