HTTP-报文

这是我阅读《HTTP权威指南》的总结和思考中,一系列文章的一篇,目录在这里

组成

HTTP报文分为两种:请求报文(request message)和响应报文(response message)

每一个报文都有三部分组成:

  1. 起始行(start line)
  2. 首部(header),键值对,每一对占一行,最后由一个空行结束(无论有无body部分)
  3. 主体(body)
1
2
3
4
5
6
7
8
9
10
//请求报文
<method> <request-URL> <version>
<headers>
<entity-body>
//响应报文
<version> <status> <reason-phrase>
<headers>
<entity-body>

起始行

方法(Method)

方法包含GET, HEAD(这2个被认为是安全方法,即不对服务器产生副作用。同时也是HTTP1.1必须实现的两个方法), PUT, POST, TRACE, OPTIONS, DELETE以及扩展方法

GET

用于请求服务器中的某个资源,HTTP/1.1中强制要求实现的方法

与GET方法类似,返回一个只有首部没有主体的响应报文,首部应该与GET返回的一致。HTTP/1.1强制要求实现

主要用于: 判断资源类型Content-Type、大小Context-Length

PUT

PUT命令让服务器在<request-URL>指定的路径创建/更新报文实体的内容,通常操作前需要密码认证

服务器如果操作成功,将返回 201 Created

POST

用于向服务器发送数据,与PUT的不同在于PUT是直接在服务器的文件上存储数据。

POST也被用来发送表单数据

TRACE

一个报文可能经过防火墙、代理、网关或其他应用,TRACE允许客户端查看最终服务器收到的报文,检查是否有修改/损坏

服务器在TRACE响应报文的主体部分携带了他收到的请求,客户端可以对比响应主体中的报文来和自己发出的报文对比

OPTIONS

查询服务器支持的方法(Method), 返回在Header里,例如 Allow: GET, POST, PUT

在跨域CORS中具有应用

DELETE

删除指定URL处的资源,但是服务器有可能并没有删除该资源(依然返回200 OK)

扩展方法

HTTP允许扩展方法,即规范中没有写,开发者自定义的方法

状态码

信息性状态码(100-101)

如果客户端要向服务器发送一个大的实体前,发送一个带有头Expect: 100 Continue的报文,在收到100或者一定时间以后直接发送实体

成功状态码(200-206)

不同的响应状态码对应不同请求方法(PUT,GET)的回应

重定向状态码(300-307)

对于一个移走的资源,返回30x(如301永久移走),可以附带一个可选的Location:URL头部,浏览器将自动再发送一个到该URL的请求,在使用者未注意到的情况下转入新位置

客户端可以发送一个特殊的If-Modified-Since: Date首部,如果未更改过,浏览器返回304,客户端直接使用本地副本

客户端错误代码(400-417)

请求出现错误,比如请求一个不存在的URL(404),权限不足,格式错误的报文等

服务器错误码(500-505)

服务器自身出现了错误,比如某个子元素,网关资源出错等

首部

通用首部

提供了基本信息和缓存控制策略,请求和响应都可以使用

请求首部

包括客户端信息类首部,Accept首部,条件请求首部,安全请求首部(包括Cookie)与代理请求首部

响应首部

包括响应信息(时间,服务器版本)首部,协商首部,安全响应首部(Cookie)

实体首部

信息首部(Allow和Location等),内容首部(Content-Type,Length等),缓存首部(ETag、Expires、Last-Modified)