首页 文章

浏览器缓存:Json响应

提问于
浏览
0

我尝试使用Etag缓存来自api请求的json响应 . 我正在打这样的事情http://localhost:3000/api/config并得到:

Response Headers:
Cache-Control:public,max-age = 31557600
连接:保持活跃
内容长度:11
内容类型:应用/ JSON;字符集= utf-8的
日期:2015年5月13日星期三,格林威治标准时间11:41:52
ETag:"94d52736bcd99b1ac771f13b1bbdf622"
X-已启动方式:快递

Resonse:{id:1}

我希望浏览器缓存响应,并通过“f5”向Etag发送下一个请求triggert . 但事实并非如此 .

Request Headers 2nd request:
接受:text / html,application / xhtml xml,application / xml; q = 0.9,image / webp,/; q = 0.8
Accept-Encoding:gzip,deflate,sdch
接受语言:DE-DE,DE; Q = 0.8,EN-US; Q = 0.6,连接; Q = 0.4
缓存控制:无缓存
连接:保持活跃
主持人:本地主机:3000
附注:无缓存
User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.36(KHTML,类似Gecko)Chrome / 42.0.2311.135 Safari / 537.36

因此,通过直接api请求缓存纯json响应是不可能的?
或者我会错过什么 .

api是一个使用express完成的节点js测试实现:

router.get('/config', function(req, res) {
    var eTag = crypto.createHash('md5').update(JSON.stringify(config)).digest('hex');
    res.setHeader('ETag', '"' + eTag + '"');
    res.setHeader('Content-Type', 'application/json');
    res.setHeader('Cache-Control', 'public, max-age=31557600');
});

使用chrom(42.x)和firefox(37.x)的Testet

谢谢你的回应 .

3 回答

  • 0

    嗨这段代码似乎对我有用:

    router.get('/config', function(req, res) {
        var eTag = crypto.createHash('md5').update(JSON.stringify(config)).digest('hex');
    
        if (req.headers['if-none-match'] && req.headers['if-none-match'] === '"' + eTag + '"') {
            res.status(304);
            res.end();
        } else {
            res.setHeader('ETag', '"' + eTag + '"');
            res.setHeader('Content-Type', 'application/json');
            res.setHeader('Cache-Control', 'public, max-age=31557600');
            res.send(JSON.stringify(config));
        }
    });
    

    使用浏览器URL栏调用api http://localhost:3000/api/config

  • 0

    看起来你可能正在使用chrome . Chrome应在“f5”后的请求中包含以下 Headers :

    If-None-Match:"94d52736bcd99b1ac771f13b1bbdf622"
    

    如果您没有看到这一点,请检查chrome settings / General并确保未选中“禁用缓存(当DevTools打开时)”:

    Disable cache not checked in Chrome dev tools

  • 1

    使用jQuery我们可以使用ifModified选项:

    $.ajax({
       type: "GET",
       ifModified: true,
       url: "http://localhost:3000/api/config"
    }).then(function(data) {
       . . .
    });
    

相关问题