如何使用Indy 9发送DELETE请求?

时间:2017-03-13 20:34:26

标签: delphi indy indy-9

我正在尝试使用Indy 9发送HTTP DELETE请求。

尝试(like that):

type
  TIdHTTPAccess = class(TIdHTTP)
  end;

TIdHTTPAccess(IdHttp).DoRequest(hmDelete, deleteURL, nil, nil);

这不起作用,因为在TIdHTTPProtocol.BuildAndSendRequest中跳过了hmDelete。

有没有机会使用Indy 9发送HTTP DELETE请求?

Delpphi 7,Indy 9.00.10,IdHTTP单位的一部分;

procedure TIdHTTPProtocol.BuildAndSendRequest(AURI: TIdURI);
...
  case Request.Method of
    hmHead: FHTTP.WriteLn('HEAD ' + Request.URL + ' HTTP/' + ProtocolVersionString[FHTTP.ProtocolVersion]); {do not localize}
    hmGet: FHTTP.WriteLn('GET ' + Request.URL + ' HTTP/' + ProtocolVersionString[FHTTP.ProtocolVersion]); {do not localize}
    hmPost: FHTTP.WriteLn('POST ' + Request.URL + ' HTTP/' + ProtocolVersionString[FHTTP.ProtocolVersion]); {do not localize}
    // HTTP 1.1 only
    hmOptions: FHTTP.WriteLn('OPTIONS ' + Request.URL + ' HTTP/' + ProtocolVersionString[FHTTP.ProtocolVersion]); {do not localize}
    hmTrace: FHTTP.WriteLn('TRACE ' + Request.URL + ' HTTP/' + ProtocolVersionString[FHTTP.ProtocolVersion]); {do not localize}
    hmPut: FHTTP.WriteLn('PUT ' + Request.URL + ' HTTP/' + ProtocolVersionString[FHTTP.ProtocolVersion]); {do not localize}
    hmConnect: FHTTP.WriteLn('CONNECT ' + Request.URL + ' HTTP/' + ProtocolVersionString[FHTTP.ProtocolVersion]); {do not localize}
  end;
...

1 个答案:

答案 0 :(得分:3)

直接调用TIdHTTP.DoRequest()是在Indy 9中发送DELETE请求的正确方法。使用访问者类是一种选择。另一种选择是从TIdHTTP派生一个新组件,以添加自己调用Delete()的{​​{1}}方法(非常类似于Indy 10中的DoRequest()):

TIdHTTP

然而,话虽如此,您使用的是Indy 9的过时版本。最后一个版本是9.0.50,其type TMyHTTP = class(TIdHTTP) public procedure Delete(AURL: string; AResponseContent: TStream); overload; function Delete(AURL: string): string; overload; end; procedure TMyHTTP.Delete(AURL: string; AResponseContent: TStream); begin DoRequest(hmDelete, AURL, nil, AResponseContent); end; function TMyHTTP.Delete(AURL: string): string; var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; try Delete(AURL, Stream); SetLength(Result, Stream.Size); Move(PChar(Stream.Memory)^, PChar(Result)^, Stream.Size); finally Stream.Free; end; end; 代码与您显示的代码不同:< / p>

BuildAndSendRequest()

您在遇到问题时遇到的问题已在Indy 9的const ProtocolVersionString: array[TIdHTTPProtocolVersion] of string = ('1.0', '1.1'); {do not localize} MethodString: array[TIdHTTPMethod] of String = ('HEAD', 'GET', 'POST', 'OPTIONS', 'TRACE', 'PUT', 'DELETE', 'CONNECT'); {do not localize} ... procedure TIdHTTPProtocol.BuildAndSendRequest(AURI: TIdURI); var ... begin ... FHTTP.WriteLn(MethodString[Request.Method] + ' ' + Request.URL + ' HTTP/' + ProtocolVersionString[FHTTP.ProtocolVersion]); {do not localize} ... end; 文件的最新修订版中得到解决(2007年12月24日的SVN修订版35):

  

更新了TIdHTTPProtocol.BuildAndSendRequest()以使用方法名称的字符串数组,而不是使用“case of”语句,最初缺少“hmDelete”的条目。

您需要升级到Indy 9的最新版本(如果不是Indy 10)。

如果这不是一个选项,那么您必须编辑IdHTTP.pas的当前副本以添加缺少的IdHTTP.pas个案,然后重新编译Indy。