WinHTTP开发POST表单的问题及解决

利用WinHTTP编写访问WEB页面的客户端,如果需要POST表单,比如输入登陆的用户名和密码等等,以后的页面访问都和这个登陆的Session有关。IE浏览器等客户端利用从服务器端获得的Cookie保存相关信息实现会话的一致性,具体到WinHTTP开发,查了一下,网上没有太多相关资料,下面函数利用Get掩饰向一个网站获取Cookie的ID号,保存到CString中,以后的Get等操作,都利用WinHttpAddRequestHeaders将Cookie添加到Header中,然后在进行Request操作即可:

CStringW GetCookie()
{
CStringW strCookie = L"";
DWORD dwSize = 0;
LPVOID lpOutBuffer = NULL;
BOOL bResults = FALSE;

HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;

// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen( SZ_AGENT,
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0 );

// Specify an HTTP server.
if( hSession )
hConnect = WinHttpConnect( hSession, L"wapmail.webdunia.com",
INTERNET_DEFAULT_HTTP_PORT, 0 );

// Create an HTTP request handle.
if( hConnect )
hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL,
NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
0 );

// Send a request.
if( hRequest )
bResults = WinHttpSendRequest( hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS, 0,
WINHTTP_NO_REQUEST_DATA, 0,
0, 0 );


// End the request.
if (bResults)
bResults = WinHttpReceiveResponse( hRequest, NULL);

// First, use WinHttpQueryHeaders to obtain the size of the buffer.
if (bResults)
{
WinHttpQueryHeaders( hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF,
WINHTTP_HEADER_NAME_BY_INDEX, NULL,
&dwSize, WINHTTP_NO_HEADER_INDEX);

// Allocate memory for the buffer.
if( GetLastError( ) == ERROR_INSUFFICIENT_BUFFER )
{
lpOutBuffer = new WCHAR[dwSize/sizeof(WCHAR)];

// Now, use WinHttpQueryHeaders to retrieve the header.
bResults = WinHttpQueryHeaders( hRequest,
WINHTTP_QUERY_RAW_HEADERS_CRLF,
WINHTTP_HEADER_NAME_BY_INDEX,
lpOutBuffer, &dwSize,
WINHTTP_NO_HEADER_INDEX);
}
}

// Print the header contents.
char * tmpch = (char *)malloc(sizeof(lpOutBuffer));

if (bResults)
sprintf(tmpch,"%S",lpOutBuffer);

strCookie = tmpch;
int set_cookie = strCookie.Find(L"Cookie",0);
int semicolon = strCookie.Find (L";",set_cookie);
if(set_cookie != -1 && semicolon != -1)
strCookie = strCookie.Mid (set_cookie,semicolon - set_cookie) + L"\r\n";

// Free the allocated memory.
delete [] lpOutBuffer;

// Report any errors.
if (!bResults)
printf("Error %d has occurred.\n",GetLastError());

// Close any open handles.
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);

return strCookie;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值