Как отправить запрос DELETE с помощью Indy?

Я попытался несколько примеров поиска в Интернете о том, как отправить запрос DELETE с TidHTTP без успеха...

Я работаю с Delphi Indy 10.0.52. По-видимому, в объекте TIdHTTP нет такого метода, как Delete. Является ли это возможным? Я что-то здесь упускаю... Помогите!

Я закончил с чем-то (не работает), как это:

procedure TRestObject.doDelete( deleteURL:String );
var
  res : TStringStream;
begin
  res := TStringStream.Create('');
  http := TidHTTP creation and init...
  try
    http.Request.Method := IdHTTP.hmDelete;
    http.Put( deleteURL, res );
  except
    on E: EIdException do
      showmessage('Exception (class '+ E.ClassName +'): ' + E.Message);
    on E: EIdHTTPProtocolException do
      showmessage('Protocol Exception (HTTP status '+ IntToStr(E.ErrorCode) +'): ' + E.Message);
    on E: EIdSocketError do
      showmessage('Socket Error ('+ IntToStr(E.LastError) +'): ' + E.Message);
  end;
  res.Free;
end;

Это метод в объекте, который уже обрабатывает GET, PUT, POST для веб-сервиса RESTful, реализованного с помощью django-tastypie. У меня есть все разрешения и проверки подлинности, установленные на этапе инициализации объекта.

2 ответа

Решение

Как следует из названия, TIdHTTP.Put() заставляет метод запроса PUT, Таким образом, вы не можете использовать его для отправки других запросов.

10.0.52 - очень старая версия, вам действительно нужно обновить ее до последней версии 10.6.0, которая имеет TIdHTTP.Delete() метод:

http.Delete(deleteURL, res);

Если это не вариант, то чтобы отправить пользовательский запрос с 10.0.52, вам нужно будет позвонить TIdHTTP.DoRequest() вместо. Тем не мение, DoRequest() объявлен как protected поэтому для его вызова вам понадобится класс доступа, например:

type
  TIdHTTPAccess = class(TIdHTTP)
  end;

TIdHTTPAccess(http).DoRequest('DELETE', deleteURL, nil, res, []);

Вы можете проверить этот клиент Delphi отдыха https://github.com/fabriciocolombo/delphi-rest-client-api

Посмотрите в файле HttpConnectionIndy.pas, как реализовано удаление.

procedure TIdHTTP.Delete(AURL: string);
begin
  try
    DoRequest(Id_HTTPMethodDelete, AURL, Request.Source, nil, []);
  except
    on E: EIdHTTPProtocolException do
    raise EHTTPError.Create(e.Message, e.ErrorMessage, e.ErrorCode);
  end;
end;
Другие вопросы по тегам