关键字:WinMobile,MFC,WinInet,CHttpFile,Header,Request,报头,消息,响应.....

昨天头儿让我添加个功能,利用http协议的请求回复中的消息报头来进行设备的验证(据说这个原理可以用来网络刷票 --),真幸运啊,我正好前两天看了孙鑫大虾的http协议视频(太感激了,向孙大虾致以崇高的敬意),也不算一无所知,之前确实是基本无知.我参考头儿之前的代码来进行实现,首先要明确,假如我发送到服务端进行验证的消息报头是a:b和c:d(key:value形式),需要查询的消息报头的key是e,f.另外要说明的是,WinMobile的系统接口统统为UNICODE,而真正的http协议是ASCII还是ansi码(--好像是前者)传输,我们不用担心编码问题,系统底层肯定会为我们提供转换.

HTTP协议详解:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

CHttpFile::QueryInfo:http://www.kaifa6.com/v/MFCShouce/Class/CHttpFile_QueryInfo.htm

CHttpFile:http://bk.chinaar.com/index.php?doc-view-93

还有一个CInternetSession,这个我不太理解,但是看到其GetHttpConnection(strServerName,dwPort)可以返回一个CHttpConnection,估计是和一个指定主机建立对话(Session),不知道是封装了什么系统API呢?internetopenurl?

添加的功能很简单 第一步

CInternetSession session;

然后第二步

CHttpConnection* f = session.GetHttpConnection(strServerName,dwPort);(有一个很神奇的函数可以解析URL  AfxParseURL())

接着第三步

CHttpFile *f=http->OpenRequest(CHttpConnection::HTTP_VERB_GET,strObject,0,1,0,0,dwServiceType==AFX_INET_SERVICE_HTTPS?INTERNET_FLAG_SECURE:0);//第一个参数你可以直接写 其实就是请求行

strObject是我们需要的远程主机的路径(这里有些不太懂)

第四步f->SendRequest(head);   head是个CString   你可以这样来写我们要发过去的headers      就是_T("a:b\r\nc:d")   或者可以用CHttpFile 的一个AddHttpHeader的方法,大概是它,排在第二位,不过这个函数功能貌似就很专业了,CHttpFile 好像还有个SetOption的函数,不过我没用过,反正有了这些武器,写起代码来轻松很多,想到这里感慨啊,微软为我们实现各种功能的工程师们好厉害啊,也很辛苦啊

 

第五步 也就是最后一步 超级恶心啊  T_T

           f->QueryInfo(HTTP_QUERY_CUSTOM
                            |HTTP_QUERY_RAW_HEADERS_CRLF,
                            e,
                            f,
                            NULL);

就是这个函数,是对系统API的HTTPQueryInfo进行了封装,我英文好菜,很多说明看不懂,结果大部分时间都耗上了,说明里说了,第一个参数有些flag要组合使用,我没弄明白,结果怎么弄怎么错,HTTP_QUERY_RAW_HEADERS_CRLF单独使用可以得到所有报头.还有一点,msdn上的系统API说明里,参数前面会有_in_out的标记,这个表名参数是输入还是输出,如果都有那就是先输入,然后结果会输出,二三俩参数就是in&out,一个是输入key执行完变成value,一个是输入缓冲区大小,再输出获得的数据的大小,单位是字符数量,不是字节,T_T嫩牛满面啊,说到这连我都明白咋回事儿了,大侠们不要笑话我,微软的人真是人才,最后一个参数的意思是如果有重名的报头你选第几个--,然后就好办了

另外在网上看到有人说HTTP_QUERY_CUSTOM不能单独使用是因为有bug,我看了下说明,是vc6

的时候有bug,但是既然ms说了组合使用,用该不算bug了吧

关于那个bug

这样就得到了我们指定的想要得到的response(就是俗称http回应)的消息报头的value,然后拿来进行判断完成验证功能,俺用了一天半时间,基本上就耗在第五步上面了,网上的信息似乎也不多,这次经历真是触目惊心,伤痕累累,呵呵,不过印象深刻咯,不过我对不少基本的相关api和机制还不太掌握,对于微软经常出现flag参数现在有了更深的体会,F12了一下大概知道是01串然后做或运算的原理,不过还是感觉不能完全明白,也说不出哪儿不明白,估计是不明白的地方太多了T_T

你可能感兴趣的:(request)