我可以在Indy 8中使用POST
发送TIdHTTP
请求,但我不知道如何发送PUT
请求。
var
Params:TStrings;
Resp: TMemoryStream;//TMemoryStream;
URI, sResp: AnsiString;
begin
try
Params := TStringList.Create;
Params.Add(EdPost.Text);
//Params.Add('Method=PUT'); ???
Resp := TMemoryStream.Create;
URI := EdUri.Text + Edit6.Text; //
Http1.Request.ContentType := 'application/json';
Http1.Request.ExtraHeaders.Values['Authorization'] := 'Bearer ' + sTocken;
//Http1.Request.ExtraHeaders.Values['Method'] :='PUT'; ???
Http1.Post(URI, Params, Resp);
答案 0 :(得分:2)
TIdHTTP
根本不支持PUT
个请求。它仅支持HEAD
,GET
和POST
请求。不幸的是,您无法手动强制执行PUT
请求(无需更改Indy的源代码),因为TIdHTTP.DoRequest()
方法采用的TIdHTTPMethod
枚举仅定义了3个HTTP请求。
Indy 9增加了对其他HTTP请求的支持:OPTIONS
,TRACE
, PUT
,DELETE
和CONNECT
。
Indy 10增加了对用户指定的HTTP方法的支持,因此TIdHTTP
不再局限于硬编码的请求子集。
当前版本的Indy(撰写本文时)为10.6.2.5457,仍然支持Delphi 6 (1)。
我强烈要求您升级Indy 8,因为它非常老旧,不再受Indy开发人员的支持。请不要使用它。如果你不想一直升级到Indy 10,那么至少要升级到Indy 9(虽然不再支持它,除了错误修复)。
话虽如此,Indy 8还有一个可能的解决方法: IF 您要将数据发送到支持的HTTP服务器"动词隧道" ,然后您可以使用TIdHTTP.Post()
发送POST
请求,同时指示服务器将请求视为PUT
,例如:
// Sadly, there is no *standard* HTTP header for verb tunneling.
// Different vendors use different headers:
//
// Most vendors use 'X-HTTP-Method-Override'
// Microsoft uses 'X-HTTP-Method'
// IBM uses 'X-METHOD-OVERRIDE'
//
// Send whichever one is appropriate for your particular server, or
// just send them all and let the server work it out...
Http1.Request.ExtraHeaders.Values['X-HTTP-Method-Override'] := 'PUT';
Http1.Request.ExtraHeaders.Values['X-HTTP-Method'] := 'PUT';
Http1.Request.ExtraHeaders.Values['X-METHOD-OVERRIDE'] := 'PUT';
Http1.Post(URI, ...);
(1):支持Delphi的Unicode前版本(包括Delphi 6)将在未来的Indy 11维护版本中删除。 Indy 10将是支持旧编译器的最后一个版本。