为何用ETag与If-Match实现REST API资源版本控制不符合RFC规范?
别再用ETag + If-Match做REST API资源版本控制了,这是个常见误区
你提到的这个情况确实很普遍——不少开发教程会把ETag搭配If-Match当成REST API资源版本控制的标准操作,但对照RFC文档的定义来看,这种用法其实完全偏离了ETag的设计初衷。
为什么这种做法不对?
- ETag绑定的是资源的表现形式,而非资源本身:同一个业务资源(比如一条用户数据),如果返回XML格式和JSON格式,因为两者的字节内容完全不同,对应的ETag也会不一样。更关键的是,哪怕是同一个格式的响应,开启gzip压缩后,传输的字节流发生了变化,ETag也会随之改变。这就意味着,哪怕资源的业务数据根本没更新,只要返回的格式或编码调整了,ETag就会“失效”,完全起不到跟踪业务版本的作用。
- ETag的核心是基于传输字节生成:根据RFC的定义,ETag本质是用来验证缓存有效性的标识符——它的作用是让客户端判断自己缓存的内容和服务器当前的响应内容是否一致,从而避免重复传输。它从设计上就不是用来标识资源的业务版本的。
那该怎么做资源版本控制?
如果需要跟踪资源的业务版本(比如防止并发更新冲突),更合适的方案是使用专门的版本标识:
- 在资源的业务数据中加入
version字段(比如数据库表里加一个自增的version列) - 或者使用自定义的HTTP标头(比如
X-Resource-Version)来传递业务版本号
这些方案不会受响应格式、编码的影响,能准确跟踪资源的业务数据变更。
内容的提问来源于stack exchange,提问作者Graham
相关产品推荐
相关产品推荐

