Как отправить запрос 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;