我正在尝试使用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;
...
答案 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。