1. WinInet API 是 MS 在Windows平台封装的一套 API,用来实现 HTTP,FTP 以及类似的高层协议的封装,在Winmobile平台也能使用,只是细微地方略有差别
2. 一个推荐的实现 HTTP client 的WinInet API 调用序列如下:
1)调用 HINTERNET InternetOpen //初始化 WinInet API 得到重要的句柄: hInternetOpen
2)调用 InternetConnect (hInternetOpen... ---> hInternetConnect
3) 调用 HttpOpenRequest(hInternetConnect... -->传入 POST 或 GET 请求 重要获得一个 hHttpRequest 句柄,对于GET 和 POST 是有区别的,因为
GET 是获取Server上的一个content,而 POST 是传递信息给Server,然后得到Server的响应数据
3.1)GET:
::HttpOpenRequest(hHttpRequest,
TEXT("GET"),//注意是 UNICODE
Object, //要获取的对象,比如一个 html文件
HTTP_VERSION,// lpszVersion, 定义在WinInet.h
NULL,//lpszReferrer -视 Object 而定,可能需要填充
0,//lplpszAcceptTypes 对于GET 页面来说,可以不填,但是其他 type的content,需要填写了
INTERNET_FLAG_DONT_CACHE,// flag ,具体可参考 MSDN
(DWORD)this);//在这里有个 trick,下面再说
3.2) POST:
::HttpOpenRequest(hHttpRequest,
TEXT("POST"),//注意是 UNICODE
Object, //POST 对象,比如一个 asp文件
HTTP_VERSION,// lpszVersion, 定义在WinInet.h
NULL,//lpszReferrer --视 Object 而定,可能需要填充
(LPCTSTR*)lpAcceptTypes,//lplpszAcceptTypes lpAcceptTypes={TEXT("*/*"), NULL}; 一个多维 字符串数组
INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_RELOAD, // flag ,具体可参考 MSDN
(DWORD)this);//在这里有个 trick,下面再说
4) 在hHttpRequest 可以在 hHttpRequest 句柄 上先做一些操作,如获得 HTTP header,设置超时 Options等等
4.1)如果是 GET 操作,则 在hHttpRequest 句柄 上可通过 ::HttpSendRequest(在hHttpRequest,NULL,0,0,0) 方式简单获得 Server上的对象。
4.2) POST操作,可通过如下方式 来与 Server通信:
::HttpSendRequest(在hHttpRequest,
NULL,// 针对我们的 35旅游项目 无需头数据
0,// 针对我们的 35旅游项目 无需头数据
buf,要发送给server的数据buf,
buflen,//要发送的长度(bytes为单位)),
5) hHttpRequest 句柄 上调用 HttpSendRequest 来发请求数据了,这个请求数据封装在 Headers中,注意,如果之前用POST,
那么就需要填充该函数的第4,5个参数 lpOptional, dwOptionalLength
...
6) hHttpRequest 句柄可通过调用 HttpQueryInfo 读取Sever返回来的头数据 HTTP_QUERY_RAW_HEADERS_CRLF
7) 通过 Response返回的头 判断状态码,做错误处理 (具体状态码变化详见 RFC2616 P30)
可以通过调用 HttpQueryInfo(...HTTP_QUERY_STATUS_CODE...)方式来获得
8) 读取数据: 无论是 POST,还是GET 后,服务器返回的数据,都可以在hHttpRequest 句柄上
反复通过调用 InternetReadFile 来读取Server返回的数据, 但当返回的数据长度为0时,表示本次 request与response结束
注意: 在 调用InternetOpen的时候,建议使用 INTERNET_FLAG_ASYNC 参数--采用异步连接/收发数据
trick:在使用异步的方式,那么需要你在如下调用函数后,注册一下 回调函数
InternetConnect
HttpOpenRequest
HttpSendRequest
回调函数是用来检测 各种状态变化的,其中对于 POST,GET 比较重要的是: INTERNET_STATUS_REQUEST_COMPLETE 这个状态!
而在 该状态下的处理,一般就是 设置异步处理事件!!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alaofangel/archive/2009/12/07/4954453.aspx