[英]Indy sends params with GET after POST redirect
使用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发送params? OnRedirect内部的解决方案将是理想的。
谢谢!
处理HTTP 302
回复代码的客户端行为是不明确的,并且经常被各种客户端错误地处理。 这已在各种RFC中得到充分记录,包括2068和2616. 303
回复代码是为了解决歧义而创建的,但许多客户端仍然不支持303
,并且许多服务器仍然使用302
期望客户端表现得好像使用了303
。
TIdHTTP
多次来回试图弄清楚在收到302
时应该使用什么行为 - 它应该使用GET
重定向,还是应该使用POST
重定向? 2012年,在TIdHTTP.HTTPOptions
属性中添加了hoTreat302Like303
标志,以便用户决定该怎么做。 因此,请确保您使用的是最新版本的Indy。
如果收到303
, TIdHTTP
将清除其Request.Source
属性(从而忽略任何以前的POST
参数)并发送GET
请求,忽略OnRedirect
事件处理程序返回的方法(如果已分配)。
如果收到302
:
如果hoTreat302Like303
启用, TIdHTTP
将清除它Request.Source
财产(从而忽视了以往任何POST
PARAMS),并发送一个GET
请求,无视返回的方法OnRedirect
事件处理程序,如果分配。
如果禁用了hoTreat302Like303
(默认情况下), TIdHTTP
将使用OnRedirect
事件处理程序返回的方法发送请求(如果已分配),否则它将使用与重定向的上一个请求相同的方法发送请求。 但在任何一种情况下,它都不会清除它的Request.Source
属性(因此将重新发送任何以前的POST
参数)。 因此,如果您更改OnRedirect
处理程序中的方法,则必须相应地更新Request.Source
属性,例如:
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 begin VMethod := 'GET'; TempHttp.Request.Source := nil; // <-- add this end; Handled := true; end;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.