http研究之旅:Last-Modified/Etag
- 我最初学习http的时候,是通过买的一本书《图解http》来进行学习的,但是看过之后发现这本书可以让你大概明白HTTP原理是怎么一回事,换句话说,就是让你对http有一个更加深入的了解,但是吧,你只是了解的话,平时吹吹牛还行,但是一旦让你用代码写出来,感觉自己啥也不会了,哈哈哈,很真实。。。
- 无奈之下,只能自己结合书本所说的去研究代码的实现,毕竟,我只明白个大概但是我不会写,像这样的事情,感觉很丢人,哈哈哈,很真实。。。
- 废话不多说,进入正题
言归正传
- Last-Modified/Etag 这两个响应头只能在服务器里设置,既然是响应头,那肯定是只能在服务器里设置了
- 服务器设置这两个值,这两个值会随着响应头会反馈给客户端
var time = null
router.get("/demoTask",async ctx=>{
ctx.status = 200
ctx.set({
"Etag":"demo157989",
"Last-Modified":time ? time : (time=new Date())
})
ctx.body = "Hello"
})
- 当客户端接收到 Last-Modified/Etag的时候,会在下一次请求的时候,请求头会携带这两个值发送给服务器,服务器可以通过获取 请求头的 If-Modified-Since/If-None-Match 来获取值,换句话说,If-Modified-Since 就是上一次服务器发送过来的Last-Modified,If-None-Match 就是上一次 服务器发送过来的Etag
- 之所以请求头要 携带这两个值就是为了让服务器进行对比,看看资源有没有更新,一旦资源发生更新,那么 Last-Modified/Etag就会发生更新,这样服务器就可以及时的将更新之后的资源返回给客户端
- 忘了说了,ETag 可以理解为资源的唯一标识,资源的每一次更新都会引起ETag的更新,因此根据ETag可以检查资源是否更新,同样的,Last-Modified就是资源上一次修改的时间,一旦 Last-Modified发生变化,那么就说明资源 发生了更新,同样也可以检查资源的更新
代码实现
router.get("/demoTask",async ctx=>{
console.log("If-Modified-Since = "+ctx.request.get("If-Modified-Since"))
console.log("If-None-Match = "+ctx.request.get("If-None-Match"))
ctx.status = 200
ctx.set({
"Etag":"demo157989",
"Last-Modified":time ? time : (time=new Date())
})
ctx.body = "Hello"
})
- 可以看见成功获取了 上一次服务器的 Last-Modified/Etag
- 这样你就可以使用 Last-Modified/Etag来判断资源是不是更新,如果没有更新返回304状态码,如果资源更新了,那么就返回更新之后的资源