1C#网络编程技术教程第九章HTTP编程第9章HTTP编程2学习目标•了解HTTP、HTTP标题、HTTP方法、HTTP响应、URL等。•掌握HTTP信息交换过程。•掌握.NET环境下基于Socket类的HTTP编程方法。•掌握.NET环境下基于TcpListener类的HTTP编程方法。•自制浏览器的开发•网站页面捕获软件的开发第9章HTTP编程3本章内容9.1HTTP概述9.2.NET中HTTP编程9.3基于HTTP的编程实例第9章HTTP编程49.1HTTP概述HTTP(HypertextTransferProtocol,超文本传输协议)是用于从服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输量减少。它不但能保证计算机正确快速地传输超文本文档,还能确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。HTTP是基于请求/响应模式(客户机/服务器)的协议。一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为:统一资源定位符(URL)、协议版本号,后边是MIME信息(包括请求修饰符、客户机信息和可能的内容)。服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个响应成功或失败的代码,后边是MIME信息(包括服务器信息、实体信息和可能的内容)。HTTP目前的版本有1.0和1.1两种,分别由以下的RFC所制定:RFC1945HypertextTransferProtocol—HTTP/1.0RFC2068HypertextTransferProtocol—HTTP/1.1RFC2016HypertextTransferProtocol—HTTP/1.1其中定义了以下重要的协议:HTTP标题HTTP方法HTTP响应信息URLHTTP流程第9章HTTP编程59.1HTTP概述9.1.1HTTP标题当客户端通过浏览器向服务器端发送请求时,HTTP将请求转化为协议可以识别的HTTP标题信息传送至Web服务器处理。例如:GET:image/gif,image/jpeg,image/pjpeg,*/*Referer::zh-cnUser-Agent:Mozilla/4.0(WindowsNT5.0;MSIE5.01)Host”download.microtool.de此HTTP标题包含了以下重要的信息:1.GET代表客户端向服务器端发送HTTP请求的方法,可以分为以下几种。GET(通过请求URI得到资源)。POST(用于添加新的内容)。HEAD(类似于GET,但是不返回body信息,用于检查对象是否存在,以及得到对象的元数据)。PUT(用于修改某个内容)。DELETE(删除某个内容)。CONNECT(用于代理进行传输,例如使用SSL)。OPTIONS(询问可以执行哪些方法)。TRACE(用于远程诊断服务器)。第9章HTTP编程69.1HTTP概述9.1.1HTTP标题2.代表客户端请求的资源,以URI或者URL的形式表示。3.HTTP/1.1代表使用HTTP的版本。一般情况下,通过以上三类HTTP请求信息,服务器便能够了解客户端的HTTP请求是什么,并且能够确定请求资源的位置,并根据上述得到的信息进一步做出相应的响应。除了上述信息之外,HTTP标题还包含以下信息:(1)Accept表示客户端可以处理的媒体类型,如下列格式。这些媒体的类型可以按照优先级进行排序。若为*/*,则代表客户端可以接受所有类型的媒体形式。Application/wordApplication/excelApplication/pdfApplication/zipApplication/xmlimage/jpegimage/giftext/csstext/htmlvideo/mpeg第9章HTTP编程79.1HTTP概述9.1.1HTTP标题(2)Accept-Charset:定义客户端可以处理的字符集,按照优先级进行排序。在一个以逗号为分隔的列表中,可以定义多种类型和使用通配符。例如:Accept-Charset:iso-8859-1,*,utf-8。(3)Accept-Encoding:定义客户端可以理解的编码机制。例如:UTF7、UTF8、Unicode等。(4)Accept-Language:定义客户端可以接受的自然语言列表。例如:Accept-Language:en,zh-cn。(5)Connection:用于表明是否保存socket连接作为开放的通用标头。例如:Connection:close或Connection:keep-alive。(6)Content-Base:用于定义基本URI的实体标头,为了在实体范围内解析相对URLs。如果没有定义Content-Base标头解析相对URLs,则使用Content-LocationURI(存在且绝对)或使用URI请求。例如:Content-Base:。(7)Content-Encoding:一种媒体类型修饰符,标明一个实体是如何编码的。例如:Content-Encoding:zip。(8)Content-Length:指定服务器端响应中数据的字节长度。例如:Content-Length:382。(9)Content-Range:随实体部分一同发送,标明被插入字节的低位与高位字节偏移,也标明此实体的总长度。例如:Content-Range:1001-2000/5000。(10)Content-Type:标明发送或者接收的实体的MIME类型。例如:Content-Type:text/html。(11)Host:服务器的主机名。对于使用HTTP/1.1的请求而言,此域是强制性的。例如:Host:。(12)Referer:表明客户端上一次所浏览的资源,通过Referer的内容,可令浏览器更快速地执行“上一页”的功能。(13)User-Agent:定义用于产生请求的软件类型(典型的如Web浏览器)。例如:User-Agent:Mozilla/4.0(compatible;MSIE5.5;WindowsNT)。第9章HTTP编程89.1HTTP概述9.1.2HTTP方法当客户端向服务器端发送HTTP请求时,HTTP请求信息会随着HTTP方法一起传输到服务器,以告知服务器如何处理客户端的请求。HTTP方法根据版本的不同会有所差异。其语法一般为:HTTPMethodURIHTTP/HTTPVersionCRLF例如:GET(1)GET:HTTP协议的一种基本方法。GET用来取回请求URI标志的任何信息。“GET”这个单词就是“获取”的意思。如果请求URI指向的是一个数据处理过程,那么返回的结果是数据处理过程的结果,而不是数据处理程序的代码。如果HTTP标题中包含If-Modified-Since、If-Unmodified-Since、If-Match、If-None-Match或If-Range等条件字段,那么GET就变成了一个“有条件的GET”。只有满足条件,数据才会被返回。这样可以减少一些非必要的网络传输,或减少对某一资源的多次请求(一般的浏览器都有一个临时目录,用来缓存一些网页信息,当再次浏览某个页面的时候,只下载那些修改过的内容,以加快浏览速度,就是这个道理。至于检查,则常用比GET更好的方法HEAD来实现)。如果HTTP包中含有Range头字段,那么请求URI指定的实体中,只有决定范围条件的那部分才被取回来。第9章HTTP编程99.1HTTP概述9.1.2HTTP方法(2)HEAD:HTTP的HEAD方法和GET方法一样,唯一的差别就是服务器不能响应包含主体(Message-body)的请求。使用这个方法,可以使客户无需将资源下载就可以得到一些关于它的基本信息。这个方法常用来检查超级链接的可访问性以及资源最近有没有修改。HEAD方法经常用于获取资源的基本信息。(3)POST:HTTP的POST方法就是要求服务器接受请求标题中的实体(Message-Body),并且将其作为请求URI的下属资源。这意味着首先服务器要保存这个实体信息,而且由服务器程序进行处理。POST方法一般包含两个步骤:为请求标题准备数据,然后读取服务器应答的数据信息。(4)DELETE:客户端通过DELETE方法删除所定位的资源,但需要注意的是,服务器必须打开写入权限,以便修改目录下的文件,否则,DELETE将执行失败。(5)PUT:正好与DELETE方法相反,客户端利用PUT方法在服务器上建立所指定的资源(如文件),如果资源已经存在,那么就将原来的资源覆盖。此方法一般用于向服务器上传文件。和DELETE方法一样,服务器必须打开自己的写入权限,否则,PUT方法将执行失败。第9章HTTP编程109.1HTTP概述9.1.2HTTP方法HTTP还有以下一些方法,有兴趣的读者可以参考RFC的说明。(1)CHECKIN(2)CHECKOUT(3)CONNECT(4)LINK(5)OPTIONS(6)TRACE(7)UNLINK9.1.3HTTP响应信息和其他的协议一样,HTTP协议也有自己的响应信息来表示客户端请求执行的情况。HTTP响应信息由三部分组成,分别是:状态行、消息报头、响应正文。状态行的格式如下:HTTP-VersionStatus-CodeReason-PhraseCRLF其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,如表9.1所示,第一个数字定义了响应的类别,且有5种可能取值,如表9.2所示。第9章HTTP编程119.1HTTP概述9.1.4URLURL的全名为UniformResourceLocator(统一资源定位符),它不仅可用来定位网络上信息资源的地址,也可用来定位本地系统要访问的文件。URL可以分为两种类型,一种是绝对URL,另一种是相对URL。绝对URL就是指明需要访问的信息或资源的绝对位置。绝对URL的基本语法格式为:协议://主机名[:端口]/目录/名。其中,协议指定资源服务器的服务方式。系统中,最常用的是“http”协议。主机名,指服务器域名,接入到因特网中的每个可供访问的服务器,都有一个专用的域名,用户要访问服务器上的资源,必须指明服务器的域名。端口是指明进入一个服务器的端口号,用数字表示,一般可缺省。目录是指文件所在服务器的目录或路径。名字是指文件名,在缺省的情况下,首先会调出称为“主页”的文件。相对URL就是定位需要访问资源的相对路径。所谓的“相对路径”,就是所需资源相对于当前位置的路径。例如,当我们已处于服务器中的一个路径时,如果该路径中有多个文件需要访问,那么只需要指出文件名就可以了。第9章HTTP编程129.1HTTP概述9.1.5HTTP流程HTTP流程是指基于HTTP的客户机/服务器模式的信息交换过程。HTTP流程一般由四个过程组成,如图9.1所示。分别是建立连接、发送请求信息、发送响应信息和关闭连接。1.建立连接连接的建立是通过申请套接字实现的。客户打开一个套接字并把它约束在一个端口上,如果成功,就相当于建立一个虚拟文件。以后就可以在该虚拟文件上写数据并通过网络向外传送。图9.1HTTP流程第9章HTTP编程139.1HTTP概述9.1.5HTTP流程2.发送请求打开一个