2

Delphi Tidhttp コンポーネントで、GET プロシージャが特定の URL をフェッチできないが、他の URL では機能しているという問題が発生しています。例: このコードは空の response.datastring を返します。Response.datastring はこの error_url でのみ空ですが、他の URL では response.datastring に値があります。この問題を解決するには、その error_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 リダイレクト プロパティはここで true に設定されているため、リダイレクトは問題になりません。

これは私が遭遇した例外です: 1. http/1.1 302 Found 2. EDecompressionError with message 'ZLib Error (-3)'

このプロジェクトのソース コード (indytest.zip) は、このリンクhttp://www.yourfilelink.com/get.php?fid=534933でダウンロードできます。

みんな助けてください。前もって感謝します :)

4

2 に答える 2

2

その理由は、ヒットしようとしている Web サイトが Cookie を探しており、設定されていない場合は設定を試みてから、302 リダイレクトを自分自身に戻すためです。

Cookie マネージャーを接続していないため、サイトが Cookie をチェックし、設定してからリダイレクトし続けるため、302 リダイレクト ループに陥っています。

Cookie を処理すると、302 が 1 つだけで問題なく動作します。


しかし、何らかの理由で Indy がこのサイトから送信されている Cookie を無視しているようです。http://www.google.comにアクセスすると、いくつかのテスト コードを作成しました。

New cookie: PREF
New cookie: NID
Redirecting (1) to: http://www.google.co.nz/
New cookie: PREF
New cookie: NID

これは、Google が送信するヘッダーです

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=/

サイトの Set-Cookie の末尾にドメインがありませんが、これは奇妙ですが、RFC の必須事項ではないと思います。idCookieManager の AddCookie/2 メソッドを見ると、そのパラメーターにホストが必要なため、ドメインを指定しない Set-Cookie では機能しない可能性があります。

これをさらにいくつかのサイトでテストしましたが、Set-Cookie に domain=.google.com; が含まれている場合はすべて正常に動作します。

idHttp.OnRedirect を見ると、

idHttp.Response.RawHeaders.Text

機能しないサイトでは Set-Cookies は表示されませんが、機能するサイトでは Set-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

変。

于 2010-03-15T03:50:09.757 に答える
1

OnRedirect イベントを確認します。何らかの理由で、エラー ページにリダイレクトされています。

http://www.chefscatalog.com/error.aspx?impsid=0

これにより、RedirectMaximum (15) を使い果たすまで、この同じエラー ページにリダイレクトされます。

アップデート:

エラー ページにリダイレクトされると、Wizzard は、同じエラー ページに何度も何度もリダイレクトされる理由を以下に説明します。クッキー。

そもそもリダイレクトされる理由は、おそらく、サイトがユーザー エージェント文字列(Request プロパティ内) を認識していない (または気に入っていない) ためです。デフォルトでは「Mozilla/3.0 (互換; Indy Library)」です。FireFoxIE、またはその他の認識されているブラウザー で使用されている現在の文字列に変更します。

「Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1」で試してみたところ、問題なく動作するようです。

詳細については、 Indy KB PDFを参照してください。

于 2010-03-12T16:32:10.357 に答える