【发布时间】:2017-08-31 20:31:34
【问题描述】:
我正在尝试使用 Indy 发送发布请求,但我遇到了一些问题。 在一个表单中,我有 TIdHTTP、一个 TIdSSLIOHandlerSocketOpenSSL 和一个 TIdCookieManager,它们具有以下属性:
TIdHTTP:
IdHTTP1.IOHandler := FSSLIO;
IdHTTP1.AllowCookies := True;
IdHTTP1.HandleRedirects := True;
IdHTTP1.ProxyParams.BasicAuthentication := False;
IdHTTP1.ProxyParams.ProxyPort := 0;
IdHTTP1.Request.ContentLength := -1;
IdHTTP1.Request.Accept := 'text/html, */*';
IdHTTP1.Request.BasicAuthentication := False;
IdHTTP1.Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
IdHTTP1.HTTPOptions := [hoKeepOrigProtocol, hoForceEncodeParams];
IdHTTP1.OnRedirect := IdHTTP1Redirect;
IdHTTP1.CookieManager := IdCookieManager1;
TIdSSLIOHandlerSocketOpenSSL:默认值
TIdCookieManager: 默认值
OnRedirect 过程:
Handled := True;
在一个按钮中请求如下:
Params := TStringStream.Create('asdf=asdf',TEncoding.UTF8);
edtmemo1.Text := IdHTTP1.Post('https://www.detran.mg.gov.br/habilitacao/1-habilitacao-quero-ser-condutor/consultar-resultado-exame-legislacao/-/busca_resultado_exames/', Params);
Params.Free;
但返回错误,响应代码为 301,但奇怪的是该位置与我尝试发送的 url 相同,因此它进入了无限循环。
回应
HTTP/1.1 301 Moved Permanently
Date: Thu, 31 Aug 2017 20:23:32 GMT
Server: Apache
X-Powered-By: PHP/5.3.5
P3P: CP="A politica de privacidade deve estar disponivel no site ou pode ser solicitada via fale conosco."
Set-Cookie: SECCCAKEPHP=e19ttp30m5380ih41qal0gipg2; expires=Sat, 09-Sep-2017 04:23:32 GMT; path=/
Location: https://www.detran.mg.gov.br/habilitacao/1-habilitacao-quero-ser-condutor/consultar-resultado-exame-legislacao/-/busca_resultado_exames/
Cache-Control: max-age=604800
Expires: Thu, 07 Sep 2017 20:23:32 GMT
Content-Length: 0
Content-Type: text/html; charset=utf-8
卷曲测试:
curl -vv -X POST -F 'asdf=asdf' https://www.detran.mg.gov.br/habilitacao/1-habilitacao-quero-ser-condutor/consultar-resultado-exame-legislacao/-/busca_resultado_exames/
我使用 curl 尝试了相同的请求并使用响应代码 200。 知道会发生什么吗?
【问题讨论】:
-
服务器正在重定向到相同的 URL,但它也发送了一个可能在初始请求中丢失的 cookie。如果服务器想要返回该 cookie,这是合理的行为。如果服务器陷入无休止的重定向循环,那就是另一个问题了。嗅探流量以查看 curl 发送的内容与
TIdHTTP发送的内容。要嗅探 curl 的 HTTPS 流量,您可以使用Fiddler。要嗅探TIdHTTP的HTTPS 流量,您可以将TIdLog...组件(例如TIdLogFile)分配给TIdHTTP.Intercept属性。TIdHTTP会发回那个 cookie 吗? -
你传递给 curl 的命令行参数是什么?什么
Params传递给TIdHTTP.Post()?请提供minimal reproducible example 显示您实际为重现该问题所做的一切。此外,Delphi 2010 已有 8 年历史,您是否使用同样旧版本的 Indy?在撰写本文时,当前的 Indy 版本是 10.6.2.5434。 -
我编辑了问题,添加了 curl 请求,并且使用这些参数 curl 不处理重定向,而是使用 200 代码响应。我可以在 curl 中模拟相同问题的唯一方法是,如果我使用 http 而不是 https。是的,我知道 Delphi 2010 已经过时了,是的,我使用的是 Indy 10.5.5 版,我们已经尝试过更新,至少是 Indy,但是我们遇到了很多问题,不幸的是我们没有足够的时间或人员来处理用它。
-
您的
TIdHTTP逻辑与您的 curl 逻辑不匹配。我发布了一个解释差异的答案。
标签: delphi post delphi-2010 indy