计算 REST API 的 ETag

2024-06-25

我们正在构建我们使用的 REST APIETag https://en.wikipedia.org/wiki/HTTP_ETag有两种用途:

  1. 通过允许客户端避免重新加载资源来节省带宽(对我们来说并不重要)
  2. 解决并发问题(丢失更新问题)

从实际角度来看,我想知道用什么来计算 ETag。

  • 项目哈希值

    我们使用响应中发送的项目对象(的 json 转储)的哈希值。这很好用。检查 PUT 请求很容易:从数据库中提取项目、计算哈希值、比较。然而,它使得关注点分离有点“泄漏”:构建项目响应的层与负责 ETag 计算的层是交错的。此外,附加数据(响应标头)可能很重要,如果确实如此,仅仅因为项目本身没有更改而标头发生更改而发送 304 可能是不合适的。

  • 响应哈希

    另一种方法是在发送响应之前对响应进行哈希处理。这样做可以使 ETag 层的计算部分更加清晰。但是,在 PUT 请求中,我们不能只是从数据库中提取项目来检查 ETag,因为我们没有额外的数据。

第一种方法(计算项哈希)似乎适合情况 2 并发问题。第二种方法(计算有效负载哈希,包括元数据、标头)适用于情况 1,节省带宽。

将响应的每一位(包括标头)放入请求中似乎是正确的,因为其中的每个更改都可能是相关的,并且需要客户端刷新其缓存。但我不知道如何使用这样的 ETag 管理 PUT 或 DELETE 请求的并发性。

从实际角度来看,我们应该使用项目哈希还是响应哈希,以及如何使用其中一种来处理这两种情况?


根据您的描述,我认为响应哈希是这里唯一有意义的哈希。

首先,为了使用条件请求来避免更新丢失问题,验证器需要坚强 https://datatracker.ietf.org/doc/html/rfc7232#section-3.1.

源服务器必须在以下情况下使用强比较功能: 比较 If-Match 的实体标签(第 2.3.2 节),因为客户端 旨在此先决条件阻止应用该方法,如果 表示数据有任何更改。

仅当表示形式逐位相同时,强验证器才能具有相同的值。但是,如果正如您所说,“附加数据可能很重要”超出了项目哈希值,那么您就无法决定一个强大的ETag当时。因此,在这种情况下,您根本无法进行项目哈希并与规范保持一致。

当然,您可以决定附加数据not没关系,在这种情况下,您仍然可以进行项目哈希并与规范保持一致。但这消除了您为响应哈希想法给出的一个缺点(“我们不能只是从数据库中提取项目来检查 ETag,因为我们没有额外的数据”)。

