场景
启动Node服务器之后,GET一个文件资源,多次刷新发现除了第一次,之后的相应码皆为304
。
响应分为五类:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599)
首先看响应码大类:
请求码格式 | 含义 |
---|---|
1XX | 信息响应 |
2XX | 成功响应 |
3XX | 重定向 |
4XX | 客户端错误 |
5XX | 服务端错误 |
再看200和304的区别:
-
200 OK
请求成功。成功的含义取决于HTTP方法:
GET:资源已被提取并在消息正文中传输。 HEAD:实体标头位于消息正文中。 POST:描述动作结果的资源在消息体中传输。 TRACE:消息正文包含服务器收到的请求消息
-
304 Not Modified
如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
也就是说,两者都表示获取到了资源。
区别:
第一次请求服务器,得到资源的响应,响应码为200
(此时客户端的浏览器可能会对响应数据进行缓存,根据浏览器设置而定)
之后再次请求,此时:
浏览器这边有一份数据,时间戳为aaa,
请求到服务端的时候,发现服务器里的数据,自从上次请求之后未经修改,那就不用了发数据回来了。
所以此时返回状态码304
程序里是如何判断:这次要从服务器请求的资源,我在浏览器已经访问过,有了缓存,且两份资源一样的|未经修改的?
两个参数:
- 请求头的If-Modified-Since
- 响应头的Last-Modified
就是通过比较这两个参数是否变化。
验证:
两种方式验证:
- 修改服务端的文件内容(加空行,字符之类的,重新保存)
- 请求|禁用本次资源:切换浏览器,或清除浏览器缓存、禁用浏览器缓存等。
再次发起请求,查看状态码,为200
。