如何用Indy发送DELETE请求?

时间:2014-01-08 17:20:38

标签: delphi http indy indy10

我在网上搜索了几个关于如何使用TIDHTTP发送DELETE请求但没有成功的示例...

我正在使用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到使用django-tastypie实现的RESTful Web服务的方法。我在对象的初始阶段设置了所有权限和身份验证。

2 个答案:

答案 0 :(得分:5)

顾名思义,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, []);

答案 1 :(得分:2)

您可以查看此delphi rest客户端 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;