HTTP协议格式
HTTP请求
首行:[方法]+[URL]+[版本号]
Header:请求的属性,冒号分割键值对;遇到空行表示Header部分结束
Body:空行后面的内容。Body允许为空字符串,如果不为空,,Header中会有Content-Length属性来标识Body长度
HTTP响应
首行:[版本号]+[状态码]+[状态码解释]
Header:请求的属性,冒号分割键值对;遇到空行表示Header部分结束
Body:空行后面的内容。Body允许为空字符串,如果不为空,Header中会有Content-Length属性来标识Body长度;如果服务器返回一个html页面,那么html页面内容就在Body中
常见的Header
Content-Type:数据类型(text/html等)
Content-Length:Body的长度
Host:客户端告诉服务器,所请求的资源在哪个主机的哪个端口
User-Agent:声明用户的操作系统和浏览器版本信息
referer:当前页面是哪个跳转过来的
location:搭配3XX的状态码使用,告诉客户端接下来去访问哪里
Cookie:用于在客户端存储少量信息。通常用于实现会话(session)功能
GET和POST请求方法
GET | POST | |
---|---|---|
对数据长度的限制 | 发送数据时,GET方法向URL添加数据;URL的长度是受限制的 | 无限制 |
对数据类型的限制 | 只允许ASCII字符 | 没有限制,也允许二进制数据 |
安全性 | 和POST相比性能较差,因为发送的数据是URL的一部分 | 比GET安全 |
可见性 | 数据在URL对所有人是可见的 | 数据不会显示在URL中 |
格式 | url?key1=value1&key2=value2 | key1=value1&key2=value2 |
注意:POST请求方法的请求数据既可以在url中,也可以在请求体中
HTTP状态码
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
状态码 | 描述 |
---|---|
200 | 请求成功 |
301 | 永久重定向 |
302 | 临时重定向 |
307 | 临时重定向,与302类似。使用GET重定向 |
403 | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | 找不到资源:可以是网页,可以是后台服务 |
500 | 服务器内部错误,无法完成请求 |
重定向和转发
重定向 | 转发 | |
---|---|---|
实现原理 | (1)返回3XX状态码+location响应头 (2)浏览器跳转到location所在的url | 当次http请求,直接获取要转发的url地址的响应并返回 |
跳转次数 | 2 | 1 |
请求数据是否会丢失 | 请求重定向的url时,会丢失第一次的请求数据 | 转发的url,还携带第一次请求的内容,不会丢失 |
url是否会变 | 会 | 不会 |
session和cookie
HTTP是一个无状态协议,这一次的请求和上一次请求没有任何关系。这种无状态的好处是快速;坏处是需要进行用户状态保持的场景时,必须使用一些方式或手段:session和cookie
session | cookie | |
---|---|---|
使用场景 | 访问敏感url通过session判断用户身份 | 登录页面勾选“remember me/记住我”,以后访问页面直接跳转到登录后的页面 |
原理 | 服务器的实现:(1)数据都保存在服务器(2)服务器重启就消失 | 客户端实现:(1)数据都保存在客户端浏览器本地文件(2)关闭浏览器不影响 |
注意:因为每次发起Http请求,都要携带有效的cookie信息,所以cookie一般有大小限制。为了防止增加网络压力,一般不超过4k