图解http(一)
从今天开始阅读图解http这本书,下载地址:我的百度云
http的发展史
这个我就不说了,总之起因就是因为一个家伙想知识共享就搞出来这个东西。http协议的更新还是很慢的,不像IE都到多少了。目前http协议正在准备出2.0,听说老快了,市面上主流的还是1.1。
相关协议
与http关系比较大的几个协议就是:tcp、ip、dns
下面一张图形象说明了http与这几个协议的关系。
http请求过程
URI和URL
URI包含着URL
Uniform | Resource | Identifier |
---|---|---|
统一格式 | 资源 | 标识 |
http/ftp | ---- | ---- |
标准格式
http://[user:pass@]www.example.jp:80/dir/index.html?uid=1#ch1
协议 登陆信息 服务器地址 端口 文件路径 查询字符串 片段标识符
第二章
请求和响应报文的组成
请求报文 响应报文服务器请求
除了对服务器资源的请求,还可以对服务器本身进行请求。比如:
OPTIONS * HTTP/1.1
这是对服务器支持http方法种类的查询。
请求方法
- GET(SELECT)
用于请求资源,一般用于页面请求,数据请求等。根据RESTful架构理解来看,这些都属于服务器的资源。参照理解RESTful架构 - POST(CREATE)
在服务器新建一个资源。通过提交服务器一些数据,服务器根据这些数据进行处理和资源的创建。 - PUT(UPDATE)
在服务器更新资源(客户端提供改变后的完整资源)。 - PATCH(UPDATE)
在服务器更新资源(客户端提供改变的属性)。 - DELETE(DELETE)
从服务器删除资源。 - HEAD
获取资源的元数据。和GET方法一样,不过不返回报文主体。用于确认URI的有效性和资源更新的时间。 - OPTIONS
用来查询针对请求URI资源的支持方法。 - TRACE
trace和网络路径查询差不多,它是在Max-forwards首部字段中填入最大跳数,然后每一跳减一,减为0停止,响应体为每一跳的信息。这个不常用,而且还容易引发XST(跨站追踪)。 - CONNECT
要求用隧道协议连接代理
PUT、PATCH、DELETE在一般网站上都不会用到,RESTful架构的网站可能会开放。主要是因为HTTP/1.1的这些方法都不带验证机制。
持久连接和管线化
最初的http是每次http请求响应完成都会断开tcp连接,这样如果一个页面有很多图片就会有很多次tcp三次握手四次挥手,很耗时间。
http1.1提出keep-alive,只要没有一端提出明确的断开连接,就一直保持tcp连接通道,节省了多次tcp连接的时间。
管线化则提出http请求的同时发送,像是异步一样,不等待前面http响应的回馈,异步等待回馈。
Cookie
http是无状态协议,它的状态通过cookie来保持。
响应在header中添加set-cookie告诉客户端下次请求加上cookie
请求在header中添加客户端所有的cookie
状态码
服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止 的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
状态码的完全列表参见这里。