1. GET方法。给定一个URL(可以带中文),返回http的响应数据,包括文本和二进制数据
2. 支持代理服务器,需要用户预先设定好proxy server ip, port, username,password.
不支持的有:
1. POST
2. 查询http响应的header。
3. 将返回的文本数据重新编码,变成UTF-16。这需要首先从header取出httpserver响应的数据是什么编码的,然后就可以使用windows的MultiByteToWideChar来进行转换。
这里总结几点开发过程中的注意点:
1. MSDN上的资料不是非常的全,所以有些参考了google得来的内容。
2. WinHttpOpen的时候,如果用AUTOPROXY,也就是让winhttp从注册表读取proxy设置的话(这个注册表的设置是proxycfg.exe生成的,和IE中的那个proxy设置是两码事)。
3. proxy的用户名和密码需要用WinHttpSetOption来进行设置,timeout设定用WinHttpSetTimeouts

4. 使用WinHttpCrackUrl可以将一个给定的url(必须以http://,https://打头)分解,设置到URL_COMPONENTS这个structure中。在这里其实就可以做urlencoding(也就是将url不支持的字符转换成%xxx这样的东西),但是这样做的话需要手动给URL_COMPONENETS中的member分配内存,比较麻烦,所以没做。
5.使用WinHttpCreateUrl可以根据URL_COMPONENETS重新生成一个string的URL,但是这里没用到。
6. 使用WinHttpConnect的时候,一定要注意要给出hostname,不是url,所以要手动分解,只取出httpserver的那个部分,比如http://www.google.com/sfsdfdsf?id=xxx&user=xxxx,hostname就是www.google.com
7.然后使用WinHttpOpenRequest的时候,就可以给出去掉了http://之后的后面所有内容了,也就是www.google.com/sfsdfdsf?id=xxx&user=xxxx这样的东西。 注意最后的flag设置:WINHTTP_FLAG_ESCAPE_PERCENT |WINHTTP_FLAG_REFRESH,这两个很有用,WINHTTP_FLAG_ESCAPE_PERCENT就是将url中不合法的内容转成%xxx,WINHTTP_FLAG_REFRESH就是跳过proxy的cache,每次都请求全新的数据。还有需要注意的是,WinHttpOpenRequest中,要求给出我们能接受的mimetype,这里可以参考代码,如果要文本,就给text/*,如果要二进制数据,就可以像这里给出application/*, image/*, audio/*......
8. 最后WinHttpSendRequest的时候,也可以设定additionalheader和optional数据。这里的optional数据一般是用于POST的,也就是将需要post到server的数据填充在这个地方。WinHttpSendRequest将header都发送出去之后,紧接着就会发送这个optional数据。
9.WinHttpQueryDataAvailable可以check是否还有数据需要接收。WinHttpReadData用来读取数据,注意读出来的数据就是字节流,像前面所说,如果是文本,那么要根据responseheader,首先知道是什么编码和字符集,然后再用MultiByteToWideChar来转换。也要注意WinHttpReadData的最后一个参数,给出了实际读取到的字节数,也可以根据这个信息来判断是否已经接收完了。此外特别需要注意的是,如果用的是一个固定的buffer循环接收,就像这里一样,那么不要忘记接收完成的时候,要在尾部加上 ,分配buffer的时候也要留出 的位置。