(一)
HTTP是Hypertext Transfer Protocol的简称,即:超文本传输协议。在TCP/IP协议簇中的一百多个协议中,HTTP协议可以说是平常接触最多的一种协议了。因为日常浏览网页时所使用的浏览器浏览,其基本的协议类型就是HTTP协议。HTTP协议是一个客户端/服务器协议,这里所说的服务器端是指提供WWW服务的主机,即各类Web站点等。而客户端是指运行各类浏览器(如IE、Netscape等)或者下载工具的主机。
HTTP协议从产生到目前,主要经历了三个发展阶段,也就是通常说的三个版本:HTTP 0.9、HTTP 1.0和HTTP 1.1版。HTTP 0.9版也是HTTP原始协议,它最早出现在1990年,由于它只是一个简单的面向消息的协议,所以很快一个新的HTTP协议版本出现了,即:HTTP 1.0版,这个版本在保持了对HTTP 0.9版本的兼容的同时,还增加了在复杂网络情况下,对不同的类型的对象服务能力。HTTP 1.1是在HTTP 1.0基础上发展下来的,它依然保持对HTTP 0.9和HTTP 1.0的兼容。和HTTP 1.0比较,主要改进的是性能、安全和数据处理方面。目前人们又开始提出了HTTP协议的下一个版本了,那就是HTTP-NG(Next Generation of HTTP)。在这个版本中,可以想象的是无论是性能、效率还是安全性都会有一个更大的提高。
在TCP/IP协议簇中的所有协议,.Net FrameWork SDK中对HTTP协议的支持是最全面的,具体表现在.Net FrameWork SDK为实现HTTP协议提供了许多专门的类。其数量之多,功能之全面是其他协议无可比拟的。Visual Basic .Net通过使用这些类,可以方便的实现各种HTTP协议功能。
一.HTTP协议会话:
HTTP协议是一个客户端/服务器协议,它是建立在请求/响应范式的,客户机和服务器完成一个HTTP会话主要通过以下四步:
1. 建立连接。建立连接是通过申请套接字(Socket)实现的。客户打开一个套接字并把它约束在一个端口(HTTP协议一般使用的是80端口)上,如果成功,就相当于建立了一个虚拟文件。以后就可以在该虚拟文件上写数据并通过网络向外传送。
2. 客户端发送请求。 在建立连接后,客户机会往服务器正在侦听的端口发送请求消息,完成提出请求动作。一个完整的请求消息=请求行和请求头,其中请求头包括包括用户可以接受的数据类型、压缩方法、语言、长度、压缩方法、最后一次修改时间、数据有效期等。大多数请求头并不是必需要定义的,但对于POST请求命令来说Content-Length就必须定义。一个请求行的结构如下:
请求命令 请求URI HTTP版本号
其中的HTTP协议中的请求命令见表01所示。图01是利用侦听方法获得的客户端IE浏览器向WWW主机发送请求命令。
图01:IE浏览器向WWW主机发送请求行命令
请求命令 | 功能 |
GET | 请求一个WWW页面或者URI资源 |
HEAD | 要求服务器查找某对象的元信息,而不是对象本身 |
PUT | 从客户机向服务器传送数据,在要求服务器和CGI做进一步处理时会用到POST方法。POST主要用于发送HTML文本中FORM的内容,让CGI程序处理 |
POST | 附加资源 |
DELETE | 删除操作 |
LINK | 连接二个存在的资源 |
UNLINK | 切断二个已有的资源连接 |
表01:HTTP协议中客户端的请求命令
3. 服务器进行响应。服务器在处理完客户的请求之后,要向客户机发送响应消息。其响应消息是由状态行和应答头组成的。其中应答头包括服务程序名,通知客户请求的URI需要认证,请求的资源何时能使用等。状态行的主要结构如下:
HTTP版本号 状态码 原因叙述
其中最常见的状态码是“200”和“404”,下面是服务器响应客户端的一个请求通过的状态行:
HTTP/1.1 200 OK
下面是服务器响应客户端的一个请求失败的状态行:
HTTP/1.1 404 Object Not Found
4. 关闭连接。
在下面的内容中将使用Visual Basic .Net通过.Net FrameWork SDK提供的类来模拟IE浏览器中发送的请求行命令以及获取WWW主机返回的状态行信息。首先还是先了解一下.Net FrameWork SDK为在Visual Basic .Net实现HTTP协议所提供的类。
(二)
二..Net FrameWork SDK中提供的实现HTTP协议的类:
在.Net FrameWork SDK中实现HTTP协议的类主要位于命名空间“System.Net”。主要的类有十七种,其名称及其功能简介具体如表02所示:
类 | 作用 |
FileWebRequest | 提供WebRequest类的文件系统实现。 |
FileWebResponse | 提供WebResponse类的文件系统实现。 |
GlobalProxySelection | 包含所有HTTP请求的全局默认代理实例。 |
HttpVersion | 定义受HttpWebRequest和HttpWebResponse类支持的HTTP 版本号。 |
HttpWebRequest | 提供WebRequest类的HTTP特定的实现。 |
HttpWebResponse | 提供WebResponse类的HTTP特定的实现。 |
NetworkCredential | 为基于密码的身份验证方案提供凭据。 |
CredentialCache | 为多个凭据提供存储。 |
ServicePoint | 提供HTTP连接的连接管理。 |
WebClient | 提供向URI标识的资源发送数据和从URI标识的资源接收数据的公共方法。不能继承此类。 |
WebException | 通过可插接协议访问网络期间出错时引发的异常。 |
WebHeaderCollection | 包含与请求或响应关联的协议标头。 |
WebPermission | 控制访问HTTPInternet资源的权限。 |
WebPermissionAttribute | 指定权限以访问Internet资源。 |
WebProxy | 包含WebRequest类的HTTP代理设置。 |
WebRequest | 发出对统一资源标识符(URI)的请求。 |
WebResponse | 提供来自统一资源标识符(URI)的响应。 |
表02:.Net FrameWork SDK中提供的用以实现HTTP协议的类
由于.Net FrameWork SDK中提供的用以实现HTTP协议的类实在太多,下面就选择一些在实现HTTP协议的客户端程序中经常使用的、以及本文下面内容中所涉及到的的类加以介绍。
1. WebRequest类:
WebRequest类是一个基类,它在.Net框架中主要用于访问Internet数据的请求/响应模型。在创建WebRequest类实例时,请注意下面二个问题:
(1).一般不采用WebRequest类提供的构造函数,而使用其的Creat方法来创建并初始化WebRequest类实例。
(2).HttpWebRequest类虽有构造函数。但使用复杂,所以并不提倡。请注意WebRequest类的Creat方法的语法,其语法如下:
public static WebRequest Create (
Uri requestUri
) ;
当以“http://”或者“https://” 开头的URI传递到上面的requestUri参数中时,Create方法返回其实虽为WebRequest实例,但此实例的实质为HttpWebRequest实例。在下面内容中WebRequest的主要作用就是为创建HttpWebRequest 实例。表03是WebRequest类中的常用属性和方法及其说明:
属性 | 说明 |
ConnectionGroupName | 获取或设置请求的连接组的名称。 |
ContentLength | 获取或设置所发送的请求数据的内容长度。 |
ContentType | 获取或设置所发送的请求数据的内容类型。 |
Credentials | 获取或设置用于对Internet资源请求进行身份验证的网络凭据。 |
Headers | 获取或设置与请求关联的标头名称/值对的集合。 |
Method | 获取或设置要在此请求中使用的协议方法。 |
PreAuthenticate | 指示是否对请求进行预先身份验证。 |
Proxy | 获取或设置用于访问此Internet资源的网络代理。 |
RequestUri | 获取与请求关联的Internet资源的 |
Timeout | 获取或设置请求超时前的时间长度。 |
表03:WebRequest类的常用属性及其说明
2. HttpWebRequest类:
HttpWebRequest类主要是实现上面介绍的HTTP会话中的第一、二步骤。当创建完HttpWebRequest实例后,并设定HttpWebRequest实例的“GET”属性后,HTTP请求信息中的请求行就定义完成了。定义HTTP请求信息中的请求头,并把请求信息发送出去就需要了解、掌握HttpWebRequest类中的方法和属性。表04是定义HTTP请求头对应的HttpWebRequest类属性和方法,表05是HttpWebRequest类常用方法及其说明。
请求头 | 设置 |
Accept | 由Accept属性设置。 |
Connection | 由Connection属性和KeepAlive属性设置。 |
Content-Length | 由ContentLength属性设置。 |
Content-Type | 由ContentType属性设置。 |
Expect | 由Expect属性设置。 |
Date | 由系统自动设置为当前日期。 |
Host | 由系统自动设置为当前主机信息。 |
If-Modified-Since | 由IfModifiedSince 属性设置。 |
Range | 由AddRange方法设置。 |
Referer | 由Referer属性设置。 |
Transfer | encoding 由TransferEncoding属性或SendChunked属性设置。 |
User | Agent 由UserAgent属性设置。 |
表04:设定HTTP请求头对应HttpWebRequest类方法或属性
方法 | 说明 |
Abort | 取消对Internet资源的请求。 |
AddRange | 向请求添加范围标头。 |
BeginGetRequestStream | 开始对用来写入数据的Stream实例进行异步请求。 |
BeginGetResponse | 开始对Internet资源的异步请求。 |
EndGetRequestStream | 结束对用于写入数据的Stream实例的异步请求。 |
EndGetResponse | 结束对Internet资源的异步请求。 |
GetRequestStream | 获取用于写入请求数据的Stream实例。 |
GetResponse | 返回来自Internet资源的响应。 |
表05:HttpWebRequest类常用属性及其说明
其中“BeginGetRequestStream”和“EndGetRequestStream”、“BeginGetResponse”和“EndGetResponse”是二对异步方法,其功能分别相当于“GetRequestStream”和“GetResponse”方法。
3. HttpWebResponse类:
HttpWebResponse类主要用以实现HTTP会话中的后面二个步骤。下面介绍的示例中的HttpWebResponse类起的主要作用获得服务器响应的数据,其中包括应答头。HttpWebResponse类虽提供了构造函数,但HttpWebResponse类实例的创建并不使用这个构造函数,这一点和HttpWebRequest类非常相似。而是通过HttpWebRequest类的“GetResponse”方法,此方法是当对指定的URI提出请求通过后,远程Internet资源返回的响应,下面是“GetResponse”方法的语法:
public override WebResponse GetResponse ( ) ;
可见,如果成功返回,则GetResponse方法返回的是包含来自Internet资源的响应的WebResponse实例。但这个返回的实例实质的类型是HttpWebResponse。在Visual Basic .Net中可以通过类型转换就可得到程序中所要使用的HttpWebResponse实例,从而为获取从WWW主机反馈的数据。表06和表07分别是HttpWebResponse类的常用属性和方法及其说明。
属性 | 说明 |
CharacterSet | 获取响应的字符集。 |
ContentEncoding | 获取用于对响应的体进行编码的方法。 |
ContentLength | 获取请求返回的内容的长度。 |
ContentType | 获取响应的内容类型。 |
Cookies | 获取或设置与此请求关联的Cookie。 |
Headers | 获取与来自服务器的响应关联的标头。 |
LastModified | 获取最后一次修改响应内容的日期和时间。 |
Method | 获取用于返回响应的方法。 |
ProtocolVersion | 获取响应中使用的HTTP协议的版本。 |
ResponseUri | 获取响应请求的Internet资源的 |
Server | 获取发送响应的服务器的名称。 |
StatusCode | 获取响应的状态。 |
StatusDescription | 获取与响应一起返回的状态说明。 |
表06:HttpWebResponse类的常用属性及其说明
方法 | 说明 |
Close | 关闭响应流。 |
GetResponseHeader | 获取与响应一起返回的指定应答头内容。 |
GetResponseStream | 获取用于读取来自服务器的响应的数据流。 |
表07:HttpWebResponse类的常用属性及其说明
以上介绍的三个类,是Visual Basic .Net编写基于HTTP协议网络应用程序所必须掌握的。当然在.Net FrameWork SDK为能够更好的处理HTTP中各种问题,还提供了许多类,其中包括用以处理身份认证的类,如NetworkCredential和CredentialCache类等。这些类就不具体介绍了。下面就结合若干具体的示例来了解、掌握在Visual Basic .Net使用上述类来实现HTTP协议的方法。
(三)
三.本文程序设计、调试和运行的环境:
(1).微软公司视窗2000服务器版。
(2).Visual Studio .Net正式版,.Net FrameWork SDK版本号3705。
四.Visual Basic .Net实现HTTP会话的请求头并获取应答头:
下面示例可以自定义HTTP会话中的请求头中各单位的数据,并获取从WWW主机返回的应答头,并从中提取重要的属性对应的数据,具体的实现方法请参阅下面的实现步骤,以下就是用Visual Basic .Net实现HTTP会话的请求头并获取应答头项目的具体实现步骤:
1. 启动Visual Studio .Net。
2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。
3. 将【项目类型】设置为【Visual Basic项目】。
4. 将【模板】设置为【Windows应用程序】。
5. 在【名称】文本框中输入【Visual Basic .Net中实现HTTP协议】。
6. 在【位置】的文本框中输入【E:VS.NET项目】,然后单击【确定】按钮,这样在“E:VS.NET项目”目录中就产生了名称为“Visual Basic .Net中实现HTTP协议”的文件夹,并在里面创建了名称为“Visual Basic .Net中实现HTTP协议”的项目文件。具体如图02所示
图02:【新建项目】对话框
7. 把Visual Studio .Net的当前窗口切换到【Form1.vb(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件,并如图3那样排列和修改相应属性:
图03:设计界面
一个Button组件,其功能也是向Web主机发送定制的GET命令,并获得从Web主机反馈来的应答头。并在这个Button组件拖入Form1的设计窗体后,双击它,则系统会在Form1.vb文件分别产生这个组件的Click事件对应的处理代码。
8. 在Form1.vb文件的最前面添加下列代码,下列代码在Form1.vb中导入程序中要使用的类所在的命名空间:
Imports System.Net
9. 用下列代码替换Form1.vb中的Button1的Click事件对应的处理代码,下列代码功能是定制HTTP请求头向给定的URI地址发送GET命令,并提取从WWW主机反馈的应答头数据:
Dim myHttpWebRequest As HttpWebRequest Dim myHttpWebResponse As HttpWebResponse Try Dim URL As String = textBox1.Text Dim myUri As Uri = New Uri ( textBox1.Text ) Dim myWebRequest As WebRequest = WebRequest.Create ( URL ) '使用Creat方法创建WebRequest实例 myHttpWebRequest = CType ( myWebRequest , HttpWebRequest ) '实现WebRequest类型和HttpWebRequest类型的转换 ' 以下代码是设定请求头,如果请求头 ' 没有设置则采用系统缺省的设置 myHttpWebRequest.KeepAlive = True '设定此HTTP连接是否是永久连接 myHttpWebRequest.Timeout = 300000 '设定此HTTP连接的超时时限,请注意这里的单位是毫秒 myHttpWebRequest.Method = "GET" '设定请求命令类型 ' 以下代码是发送请求信息,并从获得的响应信息中 ' 提起应答头中各属性数据 Dim myWebResponse As WebResponse = myHttpWebRequest.GetResponse ( ) '获得响应信息 myHttpWebResponse = CType ( myWebResponse , HttpWebResponse ) '实现从WebResponse类型到HttpWebResponse类型转换 ' 以下代码是从响应信息中提起应答头 textBox2.Text = myHttpWebResponse.ContentType.ToString ( ) '获得“内容类型”应答头 textBox3.Text = myHttpWebResponse.ContentLength.ToString ( ) '获得“内容长度”应答头 textBox4.Text = myHttpWebResponse.Method.ToString ( ) '获得“方法”应答头 Dim iStatCode As Integer = CInt ( myHttpWebResponse.StatusCode ) '获得“状态码”应答头 textBox5.Text = iStatCode.ToString ( ) textBox6.Text = myHttpWebResponse.ProtocolVersion.ToString ( ) '获得“协议版本”应答头 textBox7.Text = myHttpWebResponse.Server.ToString ( ) '获得“服务器”应答头 textBox8.Text = myHttpWebResponse.Headers.ToString ( ) '显示从Internet资源返回的所有应答信息 Catch WebExcp As WebException MessageBox.Show ( WebExcp.Message.ToString ( ) ) Catch ex As Exception MessageBox.Show ( ex.ToString ( ) ) End Try End Sub |
10. 至此,在上述步骤都正确执行后,【Visual Basic .Net中实现HTTP协议】项目的全部工作就完成了。单击快捷键F5就可以运行程序,此时单击【GET命令】按钮后,程序就会向指定的URI地址发送GET命令,并把从WWW主机反馈的应答头按条目显示出来,具体如图04所示:
图04:运行界面
(四)
五.Visual Basic .Net实现查看网页内容:
下面介绍的示例的功能是查看给定给定的URI对应的Web页面的内容,此功能类似IE浏览器中的“查看源文件”。其主要使用的无非也是WebRequest、HttpWebRequest和远程Web主机创建HTTP连接,然后通过WebResponse和Http WebResponse获得从Web主机返回的数据流,这些数据流就是Web主机对应的Web页面的内容。是想的具体步凑与上面大致相同,只需要修改两个地方
1. 在【名称】文本框中输入【Visual Basic .Net实现查看网页内容】。
2. 在【位置】的文本框中输入【E:VS.NET项目】,然后单击【确定】按钮,这样在“E:VS.NET项目”目录中就产生了名称为“Visual Basic .Net实现查看网页内容”的文件夹,并在里面创建了名称为“Visual Basic .Net实现查看网页内容”的项目文件。
3. 界面设计如图6:
图06:设计界面
4. 在Form1.vb文件的最前面添加下列代码,下列代码在Form1.vb中导入程序中要使用的类所在的命名空间:
Imports System.Net Imports System.IO '程序中使用到StreamReader类 using System.Text ; '程序中使用到Encoding类 |
7. 用下列代码替换Form1.vb中的Button1的Click事件对应的处理代码,下列代码功能是和指定的Web主机建立HTTP会话连接,并读取从Web主机反馈来的数据流:
Private Sub button1_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles button1.Click Dim myHttpWebRequest As HttpWebRequest Dim myHttpWebResponse As HttpWebResponse Try Dim URL As String = textBox1.Text Dim myUri As Uri = New Uri ( textBox1.Text ) Dim myWebRequest As WebRequest = WebRequest.Create ( URL ) '使用Creat方法创建WebRequest实例 myHttpWebRequest = CType ( myWebRequest , HttpWebRequest ) '实现WebRequest类型和HttpWebRequest类型的转换 Dim myWebResponse As WebResponse = myHttpWebRequest.GetResponse ( ) '获得响应信息 myHttpWebResponse = CType ( myWebResponse , HttpWebResponse ) Dim myStream As Stream = myHttpWebResponse.GetResponseStream ( ) '获得从当前Internet资源返回的响应流数据 Dim srReader As StreamReader = New StreamReader ( myStream , Encoding.Default ) '利用获得的响应流和系统缺省编码来初始化StreamReader实例。 Dim sTemp As String = srReader.ReadToEnd ( ) '从响应流从读取数据 srReader.Close ( ) richTextBox1.Text = sTemp '显示读取的数据 ( ) Catch WebExcp As WebException MessageBox.Show ( WebExcp.Message.ToString ( ) ) Catch ex As Exception MessageBox.Show ( ex.ToString ( ) ) End Try End Sub |
5. 至此在上述步骤都正确完成后,【Visual Basic .Net实现查看网页内容】项目的全部工作就基本完成了。此时单击快捷键F5运行程序后,单击程序中的【查看源文件】按钮就可以得到如图07所示的运行界面:
图07:运行界面
六.总结:
本文详细介绍了.Net FrameWork SDK中提供的用以实现HTTP协议时主要的类及其成员,并通过二个具体示例的实现过程介绍了在Visual Basic .Net中使用这些类实现HTTP协议的具体方法。HTTP协议是TCP/IP协议簇中的重要协议,也是平常接触最多的一种协议,本文介绍的二个示例虽然结构不是很复杂,但无论是程序的功能,还是应用的层次都应该算是最基础,最重要的,掌握它们对掌握用Visual Basic .Net实现更深层次上,基于HTTP协议的网络应用程序应该是很有帮助的。