在POST重定向后,Indy使用GET发送params

时间:2014-06-11 16:55:47

标签: delphi redirect indy delphi-xe5 indy10

使用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内部的解决方案将是理想的。

谢谢!

1 个答案:

答案 0 :(得分:3)

处理HTTP 302回复代码的客户端行为不明确,并且经常被各种客户端错误地处理。这在各种RFC中都有详细记录,包括2068和2616. 303回复代码是为了解决歧义而创建的,但许多客户端仍然不支持303,许多服务器仍使用{{1}期望客户端表现得像使用302一样。

多年来,{p> 303多次来回试图弄清楚收到TIdHTTP时应该使用哪种行为 - 是否应该使用302进行重定向,还是应该重定向使用GET? 2012年,POST属性中添加了hoTreat302Like303标记,以便用户决定要执行的操作。因此,请确保您使用的是Indy的最新版本。

如果收到TIdHTTP.HTTPOptions303将清除其TIdHTTP属性(因此忽略之前的任何Request.Source参数)并发送POST请求,忽略GET事件处理程序返回的方法(如果已分配)。

如果收到OnRedirect

  1. 如果302已启用,hoTreat302Like303将清除其TIdHTTP属性(从而忽略之前的Request.Source个参数)并发送POST个请求,忽略GET事件处理程序返回的方法(如果已分配)。

  2. 如果OnRedirect被禁用(默认情况下是这样),hoTreat302Like303将使用TIdHTTP事件处理程序返回的方法发送请求(如果已分配),否则它将使用与重定向的上一个请求相同的方法发送请求。但在任何一种情况下,它都不会清除其OnRedirect属性(因此将重新发送任何先前的Request.Source参数。因此,如果您更改POST处理程序中的方法,则必须相应地更新OnRedirect属性,例如:

    Request.Source