本章将介绍: - 报文是如何流动的 - HTTP报文的三个组成部分 - 请求和相应报文之间的的区别 - 请求报文支持的各种功能 - 和响应报文一起返回的各种状态码 - 各种各样的HTTP首部都是用来做什么的 1. 报文流 报文在客户端,服务器和代理之间流动,术语“流入”,“流出”,“上游”,“下游”都是用来描述报文方向的 - 报文流入源端服务器 http使用术语“流入”和“流出”来描述事务处理的方向。报文流入源端服务器,工作完成之后,会流回用户的Agent代理中 - 报文向下游流动 所有报文的发送者都是接收者的上游,不管是请求报文还是响应报文,所有报文都会向下游流动 2. 报文的组成部分 报文包含三部分: - 起始行,对报文进行描述 - 首部,包含属性 - 主体,可选的包含数据 起始行和首部是由行分隔的ASCII文本,每行以一个回车符+一个换行符作为结束 - 报文的语法 请求报文的格式为:
<method> <request-URL> <version> <headers> <entity-body>响应报文的格式为:
<version> <status> <reason-phrase> <headers> <entity-body>下面对各部分进行简要说明: - 方法 客户端希望服务器对资源执行的动作,是一个单一的词 - 请求URL 命名了所请求的资源 - 版本 报文所使用的HTTP版本,格式为HTTP/<major>.<minor> - 状态码 三位数字描述了请求过程中所发生的情况 - 原因短语 数字状态码的可读版本,包含行终止序列之前的所有文本 - 首部 可以有零个或多个首部,(名字:值) - 实体的主体部分 由任意数据组成的数据块 3. 方法 HTTP定义了一组被称为安全方法的方法,GET和HEAD方法都是安全的,因为它们不会在服务器上产生结果 下面是常用的一些方法: - GET 从服务器获取一份文档 不包含主体 - HEAD 只从服务器获取文档的首部 不包含主体 使用HEAD,可以: a. 在不获取资源的情况下了解资源的情况(判断其类型) b. 通过查看响应中的状态码,看看某个对象是否存在 c. 通过查看首部,测试资源是否被修改 - POST 向服务器发送需要处理的数据 包含主体 POST方法起初是用来向服务器输入数据的,实际上会用它来支持HTML的表单。表单中填好的数据通常被送给服务器,然后由服务器将其发送到他要去的地方 - PUT 将请求的主体部分存储到服务器上 包含主体 PUT方法的语义就是让服务器用请求的主体部分来创建一个有所请求的URL命名的新文档,如果那个URL已经存在的话,就用这个主体来替代它 - TARCE 对可能经过代理服务器传送到服务器上去的报文进行跟踪 不包含主体 一个请求可能经过多个中间节点,每个中间节点都会修改原始的http请求。TRACE方法允许客户端在最终将请求发送给服务器时,看看它变成了什么样子。 TRACE请求会在目的服务器端发起一个“换回”诊断,行程最后一站的服务器会弹回一条TRACE响应,并在响应主题中携带它受到的原始请求报文,这样客户端就可以查看原始报文是如何被修改的 TRACE方法主要用于诊断,也是一种很好的工具,可以用来查看代理和其他应用程序对用户请求所产生的效果 - OPTONS 决定可以在服务器上执行哪些方法 不包含主体 OPTION方法请求web服务器告知其支持的各种功能,可以询问服务器通常支持哪些方法,或者对某些特殊的资源支持哪些方法 - DELETE 从服务器上删除一份文档 DELETE方法所做的事情就是请服务器删除请求URL所制定的资源,但是客户端应用程序无法保证删除操作一定会被执行,因为http规范允许服务器在不通知客户端的情况下撤销请求 并不是所有的服务器都可以实现以上方法,其它服务器可能有自己的方法,被称为扩展方法 web发布扩展方法示例: - LOCK 允许用户锁定资源(编辑某个资源时,将其锁定,以防别人同时对其进行修改) - MKCOL 允许用户创建资源 - COPY 便于在服务器上复制资源 - MOVE 在服务器上移动资源 4. 状态码 http状态码分成了5大类 状态码分类: 1. 100-199 信息性状态码 - 状态码100 continue 说明收到请求的初始部分,请客户端继续。发送了这个状态码之后,服务器在收到请求之后必须进行响应 从很多方面来看,100 continue都是一种优化,客户端应用程序直邮在避免向服务器发送一个服务器无法处理或使用的大实体时,才应该使用100 contiune。 如果服务器受到一条带有值为100 continue的Expect首部请求,它会用100 continue响应或一条错误吗来进行响应。 - 状态码101 Switching Protocols 说明服务器正在根据客户端的指定,将协议切换成Update首部所列的协议
200-299 成功状态码 200 OK,请求咩有问题,实体的主体部分包含了所请求的资源 201 Created,用于创建服务器对象的请求(比如PUT)。响应的实体主体部分中应该包含各种你用了已创建的资源URL,Location首部包含的则是最具体的引用 202 Accept,请求已被接受,但服务器还未对其执行任何动作。不能保证服务器会完成这个请求,这只是意味着接受请求时,它看起来时有效的 203 Non-Authoritative,实体首部包含的信息不是来自于源端服务器,而是来自资源的一个副本 204 No Content,响应报文中包含若干首部和一个状态行,但没有实体的主体部分 205 Reset Content,负责告知浏览器清楚当前页面中的所有HTML表单元素 206 Partial Content,成功执行了一部分请求 300-399 重定向状态码 300 Multiple Choices,请求一个实际指向多个资源的URL时会返回这个状态码 301 Moved Permanently,请求的URL已被移除 302 Found,与301状态码类似,但是客户端应该使用Location首部给出的URL来临时定位资源,将来的请求仍应使用老的URL 303 See Other,告知客户端应该使用另一个URL来获取资源 304 Not Modefie 305 Use Proxy,必须通过一个代理来访问资源 307 Temporary redirect,与301状态码类似,但是客户端应该使用Location首部给出的URL来临时定位资源,将来的请求仍应使用老的URL 400-499 400-415 客户端错误 500-599 500-505 服务器错误 500 Internal Server Error,服务器遇到一个妨碍它为请求提供服务的错误时,使用此状态码 501 Not Implemented,客户端发出的请求超出服务器的能力范围 502 Bad Gateway,作为代理或网关使用的服务器从请求响应脸的下一条链路上受到了一条伪响应时,使用此状态码 503 Service Unavailable,用来说明服务器现在无法为请求提供服务,但将来可以 504 Gateway Timeout,该响应来自一个网关或代理,它在等待另一个服务器对其请求进行响应时超时了 505 Http Version Not Supported,服务器受到的请求使用了它无法或不愿支持的协议版本 http中可以分为以下几类首部: 通用首部 既可以出现在请求报文中,也可以出现在响应报文中 请求首部 提供更多有关请求的信息 响应首部 提供更多有关响应的首部 实体首部 描述主体的长度和内容,或者资源本身 扩展首部 规范中没有定义的新首部 常见的首部实例: Date:Tue 3Oct 2016 02:16:03 GMT 服务器产生响应的日期 Content-length:12240 实体的主体部分包含了12240字节的数据 Content-type:image/gif 实体的主体部分是一个GIF图片 Accept:image/gif,image/jpeg,text/html 客户端可以接收的格式 将长的首部分为多行可以提高可读性,多出来的每行前面至少有一个空格或制表符