2

C++ で WinInet 関数を使用してプログラミングしていますが、問題が発生しました。

HttpOpenRequest()私のプログラムは、、、 ... 関数HttpSendRequest()でURL を開き、InternetReadFile()出力データを保存します。出力データとともに URL を保存する必要がありますが、場合によっては、サーバーが新しいアドレスからファイルを取得して読み取ることが301 Movedあります。InternetReadFile()

これで問題ありませんが、アドレスを特定する必要があります。で使用しようとしHttpQueryInfoましたが、HTTP_QUERY_RAW_HEADERS_CRLFこの情報は得られませんでした。Content-TypeCache-ControlCookiesHTTP_QUERY_CONTENT_LOCATIONERROR_HTTP_HEADER_NOT_FOUND

手伝って頂けますか?

4

2 に答える 2

4

WinInetはリダイレクト応答を受信した後、デフォルトで新しいHTTP要求を新しいURLに自動的に送信します。WinInetでファイルデータの読み取りを開始する準備が整うまでに、InternetReadFile()その時点で使用可能なヘッダーは、最後に要求されたURLに属します。これは、最初に要求したURLとは異なる場合があります。Locationそのため、ヘッダーが表示されません。リダイレクト応答のヘッダーを処理するには、INTERNET_FLAG_NO_AUTO_REDIRECT呼び出し時にフラグを指定する必要がありますHttpOpenRequest()。次に、を使用HttpQueryInfo()してリダイレクトステータスコードを検出し、そのLocationヘッダーを読み取ってから、呼び出しHttpSendRequest()てリダイレクト先の新しいURLを要求できます。

于 2012-05-22T19:21:25.860 に答える
1

wininet でリダイレクトが自動的に発生する場合、InternetStatusCallback関数を使用してリダイレクト URL を取得できます。コードINTERNET_STATUS_REDIRECT (110)は、新しい URL を含むバッファーをコールバック関数に提供します。ハンドルで使用InternetSetStatusCallback()してHINTERNET、リクエストのコールバック関数を設定できます。

于 2015-08-25T21:14:36.037 に答える