TIdHTTP
Indy 8 根本不支持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有一种可能的解决方法:如果您将数据发送到的 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 将是支持旧编译器的最后一个版本。