使用Delphi XE5 + Indy 10.
我发送带有登录名和密码的POST以登录。站点响应重定向(302)到目标页面。在浏览器中,重定向由GET处理,一切正常,但Indy继续POST。
我通过在OnRedirect处理程序中使用此代码来解决此问题:
procedure TForm1.MyRedirect(Sender: TObject;
var dest: string;
var NumRedirect: Integer;
var Handled: Boolean;
var VMethod: string);
var
TempHttp: TIdHttp;
begin
TempHttp := (Sender as TIdHTTP);
if (TempHttp.ResponseCode = 302) then
VMethod := 'GET';
Handled := true;
end;
然后将请求方法更改为GET,但Indy仍然使用GET发送POST请求参数。所以我得到413请求实体太大的响应。
如何在重定向后让Indy不使用GET发送参数? OnRedirect内部的解决方案将是理想的。
谢谢!
答案 0 :(得分:3)
处理HTTP 302
回复代码的客户端行为不明确,并且经常被各种客户端错误地处理。这在各种RFC中都有详细记录,包括2068和2616. 303
回复代码是为了解决歧义而创建的,但许多客户端仍然不支持303
,许多服务器仍使用{{1}期望客户端表现得像使用302
一样。
303
多次来回试图弄清楚收到TIdHTTP
时应该使用哪种行为 - 是否应该使用302
进行重定向,还是应该重定向使用GET
? 2012年,POST
属性中添加了hoTreat302Like303
标记,以便用户决定要执行的操作。因此,请确保您使用的是Indy的最新版本。
如果收到TIdHTTP.HTTPOptions
,303
将清除其TIdHTTP
属性(因此忽略之前的任何Request.Source
参数)并发送POST
请求,忽略GET
事件处理程序返回的方法(如果已分配)。
如果收到OnRedirect
:
如果302
已启用,hoTreat302Like303
将清除其TIdHTTP
属性(从而忽略之前的Request.Source
个参数)并发送POST
个请求,忽略GET
事件处理程序返回的方法(如果已分配)。
如果OnRedirect
被禁用(默认情况下是这样),hoTreat302Like303
将使用TIdHTTP
事件处理程序返回的方法发送请求(如果已分配),否则它将使用与重定向的上一个请求相同的方法发送请求。但在任何一种情况下,它都不会清除其OnRedirect
属性(因此将重新发送任何先前的Request.Source
参数。因此,如果您更改POST
处理程序中的方法,则必须相应地更新OnRedirect
属性,例如:
Request.Source