HTTP报文
报文的组成部分
1.对报文进行描述的起始行
请求报文:请求方法 请求URL HTTP协议及版本
响应报文:报文协议及版本 状态码及状态描述
2.包含属性的首部/头部(header)
3.包含数据的主体(body)可选项
请求方式
put:上传资源 form表单不支持 提交即存储的原则(无验证机制 有安全漏洞) 需要配置服务器支持put方式转发给后端操作
delete:删除资源 form表单不支持 提交即删除的原则(无验证机制 有安全漏洞) 需要配置服务器支持put方式转发给后端操作
post:修改资源
get:获取资源
get/post请求方式
get主要用来获取数据
get的数据在请求体中式查询字符串参数
post主要用于传输数据到后端进行增加 删除 更新数据 提交表单
post的数据在请求体中是表单数据
区别
1.post更安全
不会作为url的一部分 不会被缓存 保存在服务器日志和浏览器记录中
2.post发送的数据量更大(GET有url长度限制)
3.post能发送更多的数据类型 (各种类型的文件)
get只能发送ASCII字符
4.post比get速度慢
慢的原因
1.post包含更多的请求头
2.post接收数据之前会先将请求头发送给服务器确认 然后发送数据
3.get会进行数据缓存 post不会
4.post不能进行管道化传输
post过程
1.三次握手 浏览器确认并发送post请求头
2.服务器返回状态码100后 continue响应
3.浏览器确认发送数据
4.服务器返回200Ok响应
get过程
1.三次握手 浏览器确认并发送请求头和数据
2.服务器返回200Ok响应
串行连接
一次事务结束后连接断开 下次事务开始时重新建立连接
持久化连接
(HTTP/1.0 1.1)连接不会关闭
一次事务结束后连接不会断开 下次事务开始 直接发送请求不建立连接
管道化持久连接
(HTTP/1.1)
把所有的请求放到队列里 不等响应 一个一个发送请求的同时接收相应的响应
幂等性
数学中的幂等 x^y = x x = 0 || 1
幂等性 一个HTTP请求中 不会对数据或状态做修改 并且每次请求都会返回同样的结果
必要性
1.get请求必须遵守幂等性 从HTTP请求上来看 get只能获取数据
2.post请求一般做增删改的操作 所以一般不遵守幂等性
管道化传输不可以使用非幂等性请求的原因
假设 一个管道中有10个请求 发送了9个请求 但是连接关闭了 即使受到了9个响应 这9个响应内容也将被清空 那么客户端
会重新发起这9个请求 但是9个响应受到就证明服务器已经做了响应的操作 如果是非幂等的请求 则会出现操作的错误(如支付
增删改数据等) 所以管道化传输不支持非幂等的请求 post是非幂等的或幂等的 都不支持管道化传输