《http权威指南》阅读笔记,第三章,HTTP报文
目录
- 报文是如何流动的
- HTTP报文的三个组成部分(起始行,首部,实体的主体)
- 请求报文支持的各种方法
- 和响应报文一起返回的各种状态码
- 各种各样的首部是做什么的
报文是如何流动的
报文流(快递)
就像是快递包裹(http报文),有个发货人(客户端),有个收货人(服务端),包裹上面贴了快递面单(起始行与首部),包裹里面有内容(报文主体),
包裹程在转运中心(各种服务器代理)之间单向传递,送达收货人(服务器)的过程就是快递(报文流)
当然这个过程是可以反向的,服务端想客户端发送报文.
HTTP报文的三个组成部分(起始行,首部,实体的主体)
报文(快递包裹)
- 快递面单(起始行) 填写收货人,收货地址
- 快递面单(首部) 填写是,是否到付,包裹里面的东西,是否保价......
- 快递面单(自定义首部) 在包裹上写一个大大的电话号码,方便查看
- 快递包裹(主体) 透明包装(字符串),黑箱子(二进制)
报文格式
请求报文
< method> < request- URL> < version>
< headers>< entity- body>
响应报文
< version> < status> < reason- phrase>
< headers>< entity- body>
概述
-
method: 方法
-
request-URL: 请求地址
-
version: 版本号 HTTP/<major>.<minor>
**版本号1.12>1.2 因为主版本相同,次要版本12>2 -
status-code: 状态码 100-599之间的数字,给代码用的
-
reason-phrase: 原因短语,给人看的
-
headers:首部,0个或者多个
常见的首部实例
首部实例 描述 Date:Tue, 3Oct 1997 02: 16: 03 GMT 服务器产生响应的日期 Content-length:12345 实体的主体部分有12345字节的数据 Content-type:image/gif 实体的主体部分是一张gif图片 Accept: image/ gif, image/ jpeg, text/ html 客户端可以接收gif图片JPG图片与HTML 首部延续行
分行提高可读性,分行的前面需要加空格或者tab制表符 -
entity-body:主体,可有可无
请求报文支持的各种方法
方法 | 描述 | 是否包含主体 |
---|---|---|
get | 从服务器获取一份文档 | 否 |
post | 向服务器发送需要处理的数据 | 是 |
put | 向服务器提交一份文档 | 是 |
delete | 从服务器删除一份文档 | 否 |
options | 决定服务器上可以执行哪些方法 | 否 |
head | 只从服务器获取文档的首部 | 否 |
弃用 | - | |
弃用 | - | |
弃用 | - |
* delete不一定真的能删除,服务器可以不响应该请求
和响应报文一起返回的各种状态码
状态码分类
整体范围 | 已定义范围 | 分类 |
---|---|---|
100~199 | 100~101 | 信息提示 |
200~299 | 200~206 | 成功 |
300~399 | 300~305 | 重定向 |
400~499 | 400~415 | 客户端错误 |
500~599 | 500~505 | 服务器错误 |
状态码明细
状态码 | 短语 | 解释 |
---|---|---|
100 | Continue | 收到了请求的初始部分,请客户端继续. |
101 | Switching protocols | 说明服务器正在根据客户端的制定,,将协议切换成Update首部所列的协议 |
100
客户端向服务器发很大文件,不确定服务器是否接受,可以先发一个带Expect:100 Continue的头,询问服务器是否接受,服务器返回 100响应后,发送实体结束.
- 在实现的时候,有的服务器会乱发100, 客户端 要甄别过滤掉
- 响应超时的话,客户端 也要把实体发出去,不能傻等服务器响应
- 没有收到带Expect:100 Continue的请求, 服务器 绝对不应该响应100
- 当 服务器 已经收到实体的情况下,就不用返回100,可以返回其他状态码跳过100
-
代理服务器 收到100请求的时候,要进行判断
- 下流服务器 支持 或 不清楚 http/1.1的话,转发;
- 下流服务器 不支持,返回100,再可以去掉这个头,再转发;
- 下流服务器 不支持,返回417错误;
101
当 客户端 使用 Upgrade 头的时候,服务器认可就返回101。Upgrade头用于 升级协议 的,比如现在用的是http/1.1,我想用http/2.1或者我想用 websocket ,就可以在请求头里面加上Upgrade:websocket 或者 Upgrade:http/2.0
状态码 | 短语 | 解释 |
---|---|---|
200 | OK | 如你所愿,已搞定 |
201 | Created | 创建成功,主要用于put请求的返回 |
202 | Accepted | 收到,加入待办,可以返回完成时间估计,进度 |
203 | Non-Authoritative-Information | 非权威消息,比如客户端要个苹果,代理服务器从服务器拿个苹果(200),吃了一口再给你(203) |
204 | No-Content | 木有内容,form的action,a链接返回204,不会跳转,可以判断访问成功 |
205 | Reset-Content | 用于表单提交后,重置表单而不刷新页面 |
206 | Particle-Content | 返回部分内容,必须返回Content-Range、Date、Etag或者Content-Location首部 |
状态码 | 短语 | 解释 |
---|---|---|
300 | Multiple Choices | 找到好多,选一个呗 |
301 | Moved Permanetly | 没找到,看看别的呗 |
302 | Found | 找到了,不过先看看别的 |
303 | See Other | 看看别的,响应post请求 |
304 | No Modified | 未修改,看你的缓存去 |
305 | Use Proxy | 使用代理服务器(小明找老师请假,老师:出去,让你爸打电话给我) |
弃用 | ||
307 | Temporary Redirect | 重定向的地址必须是get或者head请求,否则浏览器不自动跳转,需要用户确定 |
状态码 | 短语 | 解释 |
---|---|---|
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置“您所请求的资源无法找到”的个性页面 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
状态码 | 短语 | 解释 |
---|---|---|
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 类似于408,充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
各种各样的首部是做什么的
通用首部
通用的信息性首部
首部 | 描述 |
---|---|
Coonection | 允许客户端服务器指定与请求/响应连接有关的选项 |
Date | 报文创建时间 |
MIME-Version | 给出发送端的MIME版本 |
Trailer | 如果报文采用分块传输编码就可以用这个首部列出位于报文拖挂( trailer) 部分的首部集合 |
Transfer-Encoding | 告知接收端,对报文采用了怎样的接收方式 |
Update | 给出发送端想要升级使用的新版本或协议 |
Via | 显示报文经过的中间节点(代理,网关) |
通用的缓存首部
首部 | 描述 |
---|---|
Cache-Control | 用于随报文传送缓存指示 |
Pragma | 另一种随报文传送指示的方式,但并不专用于缓存 |
请求首部
请求的信息性首部
首部 | 描述 |
---|---|
Client_IP | 客户端IP |
From | 提供客户端用户的Email地址 |
Host | 给出接收请求的服务器地址和端口 |
Referer | 提供了当前请求URI的文档的URL |
UA-Color | 客户端显示器颜色相关 |
UA-CPU | 客户端CPU的类型或制造商 |
UA-Disp | 客户端显示屏幕 |
UA-OS | 客户端系统 |
UA-Pixels | 客户端像素 |
User_Agent | 发起请求的客户端名 |
Accept首部
首部 | 描述 |
---|---|
Accept | 媒体类型 |
Accept-Charset | 字符集 |
Accept-Encoding | 编码方式 |
Accept-Language | 语言 |
TE | 拓展传输编码 |
条件请求首部
首部 | 描述 |
---|---|
Expect | 允许客户端列出某请求所要求的服务器行为 |
If-Match | 如果实体标记与文档当前的实体标记相匹配,就获取这份文档 |
If-Modified-Since | 某时间点后,资源被修改才返回 |
If-None-Match | 返回标记不匹配的 |
If-Range | 对文档的某个范围进行请求 |
If-Unmodefied-Since | 某时间点后,资源没有被改动,才返回 |
Range | 请求范围 |
安全请求首部
首部 | 描述 |
---|---|
Authorization | 身份认证 |
Cookie | 向服务器传送一个令牌 |
Cookie2 | 用来说明请求端支持的cookie版本 |
代理请求首部
- Max-Forward
- Proxy-Authorization
- Proxy-Coonection
响应首部
首部 | 描述 |
---|---|
Age | 响应持续时间 |
Public | 服务器为其资源支持的请求方法列表 |
Retry-After | 如果资源不可用,在此日期重试 |
Title | 对HTML文档来说,就是源端给出的标题 |
Warning | 比原因短语中更详细的一些警告报文 |
- 协商首部
- 安全响应首部
- 实体首部
- 内容首部
- 实体缓存首部
参考
书中的内容很多都老旧了,请参考 http://www.w3c.org/
https://developer.mozilla.org/zh-CN/docs/Web/HTTP