A-A+
HttpWebRequest-gzip和deflate的处理
当返回的数据较大时,有的站点开启了数据压缩,在使用HttpWebRequest时,需要注意这一点,只有正常的解压后才能获得数据主体,否则会产生乱码。
如何开启数据压缩?需要在Http请求的头部加入数据压缩指令,再使用HttpWebRequest时,编码如下:
- request.Headers.Add("Accept-Encoding", "gzip");
如果目标站点支持数据压缩,则会返回相应的数据流。使用火狐开发工具,对启用了数据压缩站点的请求进行跟踪,如下:
可以看到,如果站点开启了数据压缩,则会有明显的标识,我们在解析返回流时就需要注意这点。下面这段函数可以帮助我们解析返回的数据流:
- using System.IO.Compression;
- private string GetResponseBody(HttpWebResponse response)
- {
- string result = string.Empty;
- if (response.ContentEncoding.ToLower().Contains("gzip"))
- {
- using (GZipStream stream = new GZipStream(
- response.GetResponseStream(), CompressionMode.Decompress))
- {
- using (StreamReader reader = new StreamReader(stream))
- {
- result = reader.ReadToEnd();
- }
- }
- }
- else if (response.ContentEncoding.ToLower().Contains("deflate"))
- {
- using (DeflateStream stream = new DeflateStream(
- response.GetResponseStream(), CompressionMode.Decompress))
- {
- using (StreamReader reader =
- new StreamReader(stream, Encoding.UTF8))
- {
- result = reader.ReadToEnd();
- }
- }
- }
- else
- {
- using (Stream stream = response.GetResponseStream())
- {
- using (StreamReader reader =
- new StreamReader(stream, Encoding.UTF8))
- {
- result = reader.ReadToEnd();
- }
- }
- }
- return result;
- }