WinHttp方法通过HTTP协议向服务器发送请求,返回结果
2016-04-15 19:32
766 查看
URL_COMPONENTS urlComp;
DWORD dwSize = 0;
WCHAR* lpOutBuffer = NULL;
HINTERNET hSession = NULL,hConnect = NULL , hRequest = NULL;
BOOL bResults = FALSE;
ZeroMemory(&urlComp,sizeof(urlComp));
urlComp.dwStructSize = sizeof(urlComp);
//分解链接
if(!WinHttpCrackUrl(url.wc_str(),(DWORD)wcslen(url.wc_str()),0,&urlComp))
{
url = HString("http://") + url;
if(!WinHttpCrackUrl(url.wc_str(),(DWORD)wcslen(url.wc_str()),0,&urlComp))
{
return WH_ILLEGAL_URL;
}
}
//测试是否有代理服务器
WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ie_proxy_config
WinHttpGetIEProxyConfigForCurrentUser(ie_proxy_config);
if(ie_proxy_config !=NULL){
hSession = WinHttpOpen("User Agent",WINHTTP_ACCESS_TYPE_NAMED_PROXY,ie_proxy_config.lpszProxy,ie_proxy_config.lpszProxyBypass,0);
else
hSession =
WinHttpOpen
("User Agent",WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,0);
}
hConnect=WinHttpConnect(hSession,host_name.wc_str(),INTERNET_DEFAULT_HTTP_PORT,0);
hRequest = WinHttpOpenRequest(hConnect,"GET",path_after_host_name.wc_str(),"HTTP/1.1",WINHTTP_NO_BUFFER,WINHTTP_DEFAULT_ACCEPT_TYPES,0);
hResults = WinHttpSendRequest(hRequest,WINHTTP_NO_ADDITIONAL_HEADERS,0,WINHTTP_NO_REQUEST_DATA,0,0,0);
if(bResults)
{
bResults = WinHttpReceiveResponse(hRequest,NULL);
}
if(bResults)
{
bResults=WinHttpQueryHeaders
(hResquest,WINHTTP_QUERY_RAW_HEADERS_CRLF,WINHTTP_HEADER_NAME_BY_INDEX,NULL,&dwSize,WINHTTP_NO_HEADER_INDEX);
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER
4000
)
{
lpOutBuffer = new WCHAR[dwSize/sizeof(WCHAR)];
bResults = WinHttpQueryHeaders(hRequest,WINHTTP_QUERY_RAW_HEADERS_CRLF,WINHTTP_HEADER_NAME_BY_INDEX,(LPVOID)lpOutBuffer,&dwSize,WINHTTP_NO_HEADER_INDEX);
}
}
//获取HTTP结果码的方法
if(lpOutBuffer) delete[] lpOutBuffer;
if(hRequest) WinHttpCloseHandle(hRequest);
if(hConnect) WinHttpCloseHandle(hConnect);
if(hSession) WinHttpCloseHandle(hSession);
1.调用WinHttpQueryHeaders 的条件:WinHttpReceiveResponse被成功调用。
WinHttpQueryHeaders设置第四个参数为NULL或者 WINHTTP_NO_OUTPUT_BUFFER 调用GetLastError()肯定返回ERROR_INSUFFICIENT_BUFFER错误
2.WinHttpQueryHeaders 中lpOutBuffer是存放http返回结果的缓冲
3.蓝字函数参考MSDN文档
DWORD dwSize = 0;
WCHAR* lpOutBuffer = NULL;
HINTERNET hSession = NULL,hConnect = NULL , hRequest = NULL;
BOOL bResults = FALSE;
ZeroMemory(&urlComp,sizeof(urlComp));
urlComp.dwStructSize = sizeof(urlComp);
//分解链接
if(!WinHttpCrackUrl(url.wc_str(),(DWORD)wcslen(url.wc_str()),0,&urlComp))
{
url = HString("http://") + url;
if(!WinHttpCrackUrl(url.wc_str(),(DWORD)wcslen(url.wc_str()),0,&urlComp))
{
return WH_ILLEGAL_URL;
}
}
//测试是否有代理服务器
WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ie_proxy_config
WinHttpGetIEProxyConfigForCurrentUser(ie_proxy_config);
if(ie_proxy_config !=NULL){
hSession = WinHttpOpen("User Agent",WINHTTP_ACCESS_TYPE_NAMED_PROXY,ie_proxy_config.lpszProxy,ie_proxy_config.lpszProxyBypass,0);
else
hSession =
WinHttpOpen
("User Agent",WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,0);
}
hConnect=WinHttpConnect(hSession,host_name.wc_str(),INTERNET_DEFAULT_HTTP_PORT,0);
hRequest = WinHttpOpenRequest(hConnect,"GET",path_after_host_name.wc_str(),"HTTP/1.1",WINHTTP_NO_BUFFER,WINHTTP_DEFAULT_ACCEPT_TYPES,0);
hResults = WinHttpSendRequest(hRequest,WINHTTP_NO_ADDITIONAL_HEADERS,0,WINHTTP_NO_REQUEST_DATA,0,0,0);
if(bResults)
{
bResults = WinHttpReceiveResponse(hRequest,NULL);
}
if(bResults)
{
bResults=WinHttpQueryHeaders
(hResquest,WINHTTP_QUERY_RAW_HEADERS_CRLF,WINHTTP_HEADER_NAME_BY_INDEX,NULL,&dwSize,WINHTTP_NO_HEADER_INDEX);
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER
4000
)
{
lpOutBuffer = new WCHAR[dwSize/sizeof(WCHAR)];
bResults = WinHttpQueryHeaders(hRequest,WINHTTP_QUERY_RAW_HEADERS_CRLF,WINHTTP_HEADER_NAME_BY_INDEX,(LPVOID)lpOutBuffer,&dwSize,WINHTTP_NO_HEADER_INDEX);
}
}
//获取HTTP结果码的方法
if(lpOutBuffer) delete[] lpOutBuffer;
if(hRequest) WinHttpCloseHandle(hRequest);
if(hConnect) WinHttpCloseHandle(hConnect);
if(hSession) WinHttpCloseHandle(hSession);
1.调用WinHttpQueryHeaders 的条件:WinHttpReceiveResponse被成功调用。
WinHttpQueryHeaders设置第四个参数为NULL或者 WINHTTP_NO_OUTPUT_BUFFER 调用GetLastError()肯定返回ERROR_INSUFFICIENT_BUFFER错误
2.WinHttpQueryHeaders 中lpOutBuffer是存放http返回结果的缓冲
3.蓝字函数参考MSDN文档
相关文章推荐
- 计算机网络:网络层
- http模块初始化过程
- HTTP协议基础(渗透基础:状态码,cookie,session)
- HttpClient 和 HttpURLConnection两种请求方式的写法
- HorizontalScrollView动态添加子view,并且设置每个子view的点击事件
- HTTP简单介绍
- iOS AFNetworking http 报错
- IOS -Xcode7 使用NSURLSession发送HTTP请求报错
- 又论Node.js的HTTP模块之深入理解
- Http请求get、post工具类
- Http请求get、post工具类
- TCP/IP 协议相关
- 【原创】网站抓包HttpWebRequest不返回Javascript生成的Cookie的解决办法
- 基于HBASE的数据包捕获、存储、回溯工具
- C++发送消息格式为JSON的http请求
- C++ 用libcurl库进行http通讯网络编程
- XMLHttpRequest实现终止请求和超时
- Iptables防火墙使用
- 结合Wireshark捕获分组深入理解TCP/IP协议栈之HTTP协议
- ajax原理及xmlhttpRequest