c++Post基础入门篇第4课WinHttp代理设置及get、post方法演示

一、get方法提交数据到服务器

get方法提交数据是将要提交的数据附加在URL地址后,以键值对的形式,多个键值对用"&"连接起来。表现形式如下:

CString csData;

csData.Format(_T("?name=%s&pass=%s"), user, pass);

_bstr_t bsData = csData;

hr = pRequest->Open(_T("GET"), bsData);

二、post方法提交数据到服务器

post方法提交数据是将数据放在请求正文里,即requestBody里。发送方式:

CString csData;

csData.Format(_T("name=%s&pass=%s"),user,pass);

COleVariant bsData = csData;

hr = pRequest->SetRequestHeader(_T("Content-Type"), _T("application/x-www-form-urlencoded"));

hr = pRequest->Send(bsData);

这里设置了一个请求头部字段值Content-Type:application/x-www-form-urlencoded。因为不设置的话默认是Content-Type:text/plain编码格式,会导致服务器端获取失败。

三、设置代理服务器

无论是get还是post方法提交数据,但是Fiddler抓包软件始终对我们的程序不能抓取任何报文,因为Fiddler软件默认是开启本地代理的,监听在本地8888端口。而能抓取浏览器的请求,是因为当年打开fiddler抓包软件的时候,它会自动设置Internet局域网的代理服务器为127.0.0.1:8888,所以可以抓取报文。而我们的程序依然是走的80端口,当然就抓不到数据报文。为了能够抓取到数据包,我们应该在程序代码里设置一下代理服务器跟fiddler的一样。那样就可以抓到了。

HTTPREQUEST_PROXY_SETTINGHTTPREQUEST_PROXYSETTING_DEFAULT = 0;

HTTPREQUEST_PROXY_SETTINGHTTPREQUEST_PROXYSETTING_PRECONFIG = 0;

HTTPREQUEST_PROXY_SETTINGHTTPREQUEST_PROXYSETTING_DIRECT = 1;

HTTPREQUEST_PROXY_SETTINGHTTPREQUEST_PROXYSETTING_PROXY = 2;

hr = pRequest->SetProxy(HTTPREQUEST_PROXYSETTING_PROXY,_T("127.0.0.1:8888"));

经过上面的代理设置依然是可以抓到数据包了,但是都是外部服务器的数据包,如www.baidu.com、www.vcworlds.com等,但是对于我们使用localhost这种地址的始终是抓不到。原来是不能抓取这种本地回环地址的数据包的,那我们就取个小技巧,改一下C:\Windows\System32\drivers\etc\hosts文件,添加一句话:

127.0.0.1 www.vcworlds.org

这样我们访问 www.vcworlds.org这个地址就是访问localhost地址了,最终fiddler可以抓取到报文了,这对我们调试自己的发包程序有很好的辅助作用,可以实时了解数据包的构造情况,以便改正错误。当然设置代理并不是为了抓包,还可以隐藏自己的IP地址,这里大家不要干坏事。

举报/反馈