我们正在构建REST,其中我们将ETag用于两种用途:
从实际的角度来看,我想知道如何计算ETag。
第一种方法(计算项哈希)似乎适用于案例2的并发问题。第二种方法(计算有效负载散列,包括元数据、标头)将适合于情况1节省带宽。
在请求中放置每个响应(包括头)似乎是正确的,因为那里的每一个更改都可能是相关的,并要求客户机刷新其缓存。但是我不知道如何管理使用这样一个ETag的PUT或DELETE请求的并发性。
从实际的角度来看,我们应该使用项散列还是响应散列,如何使用其中之一来处理这两种情况?
发布于 2022-01-24 20:38:44
考虑到您的描述,我认为响应散列是这里唯一有意义的。
首先,为了使用条件请求来避免丢失的更新问题,验证器需要坚强。
在比较If-Match的实体标记时,源服务器必须使用强比较函数(第2.3.2节),因为客户端打算在表示数据发生任何更改时阻止应用该方法。
强验证器只能在表示为位对位相同时才具有相同的值。但是,如果,正如您所说的,“额外的数据可能会影响”项哈希之外的内容,那么此时您就无法决定一个强大的ETag。因此,在这种情况下,您根本无法执行项哈希操作并与规范保持一致。
当然,您可以决定附加数据并不重要,在这种情况下,您仍然可以进行项哈希,并与规范保持一致。但是,这消除了响应散列的一个缺点(“我们不能从DB中提取项来检查ETag,因为我们没有额外的数据”)。
换句话说:您需要一个强ETag来避免丢失的更新,而强验证器必须改变“每当发生对表示数据的更改时,就需要在200 (OK)响应的有效负载体中观察到要获取的数据”。因此,要构建ETag,您必须知道在任何情况下响应GET所知道的一切,所以在响应层中这样做没有坏处。
https://stackoverflow.com/questions/70838264
复制相似问题