WinHTTP 的工作流程如下
一.初始化WinHTTP
在与服务器交互之前, 必须用调用WinHttpOpen进行初始化,WinHttpOpen创建一个会话,并返回该会话的句柄,接着有了这个句柄, WinHttpConnect就能指定一个目标服务器
注意:调用了WinHttpConnect并不意味着和服务器建立了真正的连接
二.打开一个请求
WinHttpOpenRequest函数打开一个HTTP请求并返回一个HINTERNET 句柄,该句柄在接下来的步骤中会用到, WinHttpOpenRequest并不会向服务器发送请求, 实际上是WinHttpSendRequest通过网络与服务器建立连接并发送请求.
三.发送请求
WinHttpSendRequest工作时需要 第二步中WinHttpOpenRequest返回的HINTERNET 句柄,WinHttpSendRequest可以发送额外的头部和其他信息,这个"其他信息"通常在PUT和POST操作中被使用
四.以POST方式向服务器发送数据
为了能够向使用POST或者PUT方法,在调用WinHttpOpenRequest时,第五个参数必须设置为"PUT"或者"POST",注意要使用大写,WinHttpSendRequest的第几个参数要设置为准备传送的数据的字节数, 然后就可以使用WinHttpWriteData来传送数据了
如果不想用 WinHttpWriteData 传送数据,则需要把 WinHttpSendRequest 第五个和第六个参数设置都为准备传送的数据的字节数,第四个参数为待传送数据的地址。
这样就可以直接在WinHttpSendRequest 中传送数据了在用 WinHttpOpenRequest 打开了一个请求,用 WinHttpSendRequest 发送数据并用 WinHttpReceiveResponse 接受返回消息之后,就能够用 WinHttpReadData 和 WinHttpQueryDataAvailable从HTTP 服务器下载资源了
Demo:
DWORD dwSize = 0;DWORD dwDownloaded = 0;LPSTR pszOutBuffer;BOOL bResults = FALSE;HINTERNET hSession = NULL, hConnect = NULL,hRequest = NULL;// 获得一个会话的句柄.hSession = WinHttpOpen( L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0 );// 指定HTTP服务器.if( hSession )hConnect = WinHttpConnect( hSession, L"www.microsoft.com",INTERNET_DEFAULT_HTTPS_PORT, 0 );// 创建HTTP请求连接.if( hConnect )hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL,NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE );// 发送请求.if( hRequest )bResults = WinHttpSendRequest( hRequest,WINHTTP_NO_ADDITIONAL_HEADERS, 0,WINHTTP_NO_REQUEST_DATA, 0, 0, 0 );// 结束请求.if( bResults )bResults = WinHttpReceiveResponse( hRequest, NULL );// 接收数据.if( bResults ){do {// 检查是否有可用数据.dwSize = 0;if( !WinHttpQueryDataAvailable( hRequest, &dwSize ) )printf( "Error %u in WinHttpQueryDataAvailable.\n",GetLastError( ) );// 分配空间.pszOutBuffer = new char[dwSize+1];if( !pszOutBuffer ){printf( "Out of memory\n" );dwSize=0;}else{// 读取数据.ZeroMemory( pszOutBuffer, dwSize+1 );if( !WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded ) )printf( "Error %u in WinHttpReadData.\n", GetLastError( ) );elseprintf( "%s", pszOutBuffer );// 释放空间.delete [] pszOutBuffer;}} while( dwSize > 0 );}// 如果出错,输出具体错误代码.if( !bResults )printf( "Error %d has occurred.\n", GetLastError( ) );// 关闭所有句柄.if( hRequest ) WinHttpCloseHandle( hRequest );if( hConnect ) WinHttpCloseHandle( hConnect );if( hSession ) WinHttpCloseHandle( hSession );
更多详细内容
















