0

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

1 回答 1

2

TIdHTTPIndy 8 根本不支持PUT请求。它只支持HEADGETPOST请求。不幸的是,您不能PUT手动强制请求(不更改 Indy 的源代码),因为该TIdHTTP.DoRequest()方法需要一个TIdHTTPMethod仅定义这 3 个 HTTP 请求的枚举。

Indy 9 添加了对其他 HTTP 请求的支持:OPTIONSTRACEPUTDELETECONNECT.

Indy 10 添加了对用户指定的 HTTP 方法的支持,因此TIdHTTP不再局限于硬编码的请求子集。

Indy 的当前版本(在撰写本文时)是 10.6.2.5457,并且仍然支持 Delphi 6 (1)

我强烈建议您从 Indy 8 升级,因为它非常旧,并且不再受到 Indy 开发人员的支持。请不要使用它。如果您不想一直升级到 Indy 10,那么至少升级到 Indy 9(尽管它不再受支持,除了错误修复)。

话虽这么说,Indy 8有一种可能的解决方法:如果您将数据发送到的 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 6 在内的 Delphi Unicode 前版本的支持将在未来的 Indy 11 维护版本中删除。Indy 10 将是支持旧编译器的最后一个版本。

于 2018-05-09T20:05:54.427 回答