Delphi tidhttp get过程在某些URL上不起作用

Delphi tidhttp get过程在某些URL上不起作用,delphi,indy,Delphi,Indy,我在DelphiTidHTTP组件中遇到了一个问题,GET过程无法获取特定的url,但在其他url上它正在工作。示例:此代码返回一个空的response.datastring。Response.datastring仅在出现此错误的url时为空,但对于其他url,Response.datastring具有值。我需要获取该错误url的内容以修复此问题 procedure TForm1.Button1Click(Sender: TObject); var Response : TStringStr

我在DelphiTidHTTP组件中遇到了一个问题,GET过程无法获取特定的url,但在其他url上它正在工作。示例:此代码返回一个空的response.datastring。Response.datastring仅在出现此错误的url时为空,但对于其他url,Response.datastring具有值。我需要获取该错误url的内容以修复此问题

procedure TForm1.Button1Click(Sender: TObject);
var
  Response : TStringStream;
  error_url: string;
begin
  error_url := 'http://www.chefscatalog.com/international/home.aspx'; //error url
  Response := TStringStream.Create;
  try
    IdHTTP1.Get(error_url, Response);
    Memo1.Text := Response.DataString;
  finally
    FreeAndNil(Response);
  end;
end;
顺便说一下,idHTTP1 redirect属性在这里设置为true,因此重定向不是问题

这是我遇到的一个例外: 1.找到http/1.1 302 2.EDECompression错误,消息为“ZLib错误(-3)”

您可以在此链接中下载此项目的源代码(indytest.zip)


请帮帮我,伙计们。提前感谢:)

检查OnRedirect事件。由于某些原因,您被重定向到错误页面

这反过来会将您重定向回同一错误页,直到您用尽重定向最大值(15)

更新:

一旦您被重定向到错误页面,Wizzard将在下面解释为什么它会不断地重定向回同一错误页面。饼干

首先,您被重定向的原因可能是站点无法识别(或不喜欢)您的(请求中的)属性。默认情况下,它是“Mozilla/3.0(兼容;Indy Library)”。将其更改为或其他可识别的浏览器使用的当前字符串

我用“Mozilla/5.0(X11;U;Linux i686;en-US;rv:1.9.2.1)Gecko/20100122 firefox/3.6.1”试过了,它似乎工作得很好


您可以在中找到更多详细信息。

原因是您尝试访问的网站正在查找cookie,如果未设置cookie,它将尝试设置cookie,然后执行302重定向回其自身

因为您还没有连接cookie管理器,所以当站点不断检查cookie、设置然后重定向时,您将进入302重定向循环

处理cookies,它只需一个302就可以正常工作


然而,出于某种原因,Indy似乎忽略了该站点发送的cookies。如果我点击我得到的,我会快速编写一些测试代码

这是谷歌发送的标题

Set-Cookie: PREF=ID=3c7e441914b902ae:TM=1268686477:LM=1268686477:S=Z-Gwqx52jK0V1rYR; expires=Wed, 14-Mar-2012 20:54:37 GMT; path=/; domain=.google.com
Set-Cookie: NID=32=vsOZvkr4AOZ7320d_OBPf2zR2jau4E6pupbOe_ZaaX4DNjahTzSV-mSA55naTk-5cXQcn7SNEp7uSxbE_cFrL9ZftGApTGZMPGKzcz3_NZE_2MYpWG5PGbwWFw9t2d_R; expires=Tue, 14-Sep-2010 20:54:37 GMT; path=/; domain=.google.com; HttpOnly
然而,对于另一个站点,我在调试输出中得到了它

Redirecting (1) to: http://www.chefscatalog.com/error.aspx?impsid=0
Redirecting (2) to: http://www.chefscatalog.com/error.aspx?impsid=0
一直到15次尝试。。 如果我们看一下站点发回的标题

Set-Cookie: ASP.NET_SessionId=4o0bpi45evee0d45qos1uy55; path=/; HttpOnly
Set-Cookie: ChefsSite=CartID=00000000-0000-0000-0000-000000000000&cst=f4t8YpBpAAkNiRUd9BEf2luKAA%3d%3d&act=c0f2VBCSbv30F4kasnvWS5OfJQ%3d%3d&CookiesEnabled=False; expires=Wed, 14-Apr-2010 20:54:22 GMT; path=/
我注意到该站点缺少设置Cookie末尾的域,这很奇怪,但我不认为RFC必须这样做。如果我们看一下idCookieManager的AddCookie/2方法,它希望在该参数上有一个主机,因此它可能无法在任何不提供域的Cookie集上工作

我已经在另外几个网站上测试过了,如果设置的Cookie包含domain=.google.com,那么所有这些都可以正常工作

还值得注意的是,在idHttp.OnRedirect上

idHttp.Response.RawHeaders.Text

对于不工作的站点,您看不到设置的Cookies,但在工作的站点上,您确实看到设置的Cookies

但是,如果我将idhttp useragent设置为

    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1
(来自另一个答案)

然后,它似乎很好地捡起了饼干

    New cookie: ASP.NET_SessionId
    New cookie: ChefsSite
    Redirecting (1) to: http://www.chefscatalog.com/international/home.aspx
    New cookie: ChefsSite

奇怪。

那么,它做什么来代替获取URL呢?它是否引发了一个例外?什么样的?你有HTTP状态码吗?哪一个?
“此代码无法获取错误\u url,但是如果您将错误\u url更改为任何有效的url,并且它正在工作”
,您还会期望什么?相反(一个错误的url有效,而一个有效的url无效)会很奇怪,不是吗?@PA:至少现在,这个url是一个有效的url,服务器很高兴地返回一个200 OK的页面。所以我猜OP问题中的“有效URL”有点输入错误。@RRUZ-是的,请发布更多关于什么工作不正常的详细信息。嗨,伙计们,我遇到的问题是,在使用get过程后,响应是空的。与使用其他url(例如www.traffictravis.com)不同,响应包含一个值。这是我遇到的例外:1。http/1.1 302找到了2。EDecompressionError,消息为“ZLib Error(-3)”,我在该页面上没有看到这样的重定向。TIdHTTP的重定向处理仅适用于HTTP级别的重定向。如果该页面使用这样的重定向,用户将永远不会看到错误页面内容。嗨,布鲁斯,我将调查你的建议。我会给你反馈。非常感谢:)@Remy,我没有看页面代码。我刚刚启用了重定向并连接了OnRedirect事件。我不确定它是如何被重定向的,只是事件在该目的地触发。嗨,布鲁斯,是的,我看到有一个重定向到错误页面。我还遇到了一个错误“http/1.1 302安全重定向”,我不知道这是什么意思。但是我如何停止重定向到错误页面?我能做些什么,还是由网站管理员决定。嗨,你的权利在useragent和Cookie中,它不再被重定向到错误页面。。。现在开始工作了。。。剩下的问题是,如果一个压缩器连接到tidhttp,它将产生错误zlib error(-3)。无论如何,如果重定向计数达到最大值,我可能会以编程方式找到分离压缩器的方法。。。非常感谢,你搞定了…:D
    New cookie: ASP.NET_SessionId
    New cookie: ChefsSite
    Redirecting (1) to: http://www.chefscatalog.com/international/home.aspx
    New cookie: ChefsSite