标签:
最近一直在做C# winform客户端项目,因为涉及到和服务器交互,所以研究了一下C#的HTTP网络编程。
Http通信是通过Http请求报文和Http应答报文来实现的。
由于我开发的是客户端,所以主要工作就在于封装Http请求报文,以及收到应答报文后解析数据。
如果你使用的是chrome浏览器,按F12就可以开启调试模式。现在主流的浏览器应该都支持这个功能。随便打开一个网页,触发一个超链接请求,应该就能抓取到Http请求报文。
举个例子,以下是一个Http请求报文的截取内容。
我们可以看到请求报文中有很多参数,这里不一一详解各个参数的意义。
我个人认为,发送Http请求报文主要有四个步骤:
1. 初始化HttpWebRequest(需要引用System.Net)
2. 封装Http cookie
3. 封装Http报文头
4. 封装请求内容,并将封装好的请求报文用Stream类写入流(需要引用System.IO)
5. 接收应答报文
接下来,我们一步一步来讲解如何在C#中完成Http请求报文的封装。
使用请求地址作为参数,初始化一个HttpWebRequest实例。
首先,简单说明一下Cookie。有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。本文为了示例,就以比较简单的形式展现。
在C#中,使用Cookie类来封装cookie,以键值对的形式保存。
然后,将这个封装好的cookie添加到CookieContainer容器中,最后填入HttpWebRequest。既然是容器,顾名思义,可以添加多个cookie。
根据自己要发送的请求报文类型来填充Http报文头。
以下是一个简单范例:
首先,将要写入的内容转为byte数组(假设是文本内容)。将数组长度填入HttpWebRequest的ContentLength字段。
通过GetRequestStream()获取HttpWebRequest的请求流。使用这个流对象写入数组内容。
最后,千万不要忘记关闭流。本人在开发C#客户端和Java服务器交互过程中,就遇到这个问题。由于忘记关闭流,Java服务器在解析请求报文时,总是提示不能识别流的结尾。
通过流将请求报文发出去后,可以通过HttpWebRequest的GetResponse()方法来获取HttpWebResponse。
至此,Http请求过程结束。大家有疑问的地方,欢迎和我探讨。
过两天,我再整理一下上传文件的 Http方法。
附上完整方法
标签:
原文地址:http://www.cnblogs.com/jingmoxukong/p/4793643.html