记录WinHTTP学习过程
一、什么是WinHTTP?
WinHTTP的全称是Microsoft Windows HTTP Services, 它提供给开发者一个HTTP客户端应用程序接口(API),通过这种API借助HTTP协议给其他的HTTP服务器发送请求。
二、WinHTTP访问流程
如上图,大致流程是:
1.通过WinHttpOpen来获得一个Session句柄;
2.使用该句柄通过WinHttpConnect连接服务器获得一个Connect句柄;
3.用得到的Connect句柄通过WinHttpOpenRequest打开Http请求,获得Request句柄;
4.使用这个Request句柄就可以和服务器发送接收数据了;
5.以上句柄需要依次关闭。
初始化WinHttp
在使用WinHttp连接服务器之前,须要使用WinHttpOpen来进行初始化。WinHttpOpen将创建一个维护Http会话细节的会话环境(Session Context),并返回一个session handle。使用该句柄,WinHttpConnect可以连接到目标Http(Https)服务器。
注意 在请求特定的资源之前,WinHttpConnect并不会建立到目标服务器的实际连接。
打开请求
WinHttpOpenRequest打开一个HTTP请求冰球返回一个HINTERNET句柄以供其他HTTP函数使用。在调用WinHttpOpenRequest时并不会向服务器发送请求。实际上是WinHttpSendRequest建立了一个网络链接并发送请求。
下面例子演示了使用默认参数调用WinHttpOpenRequest:
HINTERNET hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL, NULL, NULL, NULL, 0);
增加请求头部
WinHttpAddRequestHeaders方法能够向一个Http请求句柄添加一个或者多个请求头部。
发送请求
WinHttpSendRequest可以建立一个到Http服务器的连接并发送请求。它需要一个HINTERNET句柄作为参数,该句柄由WinHttpOpenRequest创建。WinHttpSendRequest在发送请求的同时可以连带头部或者选项信息一起发送,选项信息通常被用于向服务器发送信息的操作(PUT和POST等)。
在WinHttpSendRequest发送请求之后,应用可以通过使用HINTERNET句柄调用WinHttpReadData和WinHttpQueryDataAvailable方法下载服务器的资源。
向服务器发送数据
要向服务器发送数据,在调用WinHttpOpenRequest时HTTP verb(HTTP method)应设为PUT或者POST。当调用WinHttpSendRequest时,dwTotalLength应设为发送数据的字节数。然后通过WinHttpWriteData来向服务器发送数据。
另外,可以通过设置WinHttpSendRequest的lpOptional参数为一个包含数据的缓冲区的地址来发布到服务器。使用这种方法时,必须设置WinHttpSendRequest的两个参数dwOptionalLength和dwTotalLength 的数据大小。以这种方式调用WinHttpSendRequest的话就不需要再调用WinHttpWriteData了。
获取请求信息
WinHttpQueryHeaders函数允许应用程序检索HTTP请求的信息。该函数需要一个WinHttpOpenRequest返回的HINTERNET,一个information level值,和一个缓冲区长度。同时还需要一个用以存储信息的缓冲区以及一个用以列举同名头部的指针。
从Web下载资源
在通过WinHttpOpenRequest打开一个请求并以WinHttpSendRequest发送至服务端之后,使用WinHttpRecevieResponse可以接受服务端的回应,应用也可硬使用 WinHttpReadData和WinHttpQueryDataAvailable从服务端下载资源。