WinHttp方法通过HTTP协议向服务器发送请求,返回结果

来源:互联网 发布:java 服务端mqtt推送 编辑:程序博客网 时间:2024/05/01 23:12
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)
{
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文档

0 0
原创粉丝点击