报文是如何流动的

image.png

报文都是向下流动

HTTP报文的三个组成部分(起始行、首部、实体的主体部分)

报文组成部分

规范要求各部分最后都要跟 \r\n,也就是回车换行。但某些服务器可能只跟换行符 \n

请求和响应报文之间的区别

请求报文组成

<method> <request-URL><version>
<headers>
<entity-body>
GET www.baidu.com/path/xxx.jpg HTTP/1.1
Host: www.example.com

响应报文组成

<version> <status><reason-phrase>
<headers>
<entity-body>
HTTP/1.1 200 OK
Content-type: image/ipg
Content-length: 12345

有哪些Method

  1. get
  2. post
  3. put语义就是让服务器用请求的主体部分来创建新文档或者替换已有的文件
  4. delete,协议规定,服务器可以不通知客户端的情况下撤销请求,这个....
  5. options用于询问服务器支持哪些方法,比如一个服务器的响应首部可能是allow: GET、POST、PUT、OPTIONS
  6. head,一个使用场景是下载大文件,先获取头部信息
    注意这些方法第一要看协议是否支持,比如HTTP/0.9就只支持get,同时要看服务器有没有实现并设置开放,因为可能有的服务器不希望开放delete删除。
    7.trace,因为一个请求可能会经过防火墙、代理、网关等。这些中间层可能会对请求进行修改,trace方法能够在服务器的响应首部中增加请求的首部,这样就可以跟踪请求首部是否被修改。
    如果增加了自定义首部,并且可能会破坏原有行为,应该返回501 Not Implemented(无法实现)
    判断大小再决定是否下载。

请求报文支持的各种功能

和响应报文一起返回的各种状态码

100-101信息提示
200-206表示成功
300-305表示资源被移走了
400-415表示客户端请求出错
500-505表示服务器出差

状态码 原因短语 含义
100 Continue 说明服务器收到了这个请求,请客户端继续(这个情况较复杂,书中有详细说明)
101 Switching Protocols 说明服务器正在根据客户端要求指定更换请求首部所列的协议
200 OK 请求没问题,实体的主体部分包含了请求的资源
201 Created 用于创建服务器对象的请求(如PUT),实体部分应返回对应资源的URL
202 Accepted 服务器接受了请求,但还未对其执行任何动作,服务器应该在返回体中包含对请求状态的描述、对请求完成时间的估计等
203 Non-Authoritative Information 表示请求已经成功被响应,但是获得的负载与源头服务器的状态码为 200 (OK)的响应相比,经过了拥有转换功能的 proxy (代理服务器)的修改
204 No Content 表示目前请求成功,但是客户端不需要更新现有页面以展示。使用惯例是,在 PUT 请求中进行资源更新,但是不需要改变当前展示给用户的页面,那么返回 204 No Content。如果新创建了资源,那么返回 201 Created 。如果页面需要更新以反映更新后的资源,那么需要返回 200
205 Reset Content 用来重置页面视图、canvas、表单元素、刷新页面
206 Patiant Content 具备内容,一般用于断点续传,视频文件之类大文件请求
300 Multiple Choices 表示客户端请求的资源有多种版本,此时服务器就会返回一个选项列表,因为客户端不明确,所以这个状态码用得很少
301 Moved Permanently 永久重定向,说明请求的资源已经被移动到了由 Location 头部指定的url上,是固定的不会再改变
302 Found 暂时重定向, 已移动的资源对应的URI将来还有可能发生变化,比如,用户把uri保存为书签,但不会像301状态码出现时那样更新书签,而是仍旧保留返回302状态码的页面对应的uri
303 See Other 通常作为 PUTPOST 操作的返回结果,它表示重定向链接指向的不是新上传的资源,而是另外一个页面,比如消息确认页面或上传进度页面。303明确表示客户端应当采用get方法获取资源,这点与302状态码有区别
304 Not Modified 客户端可以通过请求首部比如 If-None-MatchIf-Modified-Since来使其请求是有条件的。
307 Temporary Redirect 临时重定向,和302的区别是307会遵照浏览器标准,不会从post变为get,302按标准虽然也是不应该改变重定向的方法,但实际上大量浏览器没有遵守规定。
308 Permanent Redirect 永久重定向,搜索引擎会更新其链接,301不会。和301的区别是在重定向过程中方法和主体不会发生改变,而301会。
400 bad request 请求错误。
401 Unauthorized 未授权的。这个状态码会与 WWW-Authenticate 首部一起发送,其中包含有如何进行验证的信息
403 Forbidden 指的是服务器端有能力处理该请求,但是拒绝授权访问。和401的区别是这个状态码无法继续认证权限
404 Not Found 404 状态码并不能说明请求的资源是临时还是永久丢失。如果服务器知道该资源是永久丢失,那么应该返回 410 (Gone) 而不是 404
405 Method Not Allowed 表明服务器禁止了使用当前 HTTP 方法的请求。需要注意的是,GETHEAD 两个方法不得被禁止
406 Not Acceptable 服务器端无法提供与 Accept-Charset 以及 Accept-Language 消息头指定的值相匹配的响应
407 Proxy Authentication Required 客户端与服务器之间的代理层也需要身份验证,请求没有满足。这个状态码会与 Proxy-Authenticate 首部一起发送,其中包含有如何进行验证的信息。
500 Internal Server Error 服务器内部错误,代码报错之类的,也可以是一个泛指。指服务器出错。
... ... ...

各种各样的HTTP首部是用来做什么的

书中详细解释了各种首部的意义。

  • 通用首部,请求和响应都能用,如Date
  • 请求首部如Accept
  1. Accept首部,如Accept,告诉服务器能接受哪些类型
  2. 条件请求首部,如if-Modified-Sinceif-None-Match
  3. 安全请求首部,如Cookie
  4. 代理请求首部,如Proxy-connection
  • 响应首部如Expires
  1. 协商首部
  2. 安全响应首部,如setCookie
  3. 信息性首部,如Age,这个具体解释???
  • 实体首部如Content-Length
  1. 内容首部,如content-Type
  2. 实体缓存首部,如etag、Expires、Last-Modified
  • 拓展首部如xxxx custom

主体部分

HTTP报文可以承载很多类型的数字数据,如图片、视频、邮件、文档等

如何理解协商首部Vary

协商首部Vary用于内容协商机制,告诉缓存服务器该如何准确返回适当的缓存文件。
Jerry Qu解释的太赞了!

总结

本章详细介绍了报文的三个组成部分:起始行、首部、主体。某些首部如缓存控制等没有展开讲,在后面的章节会详细解说。

大致过一遍所有状态码的功能会了解到更多客户端和服务器之间的交流,比如内容协商机制,就可能会用到300状态码。同时因为中间层、防火墙以及一些有bug的缓存服务器的存在,需要一些特殊的首部和状态码来进行信息、资源的传递。

收藏