为什么Indy Project HttpClient Get()会在一些在Web浏览器中正常工作的URL上提供代码500?

时间:2013-04-10 20:30:46

标签: delphi indy

我有几个URL可以在所有浏览器中正常工作,但如果我尝试使用Indy Http客户端的Get()获取页面内容,则会返回错误代码500,内部服务器错误。这是最新的Indy SVN版本(4981)。

这是我的示例代码。所需要的只是带有Indy组件的Delphi以及带有按钮和备忘录的表单。

procedure TForm1.Button1Click(Sender: TObject);
var HTTPCLIENT1: TIdHTTP;
begin
  try
   try
     HTTPCLIENT1 := TIdHTTP.Create(nil);
     Memo1.Clear;
     with HTTPCLIENT1 do
     begin
          HandleRedirects := True;
          Request.UserAgent := 'Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924 Epiphany/1.4.4 (Ubuntu)';
          Memo1.Text := Get('http://www.laredoute.fr/vente-machine-a-coudre-bernette-20-kit-couture--garantie-2-ans.aspx?productid=401225048&documentid=999999&categoryid=22918417&customertarget=0&offertype=0&prodcolor=1#pos=33_n_n_n_n_n_n&numberpage=2');
          Caption := ResponseText;
     end;
   except
     On e: Exception do
     begin
          Memo1.Lines.Add('Exception: '+e.Message);
     end;
   end;
  finally
     HTTPCLIENT1.Free;
  end;
end;

这不是我身边的连接问题,因为99%的网址返回200或404,只有少数返回500,但每个浏览器都会在一秒钟内打开它们。

1 个答案:

答案 0 :(得分:10)

这种失败通常表明GET请求在某种程度上是错误的,导致服务器代码在其结束时失败。但是,如果没有看到webbrowser请求与TIdHTTP请求进行比较的实际情况,那么就无法确定服务器不喜欢的内容。

更新:我看到的情况是,当webbrowser请求URL时,服务器立即发回200响应,但是当TIdHTTP请求URL时,服务器会发送301重定向到新的URL,然后在TIdHTTP请求该URL时将302重定向发送到错误页面,然后在TIdHTTP请求该URL时发送500响应。

Web浏览器请求与初始TIdHTTP请求之间的两个差异会对Web服务器产生影响:

  1. 您使用TIdHTTP请求的网址最后包含一个锚标记(#字符后面的所有内容 - #pos=33_n_n_n_n_n_n&numberpage=2),网络浏览器通常会删除它。锚点实际上不是URL的一部分。它们适用于Web浏览器在查找从URL检索的数据中的位置时使用。

  2. 用户代理。某些Web服务器对不同的用户代理敏感,可以向不同类型的用户代理发送不同的响应。

  3. 当我从URL中删除锚点时,TIdHTTP.Get()不再崩溃:

    Memo1.Text := Get('http://www.laredoute.fr/vente-machine-a-coudre-bernette-20-kit-couture--garantie-2-ans.aspx?productid=401225048&documentid=999999&categoryid=22918417&customertarget=0&offertype=0&prodcolor=1');