换句话说:你需要一个强大的ETag以避免丢失更新和强大的验证器必须改变 https://datatracker.ietf.org/doc/html/rfc7232#section-2.1“每当表示数据发生变化时,可以在 GET 的 200(OK)响应的有效负载主体中观察到。”所以要构建ETag你必须知道你所知道的一切才能回应GET无论如何,因此在响应层中执行此操作没有任何缺点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 REST API 的 ETag 的相关文章

  • 如何从 Android 调用 RESTful 方法?

    我尝试了两种不同的方法来从 Android 调用简单的 REST 方法 所述 REST 方法 适用于其他客户端 仅返回一个 int val 例如 17 以下两次尝试都是基于我在网上找到的代码 有一种是这样的 公共无效onFetchBtnCl
  • 当会话令牌无效时,我应该使用什么状态代码?

    创建 Web 服务 RESTful 时 当会话令牌无效时我应该使用什么状态代码 目前我公司的人给我发了一个404 未找到 但我认为这是不正确的 因为资源存在 也许我应该使用 401 Unauthorized 你怎么认为 您建议我在这种情况下
  • 使用 AFNetworking 重置基本身份验证凭据

    我正在编写一个 REST 客户端 使用 AFNetworking 并且需要能够在应用程序的单个实例中触发新会话的创建 换句话说 我想 1 通过服务器进行身份验证2 进行一些 REST 调用3 模拟 注销 4 重新与服务器进行身份验证5 进行
  • 这是 Box API v2 获取事件时的错误吗

    使用 BOX API v2 从 Box 获取事件时 我发现了一个奇怪的行为 我得到的场景如下 使用 box API v1 将 14 个文件上传到 box net 使用stream position now 获取事件 这给出了流位置 例如12
  • 每个线程具有不同参数的 JMeter 测试计划

    我需要使用 JMeter 测试网络服务 我已经使用线程组 500 创建了测试计划 我需要为每个线程传递新的参数值 我听说过 CSV 数据集配置 但它不允许我想要的 因为如果我设置 共享模式 所有线程 那么每个线程将尝试从文件的每一行读取 我
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • 如何为 cxf jax-rs 2.0 客户端注册 jackson json 提供程序?

    我有一个 JAX RS 客户端正在发出一个简单的 GET 请求 我使用 CXF 实现和 Spring 进行 DI 呼叫成功 我收到响应代码 200 但是在将响应读入 POJO 时出现错误 例外 2015 05 08 16 11 55 457
  • 强制 WCF 在进入实际函数之前对每个请求调用一个方法

    我有一个具有许多不同功能的 RESTful WCF 服务 对于每个函数 我需要调用我编写的身份验证方法 我可以在每个请求上手动调用此方法 但我一直在寻找一种方法来强制 WCF 引擎在输入这些函数之前调用此方法 有谁知道这是否可能 Cheer
  • Rails RESTful 资源对包含分隔符的字段使用 to_param

    我希望我的 Rails 2 3 2 应用程序能够响应并生成 URL 如下所示 websites asd com websites asd com dns records new 在我的 config routes rb 中 我有 map r
  • 将 HTTP GET 请求中的 JSON 数据从 JAVA 代码发送到 REST API

    我正在向我的 API 成功发出以下curl 请求 curl v X GET H Content Type application json d query some text mode 0 http host domain abc com
  • 如何使用 php Restful 以 api 为中心的内部设计而不是使用 http 请求

    我想创建一个以 php Restful api 为中心的 Web 应用程序 网站 其中有从前端代码调用的数据 api 除了每次加载页面时进行 HTTP curl 请求调用之外 使用 slim 等框架进行内部 API 调用还能做什么 我不确定
  • Gmail REST API - 将邮件标记为已读

    我正在尝试使用 Gmail REST API 将邮件标记为已读 markGmailRead click function var request ajax type POST dataType json headers Authorizat
  • 用于控制器休息服务的 Spring Junit 测试用例

    我有一个响应 REST 调用的控制器 我有针对其他公共方法的各种测试用例 我不知道如何为我的控制器编写一个 RequestMapping value api frames method RequestMethod GET public Li
  • 计算 REST API 的 ETag

    我们正在构建我们使用的 REST APIETag https en wikipedia org wiki HTTP ETag有两种用途 通过允许客户端避免重新加载资源来节省带宽 对我们来说并不重要 解决并发问题 丢失更新问题 从实际角度来看
  • REST Content-Type:它应该基于扩展还是 Accept 标头?

    RESTful Web 服务返回的表示 html xml json 应该由 url 还是由 Accept HTTP 标头确定 两者都有效 引用自xml com http www xml com pub a 2004 08 11 rest h
  • 以 RESTful 方式重新排序项目

    我有一个包含以下数据的表 id position name 1 4 Fred 2 2 Wilma 3 1 Pebbles 4 5 Barney 5 3 Betty 这是一个用户可以重新排列的列表 因此是位置列 我的问题是 我怎样才能以一种平
  • 通过 Axios 向 Firebase 云功能发送 POST 请求

    我尝试向 Firebase 函数发送一个简单的请求 但每次都会遇到相同的错误 显然 Firebase 函数没有收到我想要从 Axios 请求传输的数据 这是 Firebase 功能 Some imports exports complete
  • 在 C# 中解析 Json Rest api 响应[重复]

    这个问题在这里已经有答案了 我正在尝试使用 C 从 Rest api json 响应中提取值 我有以下代码 client BaseUrl https api cloud appcelerator com request Resource v
  • JAX-RS框架[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在使用 JAX RS 参考实现 泽西岛 进行一些工作 我知道至少有两个其他框架 Restlet 和 Apache CXF 我的问题是
  • 创建 RESTful WebService 并通过 Glassfish 4 提供服务

    我在 JEE6 中看到了很多关于 RESTful WebServices 的问题 所以我想与您分享这个示例解决方案 它展示了实现 RESTful Webservice 是多么容易 首先创建一个新的动态 Web 项目并将 Glassfish

随机推荐