http研究之旅:Last-Modified/Etag

2020年01月28日 阅读数:13
这篇文章主要向大家介绍http研究之旅:Last-Modified/Etag,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
http研究之旅:Last-Modified/Etag
  • 我最初学习http的时候,是经过买的一本书《图解http》来进行学习的,可是看过以后发现这本书可让你大概明白HTTP原理是怎么一回事,换句话说,就是让你对http有一个更加深刻的了解,可是吧,你只是了解的话,平时吹吹牛还行,可是一旦让你用代码写出来,感受本身啥也不会了,哈哈哈,很真实。。。
  • 无奈之下,只能本身结合书本所说的去研究代码的实现,毕竟,我只明白个大概可是我不会写,像这样的事情,感受很丢人,哈哈哈,很真实。。。
  • 废话很少说,进入正题
言归正传
  • Last-Modified/Etag 这两个响应头只能在服务器里设置,既然是响应头,那确定是只能在服务器里设置了
  • 服务器设置这两个值,这两个值会随着响应头会反馈给客户端
// server.js
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发生变化,那么就说明资源 发生了更新,一样也能够检查资源的更新
代码实现
// server.js
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状态码,若是资源更新了,那么就返回更新以后的资源