使用Delphi 6中的Indy 8.0.26进行PUT命令

时间:2018-05-09 09:59:16

标签: delphi indy put delphi-6 indy-8

我可以在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);

1 个答案:

答案 0 :(得分:2)

Indy 8中的

TIdHTTP根本不支持PUT个请求。它仅支持HEADGETPOST请求。不幸的是,您无法手动强制执行PUT请求(无需更改Indy的源代码),因为TIdHTTP.DoRequest()方法采用的TIdHTTPMethod枚举仅定义了3个HTTP请求。

Indy 9增加了对其他HTTP请求的支持:OPTIONSTRACE PUT DELETECONNECT

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将是支持旧编译器的最后一个版本。