用法和一些实用技巧。
用法,Win32API 在使用时可能会烦琐一些。所以先把用到的 API 简单介绍一下。
调用的第一个方法,它会初始化内部数据结构,为后面的调用做准备。
方法用来关闭使用中打开的 Internet 句柄,释放资源。
函数,应用程序可以用它来请求数据(只要是 WinINet 支持的协议就可以)。尤其是当我们仅仅想要通过一个 URL 获取数据,而不关心通信协议相关的内容时,这个接口就特别合适。该方法会解析参数中的 URL 字符串,然后建立到服务器的连接,并准备下载由 RUL 标识的数据。
内容
支持 gzip 压缩。
方法传入 INTERNET_FLAG_RELOAD 标识。支持 gzip 压缩的,我们的客户端当然也要能够解压缩服务器传回来的 gzip 格式的数据。所以我们要在请求中告诉服务器,客户端是能够处理 gzip 数据的。只有这样,服务器才会主动的返回 gzip 格式的数据。代码如下:
文件的原始名称是什么,返回的数据是以什么格式被压缩的。
方法可以得到返回数据的长度,原始的文件名称,返回数据的格式。
方法本身没什么可说的,但出于简化操作的目的,笔者对 InternetReadFile 进行了简单的封装。创建了一个继承自 Stream 的类 MyInternetReadStream。在重写的 Read 方法中调用 InternetReadFile,并且添加了一个回调方法用来计算下载进度等信息。下面是代码概要,完整代码请参考 demo。
函数,创建一个新的 GZipStream 实例就可以了。
》中的实现基本相同,请参考上文,或者直接看本文的 demo。
》中提到的代理问题,WinINet 的默认设置就能处理好 Credentials。不过在笔者看来,更重要的是我们可以选用不同的方式去处理下载问题。