主要特点
- 简单快速:每个资源都是固定的
- 灵活 通过一个Http协议可以进行不同类型的数据传输
- 无连接: 连接一次会断开,不会保持连接
- 无状态: 客户端和服务端无法区分连接者的身份
报文组成
- 请求报文:请求行 + 请求头 + 空行 + 请求体
- 响应报文:状态行 + 响应头 + 空行 + 响应体
Http方法
- GET:获取资源
- POST:传输资源
- Put:更新资源
- Delete:删除资源
- HEAD:获得报文首部
POST和GET的区别
- GET在浏览器回退时是无害的,POST会重复提交请求
- GET产生的URL地址可以被收藏
- GET请求会被浏览器主动缓存而POST不会,需要手动设置
- GET请求只能进行url编码,POST支持多种格式
- GET请求参数会被完整的保存在浏览器里,POST不会被保存
- GET请求在URL中传输的参数是有长度限制的(2kb)
- GET参数通过URL传递,POST通过Request.body
- GET只接受ASCII的数据字符
- POST比GET更安全,GET的参数直接暴露在URL上
状态码
- 1xx:标识信息 表示请求已接受,继续处理
- 2xx:成功
- 206:返回Range头中的内容
- 3xx 重定向
- 301永久
- 302临时
- 304缓存重定向,服务端会判断客户端是否已经缓存数据
- 4xx:客户端错误 常见的有403资源禁止访问(一般都是权限问题),404
- 5xx:服务器错误
HTTP持久连接
- 保持连接的有效性,HTTP版本必须在1.1以上
管线化
- 请求打包 -> 分别响应
传统的请求方式 请求1 -> 响应1 -> 请求2 -> 响应2 -> 请求3 -> 响应3
管线化后 (请求1 + 请求2 + 请求3) -> 响应1 -> 响应2 -> 响应3 - 注意
- 只有GET和HEAD可以管线化
- 初次建立连接时不应启动管线化
- 管线化不会影响响应顺序
- 服务器只需支持管线化,但不需要对管线化做出处理,只需能接收请求即可
- 因为服务端问题,管线化带来的性能提升并不大,并且很多代理和服务端对管线化的支持并不好,因此大多浏览器默认关闭管线化