2

我正在使用 C++ 中的 WinInet 函数进行编程,但遇到了一个问题。

HttpOpenRequest()我的程序使用, HttpSendRequest(), InternetReadFile()... 函数打开一个 URL并保存输出数据。我需要将 URL 与输出数据一起保存,但在某些情况下,服务器会给我301 MovedInternetReadFile()从新地址读取文件。

没关系,但我需要找出它是什么地址。我尝试使用HttpQueryInfowithHTTP_QUERY_RAW_HEADERS_CRLF但我没有获得此信息,只有Content-Type, Cache-Control,Cookies等。当我使用HTTP_QUERY_CONTENT_LOCATION或类似的东西时,我得到ERROR_HTTP_HEADER_NOT_FOUND.

你能帮助我吗?

4

2 回答 2

4

WinInet 收到重定向响应后,默认情况下会自动向新 URL 发送新的 HTTP 请求。当 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 回答