html post cookie,第三讲:Winhttp对象POST方式访问和取Cookie

上节课讲了winhttp对象的一个GET方式访问

这节课讲一下winhttp对象的POST方式访问和取出访问后的Cookie

因为winhttp不像XML一样可以自己管理Cookie,winhttp没有办法自己管理Cookie,我们只能自己管理。

--------------------------------------------------------------------------------

winhttp的POST访问其实跟GET访问差不多,修改一下方法就可以了,我们这节课主要就是讲取Cookie的。

这是一个GET方式的访问

而POST方式的访问,只要opne的时候,GET变成POST,最后Send的时候加上POST数据即可。这里以检测网易邮箱是否注册为例

这样就是一个POST方式的访问。

--------------------------------------------------------------------------------

那么访问之后我们应该如何取出Cookie

这里有两种方法。

一种是取出单条的Cookie,一种是取出所有的返回协议头,然后再经过处理得到完整Cookie

取出返回协议头的写法是读文本属性,然后属性名称就是GetAllResponseHeaders。

然后加一个调试输出,便于我们看他返回的结果

然后返回就是下面这样

01.Date: Thu, 18 Jul 2013 05:03:30 GMT

02.Server: BWS/1.0

03.Content-Length: 10377

04.Content-Type: text/html;charset=utf-8

05.Cache-Control: private

06.BDPAGETYPE: 1

07.BDUSERID: 0

08.BDQID: 0xd69f8600003f2806

09.Set-Cookie: BDSVRTM=21; path=/

10.Set-Cookie: BAIDUID=5B6FEB162A31E75C2861B403A43E6414:FG=1;

expires=Thu, 18-Jul-43 05:03:29 GMT; path=/; domain=.baidu.com

11.Set-Cookie: BDRCVFR[_HRd0mn9IK_]=aeXf-1x8UdYcs; path=/;

domain=www.baidu.com

12.Expires: Thu, 18 Jul 2013 05:03:30 GMT

13.P3P: CP=" OTI DSP COR IVA OUR IND COM "

14.Connection: Keep-Alive

复制代码可以看到有三条Cookie,实际上返回的Cookie就是 BDSVRTM=21; BAIDUID=5B6FEB162A31E75C2861B403A43E6414:FG=1:

BDRCVFR[_HRd0mn9IK_]=aeXf-1x8UdYcs

但是他这里只会给我们返回所有的协议头,所以我们还要自己经过处理才能得到返回的Cookie。

这里由于是易语言的基础知识,我要讲起来会比较麻烦,所以这里我直接写好大家看一下吧,不用正则,直接用分割就行,当然,你用正则的话更好。

在这里顺便说一下,我只会讲POST相关的内容,易语言的基础知识你可以去看书,或者去百度看教程都可以。因为我再讲基础的话,就太浪费时间了。

那么处理过程就是这样

思路很简单,就是先分割,然后如果找到"Set-Cookie",就把"Set-Cookie

"和"; "中间的内容取出来,再叠加一起就可以了。

这样就是取出来整个返回Cookie。

取出单挑Cookie的写法就比较简单。

也是读文本属性,属性名称为:GetResponseHeader,参考数据为:Set-Cookie:。

但是这种写法只能取出来第一条Cookie,没有办法取出剩下的Cookie,所以我们取Cookie的时候都是用的GetAllResponseHeaders,再做处理。

然而这种取单条的也不是没有用处,比如我们要取出跳转地址,也就是Location的时候,就是用的这种方法。

--------------------------------------------------------------------------------

以下是一个使用WinHttpAddRequestHeaders函数提交协议头和cookie的示例代码: ``` #include <Windows.h> #include <Winhttp.h> #include <iostream> #pragma comment (lib, "winhttp.lib") int main() { HINTERNET hSession = WinHttpOpen(L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if (!hSession) { std::cout << "Error: Failed to open WinHTTP session." << std::endl; return 1; } HINTERNET hConnect = WinHttpConnect(hSession, L"www.example.com", INTERNET_DEFAULT_HTTPS_PORT, 0); if (!hConnect) { std::cout << "Error: Failed to connect to server." << std::endl; WinHttpCloseHandle(hSession); return 1; } HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); if (!hRequest) { std::cout << "Error: Failed to open HTTP request." << std::endl; WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 1; } LPCWSTR headers = L"Content-Type: application/json\r\nAuthorization: Bearer <access_token>\r\nCookie: sessionid=<session_id>; csrftoken=<csrf_token>\r\n"; if (!WinHttpAddRequestHeaders(hRequest, headers, (DWORD)-1L, WINHTTP_ADDREQ_FLAG_REPLACE)) { std::cout << "Error: Failed to add request headers." << std::endl; WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 1; } if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, NULL)) { std::cout << "Error: Failed to send HTTP request." << std::endl; WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 1; } if (!WinHttpReceiveResponse(hRequest, NULL)) { std::cout << "Error: Failed to receive HTTP response." << std::endl; WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 1; } // Do something with the response... WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 0; } ``` 在上面的示例中,我们使用了WinHttpAddRequestHeaders函数来添加了三个请求头:Content-Type、Authorization和Cookie。其中,Authorization字段用于传递访问令牌,Cookie字段用于传递会话ID和CSRF令牌。请注意,这些值都是虚构的,需要根据实际情况进行替换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值