C#中的http请求及对返回结果的解析

首先,发送http请求,下面以发送post为例

public static HttpWebResponse CreatePostHttpResponse(string url, List<ParamBinding> parameters, int TimeOUT, string contentType = "application/x-www-form-urlencoded")
        {
            try
            {

                HttpWebRequest request = null;
                //如果是发送HTTPS请求  
                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    
                    request = WebRequest.Create(url) as HttpWebRequest;
                    request.ProtocolVersion = HttpVersion.Version10;    //http版本,默认是1.1,这里设置为1.0
                   
                }
                else
                {
                    request = WebRequest.Create(url) as HttpWebRequest;
                }

                request.Method = "POST";
                request.ContentType = contentType;
                request.Timeout = TimeOUT;
                request.Headers.Add("Accept-Encoding", "gzip");
                
                //发送POST数据  
                if (!(parameters == null || parameters.Count == 0))
                {
                    StringBuilder buffer = new StringBuilder();
                    int i = 0;
                    string symbol = "&";
                    foreach (ParamBinding key in parameters)
                    {
                        if (i > 0)
                        {
                            buffer.AppendFormat("{0}{1}={2}", symbol, key.ParaName, HttpUtility.UrlEncode(key.ParaValue != null ? key.ParaValue.ToString() : string.Empty));
                        }
                        else
                        {
                            buffer.AppendFormat("{0}={1}", key.ParaName, HttpUtility.UrlEncode(key.ParaValue != null ? key.ParaValue.ToString() : string.Empty));

                            i++;
                        }
                    }
                    byte[] data = Encoding.UTF8.GetBytes(buffer.ToString());
                    using (Stream stream = request.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }
                return request.GetResponse() as HttpWebResponse;
            }
            catch (Exception ex)
            {
               
                return null;
            }
        }

其次,对返回的HttpWebResponse 类型的response进行分析,这里分xml解析和stream解析

Result result = new Result(); 
                    if(response.ContentEncoding.ToLower().Contains("gzip"))
                    {
                        using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
                        {

                            using (StreamReader reader = new StreamReader(stream))
                            {
                                result = XmlHelper.GetResultFromXml(reader, requestType);
                            }
                        }
                    }else
                    {
                        using (Stream stream = response.GetResponseStream())
                        {

                            using (StreamReader reader = new StreamReader(stream))
                            {
                                result = XmlHelper.GetResultFromXml(reader, requestType);
                            }
                        }
                    }

需要注意的问题
1、如果传输的是文件,即单纯的二进制流,xml是无法进行解析的,所以需要通过“response.ContentType.Contains(“xml”)”来判断是否可以通过xml解析,一般来说如果接口不报错,但把错误写在了xml里,则需要通过以上方法进行xml解析
2、response.ContentEncoding不是gzip时,使用GZipStream方法会报错:gzip头的幻数不正确

最后,如果是单纯的stream解析
一、文件流写入文件

if (response.ContentEncoding.ToLower().Contains("gzip"))
                {
                    using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
                    {
                        File.Delete(filePath);
                        const int bufferLen = 4096;
                        byte[] buffer = new byte[bufferLen];
                        int count = 0;
                        Stream outputStream = System.IO.File.OpenWrite(filePath);
                        using (BinaryWriter binaryWriter = new BinaryWriter(outputStream))
                        {
                            while ((count = stream.Read(buffer, 0, bufferLen)) > 0)
                            {
                                binaryWriter.Write(buffer, 0, count);
                            }
                        }
                    }
                }
                else
                {
                    using (Stream stream = response.GetResponseStream())   //获取响应的字符串流
                    {
                        File.Delete(filePath);
                        const int bufferLen = 4096;
                        byte[] buffer = new byte[bufferLen];
                        int count = 0;
                        Stream outputStream = System.IO.File.OpenWrite(filePath);
                        using (BinaryWriter binaryWriter = new BinaryWriter(outputStream))
                        {
                            while ((count = stream.Read(buffer, 0, bufferLen)) > 0)
                            {
                                binaryWriter.Write(buffer, 0, count);
                            }
                        }
                    }
                }

二、如果是解析为字符串,这里的是WebResponse response

string xml = string.Empty;
using (Stream stream = response.GetResponseStream())   //获取响应的字符串流
                {
                    Encoding UTF8 = Encoding.GetEncoding(65001);//使用code page
                    Encoding GBK = Encoding.GetEncoding("GBK");//通过bodyname
                    Encoding GB2312 = Encoding.GetEncoding("gb2312");//通过bodyname

                    switch (Code)
                    {
                        case 0: //ClientTypeDefine.CodeConvert.UTF8:
                            StreamReader srUTF8 = new StreamReader(stream, System.Text.Encoding.UTF8); //创建一个stream读取流
                            xml = srUTF8.ReadToEnd();   
                            break;
                        case 1: //ClientTypeDefine.CodeConvert.GBK:
                            StreamReader srGB2312 = new StreamReader(stream, GB2312); //创建一个stream读取流
                            xml = srGB2312.ReadToEnd(); 
                            break;
                        case 2: //ClientTypeDefine.CodeConvert.GB2312:
                            StreamReader srGBK = new StreamReader(stream, GBK); //创建一个stream读取流
                            xml = srGBK.ReadToEnd();   
                            break;
                        default:
                            StreamReader srdefault = new StreamReader(stream, System.Text.Encoding.UTF8); //创建一个stream读取流
                            xml = srdefault.ReadToEnd();   
                            break;
                    }
                }

文件传输流还有Deflate,和gzip一样是文件传输流
gzip是一种数据格式,默认且目前仅使用deflate算法压缩data部分;
deflate是一种压缩算法,是huffman编码的一种加强。

deflate与gzip解压的代码几乎相同,可以合成一块代码。
区别仅有:

deflate使用inflateInit(),而gzip使用inflateInit2()进行初始化,比 inflateInit()多一个参数: -MAX_WBITS,表示处理raw deflate数据。因为gzip数据中的zlib压缩数据块没有zlib header的两个字节。使用inflateInit2时要求zlib库忽略zlib header。在zlib手册中要求windowBits为8…15,但是实际上其它范围的数据有特殊作用,见zlib.h中的注释,如负数表示raw deflate。
Apache的deflate变种可能也没有zlib header,需要添加假头后处理。

即MS的错误deflate (raw deflate).zlib头第1字节一般是0x78, 第2字节与第一字节合起来的双字节应能被31整除,详见rfc1950。例如Firefox的zlib假头为0x7801,python zlib.compress()结果头部为0x789c。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值