首页 > 代码库 > VS2008 C++ 利用WinHttp API获取Http请求/响应头部Header
VS2008 C++ 利用WinHttp API获取Http请求/响应头部Header
http://www.cnblogs.com/LCCRNblog/p/3833472.html
这一篇博客中,实现了获取http请求/响应后的html源码,现在需要获取http请求/响应的头部Header。。通过对WinHttp Api的查看,现给出实现代码。。
1 // WinHttpTest.cpp : 定义控制台应用程序的入口点。 2 // 3 //#include <stdafx.h> 4 #include <vector> 5 #include <winsock2.h> 6 #include <Winhttp.h> 7 //#include <urlmon.h> 8 #include <windows.h> 9 #include <iostream> 10 #include <fstream> 11 #include <string> 12 #include "AtlBase.h" 13 #include "AtlConv.h" 14 using namespace std; 15 #pragma comment(lib, "winhttp")//这一句不能省略 16 string GetHost(string strUrl) 17 { 18 int indexHttp = strUrl.find("http://"); 19 if(indexHttp != -1) 20 { 21 strUrl = strUrl.substr(7); 22 } 23 else 24 return ""; 25 int indexSlash = strUrl.find("/"); 26 if(indexSlash != -1) 27 { 28 return strUrl.substr(0, indexSlash); 29 } 30 else 31 return strUrl; 32 return ""; 33 } 34 string GetRequestStr(string strUrl) 35 { 36 int indexHttp = strUrl.find("http://"); 37 if(indexHttp != -1) 38 { 39 strUrl = strUrl.substr(7); 40 } 41 else 42 return ""; 43 int indexSlash = strUrl.find("/"); 44 if(indexSlash == -1) 45 { 46 return ""; 47 } 48 else 49 return strUrl.substr(indexSlash); 50 } 51 void GetHtml(string strUrl) 52 { 53 string strHost = GetHost(strUrl);//获取Host 54 string strRequestStr = GetRequestStr(strUrl);//获取请求路径 55 USES_CONVERSION; 56 //2014年7月9日10:02:29 57 //LPCWSTR的定义 typedef const wchar_t* LPCWSTR; 58 //LPSTR的定义 typedef char* LPCWSTR; 59 //LPWSTR的定义 typedef wchar_t* LPWSTR; 60 LPCWSTR host = A2CW(strHost.c_str());//string转换为常量指针类型 61 LPCWSTR requestStr = A2CW(strRequestStr.c_str()); 62 //Variables 63 DWORD dwSize = 0; 64 BOOL bResults = FALSE; 65 66 //Note the definition of HINTERNET 67 HINTERNET hSession = NULL, 68 hConnect = NULL, 69 hRequest = NULL; 70 71 //2014年7月9日10:39:33 72 //Search the WinHttp API 73 //what to do when call the function WinHttpOpen? 74 // Use WinHttpOpen to obtain a session handle. 75 hSession = WinHttpOpen(L"WinHTTP Example/1.0", 76 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, 77 WINHTTP_NO_PROXY_NAME, 78 WINHTTP_NO_PROXY_BYPASS, 0); 79 // Specify an HTTP server. 80 if (hSession) 81 hConnect = WinHttpConnect(hSession, host, 82 INTERNET_DEFAULT_HTTP_PORT, 0); 83 // Create an HTTP request handle. 84 if (hConnect) 85 hRequest = WinHttpOpenRequest(hConnect, L"GET", requestStr, 86 NULL, WINHTTP_NO_REFERER, 87 NULL, 88 NULL); 89 // Send a request. 90 if (hRequest) 91 bResults = WinHttpSendRequest(hRequest, 92 WINHTTP_NO_ADDITIONAL_HEADERS, 93 0, WINHTTP_NO_REQUEST_DATA, 0, 94 0, 0); 95 // End the request. 96 if (bResults) 97 bResults = WinHttpReceiveResponse(hRequest, NULL); 98 99 //2014年7月9日16:35:40 100 //获取请求Header101 LPVOID lpOutBuffer = NULL;102 int temp;103 if (bResults)104 {105 //此处的参数与获取响应的Header参数不同106 WinHttpQueryHeaders( hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF|WINHTTP_QUERY_FLAG_REQUEST_HEADERS,107 WINHTTP_HEADER_NAME_BY_INDEX, NULL,108 &dwSize, WINHTTP_NO_HEADER_INDEX);109 110 // Allocate memory for the buffer.111 if( GetLastError() == ERROR_INSUFFICIENT_BUFFER )112 {113 temp = dwSize/sizeof(WCHAR);114 lpOutBuffer = new WCHAR[temp];115 116 // Now, use WinHttpQueryHeaders to retrieve the header.117 bResults = WinHttpQueryHeaders( hRequest,118 WINHTTP_QUERY_RAW_HEADERS_CRLF|WINHTTP_QUERY_FLAG_REQUEST_HEADERS,119 WINHTTP_HEADER_NAME_BY_INDEX,120 lpOutBuffer, &dwSize,121 WINHTTP_NO_HEADER_INDEX);122 }123 124 125 }126 //两种输出方式。。输出header,此处cout行不通127 wcout<<(WCHAR*)lpOutBuffer;128 if (bResults)129 printf("\n%S",lpOutBuffer);130 131 delete [] lpOutBuffer;132 133 //2014年7月9日14:43:20 获取响应头部134 if (bResults)135 {136 WinHttpQueryHeaders( hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF,137 WINHTTP_HEADER_NAME_BY_INDEX, NULL,138 &dwSize, WINHTTP_NO_HEADER_INDEX);139 140 // Allocate memory for the buffer.141 if( GetLastError() == ERROR_INSUFFICIENT_BUFFER )142 {143 temp = dwSize/sizeof(WCHAR);144 lpOutBuffer = new WCHAR[temp];145 146 // Now, use WinHttpQueryHeaders to retrieve the header.147 bResults = WinHttpQueryHeaders( hRequest,148 WINHTTP_QUERY_RAW_HEADERS_CRLF,149 WINHTTP_HEADER_NAME_BY_INDEX,150 lpOutBuffer, &dwSize,151 WINHTTP_NO_HEADER_INDEX);152 }153 154 155 }156 //两种输出方式。。输出header,此处cout行不通157 wcout<<(WCHAR*)lpOutBuffer;158 if (bResults)159 printf("\n%S",lpOutBuffer);160 161 delete [] lpOutBuffer;162 }163 int _tmain(int argc, _TCHAR* argv[])164 {165 166 GetHtml("http://bbs.bccn.net/thread-294526-1-1.html");167 system("pause");168 return 0;169 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。