IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> C#中的http请求及对返回结果的解析 -> 正文阅读

[网络协议]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。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-03 13:23:39  更:2021-12-03 13:25:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:45:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码