0

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

尝试(像那样):

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;
...
4

1 回答 1

3

直接调用TIdHTTP.DoRequest()是在 Indy 9 中发送DELETE请求的正确方法。使用访问器类是一种选择。另一种选择是派生一个新组件,TIdHTTP以添加您自己的Delete()调用方法DoRequest()(就像TIdHTTP在 Indy 10 中所做的那样):

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;

但是,话虽如此,您使用的是过时的 Indy 9 版本。最后一个版本是 9.0.50,其BuildAndSendRequest()代码与您显示的不同:

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;

您遇到的问题已在对 Indy 9IdHTTP.pas文件的最新修订中得到解决(在 2007 年 12 月 24 日的 SVN 修订 35 中):

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

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

如果这不是一个选项,那么您将不得不编辑您当前的副本IdHTTP.pas以添加丢失的hmDelete大小写,然后重新编译 Indy。

于 2017-03-13T21:42:22.943 回答