API 接口资源有没有必要设置浏览器缓存?

通常情况下,我们发起请求,返回的是json 数据,json 是通过计算或者数据库查询返回的,不是静态资源。服务器如何检查是否有更新的?如果没有办法检查是否有更新,设置浏览器缓存的是不是没意义了?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9

API接口是无状态的,个人是不会设置缓存,如果真的需要缓存可以在客户端缓存接口返回数据,如果是为了节流,可以限制请求API频率

4年前 评论

看业务需求,需要缓存的就缓存,不缓存的就每一次都去调 API,人为决定的。

4年前 评论

@畅畅@青风百里 如果我把接口返回的json数据做了浏览器缓存,比如 Etag。这样我再次发起同样的请求,会先查看浏览器缓存,并通过服务器验证数据是否已更改。因为json数据是计算或者查数据库而来的,不像静态资源,没法判断是否有更改,这样的话,设置浏览器缓存Etag 好像没多大意义?我这样理解正确吗?

4年前 评论

@matteao 对的,既然你要通过服务器验证数据是否已更改,不如直接拿新的数据。

4年前 评论
matteao (楼主) 4年前

我想你应该是想要 Vary 这个功能吧。

Vary

4年前 评论
matteao (楼主) 4年前

我不知道你是全栈还是后端,但是你能有这个思考,我觉得你他日必然能成为优秀的开发人员。
因为这个问题我也思考过 :joy:
好了,正式开始回答,我认为没必要,我的想法是两点。
第一,服务端有缓存,客户端也有缓存,共同点是两者缓存的信息都是长时间不变化而且输出频繁的。
第二,然后我们站在浏览器的角度去看,浏览器发起get请求就是为了获取自己没有的信息。
最后,论坛的朋友都是提出自己的想法(局限性),但你自己才最了解你的项目(全局的)。祝你早日找到最合适的策略。

4年前 评论
matteao (楼主) 4年前

关键是:浏览器怎么知道你的资源有没有更新呢?ETAG 也没用吧

4年前 评论
matteao (楼主) 4年前
宇宙最厉害

Dingo Api 已经有解决方案了

修改配置

API_CONDITIONAL_REQUEST=true

2.2. 配置信息《Dingo API 2.0.0 中文文档》

4年前 评论
matteao (楼主) 4年前

我的理解是:

etag就是一个标记,用来判断资源有没有更改。

你把要返回的数据进行散列一下,返回设置etag,浏览器下次请求的时候会带着If-None-Match:{上次请求的etag},你拿到这个etag,服务端进行比较一下就行了。 服务端比对一致后,返回304 Not Modified。

主要减少的就是数据传输的带宽,属于协商缓存。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!