6

すべてのブラウザーで問題なく動作する 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;

URL の 99% が 200 または 404 を返し、500 を返すものはほとんどないため、私の側では接続の問題ではありませんが、すべてのブラウザーで 1 秒以内に正常に開きます。

4

1 に答える 1

10

この種のエラーは通常、GETリクエストが何らかの形で不正であることを示唆しており、サーバー コードが最後に失敗します。しかし、TIdHTTP の要求と比較するために Web ブラウザの要求が実際にどのように見えるかを確認しないと、サーバーが何を気に入らないのかを確実に知る方法はありません。

更新: Web ブラウザーが URL を要求すると、サーバーはすぐに 200 応答を返しますが、TIdHTTP が URL を要求すると、サーバーは 301 リダイレクトを新しい URL に送信し、それから 302 リダイレクトを新しい URL に送信します。 TIdHTTP がその URL を要求するとエラー ページが表示され、TIdHTTP がその URL を要求すると 500 応答が送信されます。

Web ブラウザのリクエストと、Web サーバーに影響を与える最初の TIdHTTP リクエストの 2 つの違いは次のとおりです。

  1. TIdHTTP で要求している URL には、Web ブラウザが通常削除する末尾 (#文字 -の後のすべて#pos=33_n_n_n_n_n_n&numberpage=2) にアンカー タグが含まれています。アンカーは実際には URL の一部ではありません。これらは、URL から取得されたデータ内のスポットを見つけるときに Web ブラウザーが使用するためのものです。

  2. ユーザーエージェント。一部の Web サーバーは、さまざまなユーザー エージェントに敏感であり、さまざまな種類のユーザー エージェントにさまざまな応答を送信できます。

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');
于 2013-04-10T20:55:16.340 に答える