[Window Mobile开发经验小结]HttpClient 开发

本文描述,如果通过 Windows Mobile 的WinInet API来设计实现HttpClient 的收发 经验小结:

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 这个状态!
而在 该状态下的处理,一般就是 设置异步处理事件!!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值