【问题标题】:WinInet - How to obtain server URL after 301 redirect?WinInet - 如何在 301 重定向后获取服务器 URL?
【发布时间】:2012-05-29 06:09:25
【问题描述】:

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

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

这没关系,但我需要找出它的地址。我尝试将HttpQueryInfoHTTP_QUERY_RAW_HEADERS_CRLF 一起使用,但我没有获得此信息,只有Content-TypeCache-ControlCookies 等。当我使用HTTP_QUERY_CONTENT_LOCATION 或类似的东西时,我得到ERROR_HTTP_HEADER_NOT_FOUND

你能帮帮我吗?

【问题讨论】:

    标签: c++ url redirect wininet


    【解决方案1】:

    当在 wininet 中自动发生重定向时,您可以使用 InternetStatusCallback 函数获取重定向 url。代码INTERNET_STATUS_REDIRECT (110) 将为回调函数提供一个带有新 URL 的缓冲区。您可以在HINTERNET 句柄上使用InternetSetStatusCallback() 为请求设置回调函数。

    【讨论】:

    • 这确实是一种可能的方式,并且可能比接受的答案更容易处理。
    【解决方案2】:

    WinInet 收到重定向响应后,默认情况下会自动向新 URL 发送新的 HTTP 请求。当 WinInet 准备好让您开始使用 InternetReadFile() 读取文件数据时,当时可用的标头属于最后请求的 URL,这可能与您最初请求的 URL 不同。这就是为什么您看不到 Location 标头的原因。要处理重定向响应的标头,您必须在调用HttpOpenRequest() 时指定INTERNET_FLAG_NO_AUTO_REDIRECT 标志,然后您可以使用HttpQueryInfo() 检测重定向状态码并读取其Location 标头,然后再调用HttpSendRequest()请求重定向到的新 URL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2012-02-26
      • 2015-01-23
      • 2011-07-16
      相关资源
      最近更新 更多