代码改变世界

Http初探

2010-08-23 14:01  空逸云  阅读(303)  评论(4编辑  收藏  举报

       学Asp.net的时间也不短了..进而却发现知道的东西太少.而MVC又冒出来.感觉以前的学习方式不太正确,应该先学习其本质,弄懂了本质.那么其他的都是虚的.加之在写项目过程中,对于一些Http的操作又不是很熟悉,所以就先了解了一下Http协议.下面.是一些个人小小的心得.

       关于Http的介绍就不详写了.相关资料可以查看维基等.为什么要使用Http协议?Http协议具有什么特点?

  1. 支持客户端/服务器模式
  2. 简单快捷;客户端向服务器请求服务时,只需要发送请求方法和路径.请求方法常用的有GET,POST,HEAD.每种方法规定了客户端与服务器端联系的类型不同.
  3. 灵活;Http允许传输任意类型的数据对象.以Content-Type标记.
  4. 无连接;无连接的意思就是每次连接只处理一个请求,服务器处理请求结束.并收到客户端的回应后,即断开连接.
  5. 无状态;众所周知,Http是一种无状态协议,所谓无状态.即不保存(记忆)当前事务的状态/信息,这样意味着每次我们发送的请求,都会得到一样的处理.因为前面处理的结果已丢失.Asp.net用ViewState在模拟有状态传输.无状态由于不需要保存其他数据/信息,所以应答相对更快.

Http的组成

              Http主要又Http请求和Http响应组成,请求即指客户端向服务器端发送请求,要求获取服务器的资源/处理,响应即指服务器收到了客户端的请求,对请求作出处理,并发送处理结果的一个过程.下面.通过HttpWatch的分析进一步/清晰解析


              可以看出,左边为HttpRequest,右边为HttpResponse.

Http请求(HttpRequest)

Http请求由请求行,消息报头(或称消息头域),请求正文三部分组成.

看到上图Request中的第一行,有个Request-Line.这就是请求行,请求行的组成:以一个方法符号开头,空格分开,后面跟着请求的URI和协议的版本.此处的方法为GET,请求URI为http://www.cnblogs.com/kongyiyun 版本为Http的1.1,规范模式如下:Method Request-URI Http-Version CRLF,前面三个已经很好的理解了.那么后面的CRLF是什么.在这里CRLF是Http协议中的回车换行,我们以可以把它当成是一行的结束,例如,http中的空白行表示 CRLF,就一个或多个的空白符+CRLF.PS:除了作为结尾的CRLF外,不允许出现单独的CR和LF字符

Methods

请求方法有多种(PS:请求方法大小写有区别,规定要全部大写),各个方法的解释如下:

GET:    请求获取Request-URI所标识的资源

POST:   在Request-URI所标识的资源后附加新的数据

HEAD:请求获取由Request-URI所标识的资源的响应消息报头

PUT:  请求服务器存储一个资源,并用Request-URI作为其标识

DELETE: 请求服务器删除Request-URI所标识的资源

TRACE:  请求服务器会送收到的请求信息,主要用于测试和诊断

CONNECT: 保留将来使用

OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求

其中,我们平时用得最多的就GET,POST,HEAD三种:

GET:当你在浏览器地址栏中输入一个URL,并回车时,便发送了一个GET请求,或点击一个超链接时,也发送了一个GET请求,主要请求资源.

POST:当你填写一份表单,按下提交按钮时,便发送了一个POST请求,POST请求除了有GET的请求外,它还附加了一些额外的信息.

HEAD:HEAD发送和GET一样的请求.不同的是.服务器的响应是没用正文的,也就是只会获得相应头,利用这个方法,不必传输整个资源的所有内容,就可以得到Request-URI所标识的资源的信息,该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新等.

URI

将在后面介绍

Http-Version

现在主流使用的Http版本为1.1,相对1.0而言,1.1更严谨.更....具体可参考维基/Http文档

URL

Http url(URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:

http://host[":port][abs_path]

http标识要通过HTTP协议来定位网络资源;host标识合法的Internet主机域名或IP地址;port指定一个端口号,若缺省则使用默认80端口,事实上.我们打上http://www.cnblogs.com/kongyiyun这样的地址时,浏览器会自动帮我们转换成http://www.cnblogs.com:80/kongyiyun这样的地址;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求的URI时,必须以"/"的形式给出,通常这个工作浏览器自动帮我们完成.

如:

输入www.cnblogs.com

浏览器会自动转换成http://www.cnblogs.com/ 而/又会自动去寻找根目录下的默认文件,如Default.aspx

Http响应(HttpResponse)

当服务器接收到一个请求后,处理过请求后,服务器发送一个响应回客户端.

Http响应也是由三部分组成,分别是:状态行,响应消息报头(或称响应头域 Response Header Fields),响应正文

状态行

状态行的基本格式:HTTP-Version Status-Code Reson-Phrase CRLF;从上图右边的第一样可以看到.(Status-Line) HTTP/1.1 200 OK其中HTTP-Version如同Request.为HTTP协议的版本.此为1.1,Status-Code标识服务器发回的响应状态码.请求的响应结果都可以通过Status-Code来识别.;而Reason-Phrase这表示状态码的文本描述;

状态码(Status-Code)

状态码由3位数字组成,第一个数字定义了响应的类别,共有5种可能取值

1xx: 指示信息-->标识请求已接受,继续处理

2xx: 成功-->表示请求已被成功接收,理解,处理

3xx: 重定向-->要完成请求必须更进一步的操作

4xx: 客户端错误-->请求有语法错误或请求无法实现

5xx: 服务器端错误-->服务器未能实现合法的请求

常见的状态码有:

200 OK //客户端请求成功

400 BadRequest//客户端请求语法有错误,不能被服务器所理解

401 Unauthorized //请求未授权

403 Forbidden //服务器收到请求,但是拒绝提供服务

404 Not Found //最常见的错误,无法找到资源

500 InternalServerError//服务器发生不可预期的错误

503 Server Unavailable //服务器当前不能处理客户端请求.

其他如下:

100   继续     
101   转换协议      
200   OK 
201   已创建          
202   接受          
203   非权威信息

204   无内容        
205   重置内容       
206   部分内容       
300   多个选择       
301   永久移动       
302   发现           
303   见其它          
304   没有被改变                 
305   使用代理               
307   临时重发               
400   坏请求                 
401   未授权的               
402   必要的支付             
403   禁用                   
404   没有找到                  
405   方式不被允许         
406   不接受的               
407   需要代理验证  
408   请求超时               
409   冲突                   
410   不存在                  
411   长度必需           
412   先决条件失败             
413   请求实体太大       
414   请求URI太大       
415   不被支持的媒体类型    
416   请求的范围不满足    
417   期望失败            
500   服务器内部错误        
501   不能实现              
502  坏网关                
503  服务不能获得          
504  网关超时              
505  HTTP版本不支持

响应报头后续,响应正文就是服务器回发的资源内容

消息报头(消息头域)

Http消息由客户端到服务器的请求和服务器到客户端的响应组成.请求消息和响应消息都是有开始行(HttpRequest:请求行,HttpResponse:状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成.

消息报头包括普通报头,请求报头,响应报头.

每个报头域都由名字+":"+空格+值组成,报头域的名字忽略大小写

普通报头

在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息.

如:

Cathe-Control:用于指定缓存指令.

Data:表示消息产生的日期和时间

Connection:普通报头域允许发送指定连接的选项.例如指定连接是连续,或者是"close"关闭

请求报头

终于到它了.请求报头中包含着客户端发送给服务器端的各种信息,包括客户端的信息.

常见的请求报头信息:

Accept: Accept请求报头域用于指定客户端接收哪种类型的信息;如:text/html.表明接受html

可以参考上图+一下说明


响应报头

响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识
的资源进行下一步访问的信息。
常用的响应报头
Location
Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
Server
Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是
Server响应报头域的一个例子:
Server:Apache-Coyote/1.1
WWW-Authenticate
WWW-Authenticate响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发
送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
eg:WWW-Authenticate:Basic realm="Basic Auth Test!"  //可以看出服务器对请求资源采用的是基本验证机制

实体报头

请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。
常用的实体报头
Content-Encoding
Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编
码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用
于记录文档的压缩方法,eg:Content-Encoding:gzip
Content-Language
Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言
阅读
者。eg:Content-Language:da
Content-Length
Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
Content-Type
Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg:
Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Last-Modified
Last-Modified实体报头域用于指示资源的最后修改日期和时间。
Expires
Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次
访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires
实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT