C++ WinHttp重定向处理策略

avatar
作者
猴君
阅读量:0

在C++中,使用WinHttp库处理HTTP重定向的方法如下:

  1. 首先,包含必要的头文件并链接到WinHttp库。
#include<iostream> #include<windows.h> #include <winhttp.h> #pragma comment(lib, "winhttp.lib") 
  1. 创建一个函数来处理HTTP请求和重定向。
BOOL HandleRedirection(HINTERNET hRequest, LPCWSTR url) {     // 发送请求     BOOL bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);      if (!bResults) {         std::cerr << "Error sending request: "<< GetLastError()<< std::endl;         return FALSE;     }      // 接收响应     bResults = WinHttpReceiveResponse(hRequest, NULL);      if (!bResults) {         std::cerr << "Error receiving response: "<< GetLastError()<< std::endl;         return FALSE;     }      // 获取响应状态码     DWORD dwStatusCode = 0;     DWORD dwSize = sizeof(dwStatusCode);     bResults = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatusCode, &dwSize, NULL);      if (!bResults) {         std::cerr << "Error querying headers: "<< GetLastError()<< std::endl;         return FALSE;     }      // 检查是否为重定向状态码     if (dwStatusCode >= 300 && dwStatusCode < 400) {         // 获取重定向URL         WCHAR redirectUrl[2048];         DWORD redirectUrlSize = sizeof(redirectUrl);         bResults = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_LOCATION, NULL, redirectUrl, &redirectUrlSize, NULL);          if (!bResults) {             std::cerr << "Error querying location header: "<< GetLastError()<< std::endl;             return FALSE;         }          // 关闭当前请求         WinHttpCloseHandle(hRequest);          // 递归处理重定向         return HandleRedirection(hRequest, redirectUrl);     }      // 非重定向状态码,处理响应     // ...      return TRUE; } 
  1. 在主函数中调用HandleRedirection函数。
int main() {     // 初始化WinHttp     HINTERNET hSession = WinHttpOpen(L"MyUserAgent", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);      if (!hSession) {         std::cerr << "Error opening session: "<< GetLastError()<< std::endl;         return 1;     }      // 连接到服务器     HINTERNET hConnect = WinHttpConnect(hSession, L"example.com", INTERNET_DEFAULT_HTTPS_PORT, 0);      if (!hConnect) {         std::cerr << "Error connecting to server: "<< GetLastError()<< std::endl;         WinHttpCloseHandle(hSession);         return 1;     }      // 创建请求     HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/path/to/resource", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);      if (!hRequest) {         std::cerr << "Error opening request: "<< GetLastError()<< std::endl;         WinHttpCloseHandle(hConnect);         WinHttpCloseHandle(hSession);         return 1;     }      // 处理重定向     BOOL bResults = HandleRedirection(hRequest, L"https://example.com/path/to/resource");      if (!bResults) {         std::cerr << "Error handling redirection: "<< GetLastError()<< std::endl;         WinHttpCloseHandle(hRequest);         WinHttpCloseHandle(hConnect);         WinHttpCloseHandle(hSession);         return 1;     }      // 关闭句柄     WinHttpCloseHandle(hRequest);     WinHttpCloseHandle(hConnect);     WinHttpCloseHandle(hSession);      return 0; } 

这个示例展示了如何使用WinHttp库处理HTTP重定向。请注意,这个示例仅适用于简单的重定向场景。对于更复杂的场景,可能需要根据实际需求进行相应的修改。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!