RESTful API 设计:更新 (PUT) 中不可更改的数据是否应该是可选的?

2024-04-25

我正在实现 RESTful API,并且我不确定对于无法更改的数据的存在是否存在“社区接受”行为。例如,在我的 API 中,有一个“文件”资源,该资源在创建时包含许多在创建后无法修改的字段,例如文件的二进制数据以及与其关联的一些元数据。此外,“文件”可以具有书面描述和关联的标签。

我的问题涉及对这些“文件”资源之一进行更新。特定“文件”的 GET 将返回与该文件关联的所有元数据、描述和标签,以及文件的二进制数据。特定“文件”资源的 PUT 是否应该包含“只读”字段?我意识到它可以通过以下两种方式进行编码:a)在 PUT 数据中包含只读字段,然后验证它们与原始数据匹配(或发出错误),或者 b)忽略 PUT 数据中只读字段的存在因为它们无法更改,如果它们不匹配或丢失,则永远不会发出错误,因为逻辑会忽略它们。

看起来无论哪种方式都可以并且可以接受。忽略只读字段的第二种方法可以更紧凑,因为 API 客户端可以根据需要跳过发送只读数据;这对于那些知道自己在做什么的人来说似乎很好......


就我个人而言,这两种方式都是可以接受的……但是,如果我是你,我会选择选项 A(检查只读字段以确保它们不被更改,否则会抛出错误)。根据您的项目范围,您无法假设消费者深入了解您的 Restful WS,因为他们中的大多数人不会阅读文档或 WADL,即使他们是经验丰富的人。 :)

如果您不立即向消费者提供某些字段是只读的反馈,他们就会错误地认为您的网络服务将在不进行双重检查的情况下处理他们所做的所有更改,OR一旦他们发现“不一致”的更新,他们就会向其他人抱怨你的网络服务有问题。

如果只读字段与原始值不匹配,您可以通过两种不同的方式来解决这个问题......

  1. 不处理该请求。发送 409 冲突代码和具体错误消息。
  2. 处理请求,发送 200 OK 和一条消息,说明只读字段所做的更改将被忽略。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RESTful API 设计:更新 (PUT) 中不可更改的数据是否应该是可选的? 的相关文章

随机推荐

  • 如何检查单个精灵帧期间的重叠情况?并在玩家与帧重叠的每个循环中仅从玩家生命值中减去 1?

    我有一个尖峰精灵 其循环中有 4 个帧 当玩家与尖峰精灵的第三帧重叠时 我想从健康变量中减去 1 目前 on 函数无法正确加载 我的游戏可以运行 但重叠功能根本无法运行 我编辑了收到的代码 并删除了我认为不需要的方面 测试了原始代码示例以检
  • Pygame 弹力球穿过地板下沉

    下面的代码会弹起一个球 但由于某种原因 球在完成弹跳后会穿过地面 有人知道为什么吗 代码的想法是一个球从左上角开始 然后下落并弹起 然后向上和向下移动 依此类推 直到它停止弹跳 但是当它停止弹跳时 它开始抖动并慢慢下沉到地面 我不知道为什么
  • 如何删除已发布的 wmi 架构?

    我已经发布了架构 并且不再拥有包含发布该架构的 wmi 提供程序的 dll 如何删除架构 如果您正在谈论其他问题中的程序集 您可以简单地使用 wbemtest exe 连接到根命名空间 枚举实例 按钮 超类 名称 命名空间 删除名为 Tes
  • Visual Studio 2013 Shell(独立)安装失败并出现错误 997:重叠 I/O 操作正在进行

    我正在尝试在 Windows 7 Pro 计算机上安装 Visual Studio 2013 Express for Desktop 我已经下载了 ISO 文件并在本地运行它 我运行安装程序并收到有关未安装某些先决条件 其中之一是 C 运行
  • 局部变量隐藏字段是什么意思?

    所以这只是我代码的一部分 整个程序编译并运行 但我不断在以 GameBoard myBoard this getGameBoard 开头的三行旁边看到 局部变量隐藏字段 我 我只是好奇这实际上意味着什么 以及从长远来看它是否对我的程序有任何
  • 从 .csv 文件读取值并将其转换为浮点数组

    我偶然发现了一个小编码问题 我基本上必须从 csv 文件中读取数据 该文件看起来很像这样 2011 06 19 17 29 00 000 72 44 56 0 4772 0 3286 0 8497 31 3587 0 3235 0 9147
  • 更改模态视图控制器的大小

    一旦用户点击一个按钮 我希望我的 modalViewController 在屏幕中间显示为一个小正方形 您仍然可以在后台看到原始视图控制器 我在 stackoverflow 上找到的几乎每个答案都使用故事板来创建模态视图控制器 但我已经找到
  • 如何追踪正在修改 DOM 中 div 内联样式的 JavaScript?

    我正在搞乱 WordPress 插件 当我从顶部向下滚动大约 50 像素时 div 标签的内联样式属性正在发生变化 我怎样才能找出造成这种变化的原因 有 Chrome 功能或开发工具可以指向它吗 Try the Chrome 开发工具时间轴
  • Vim:如何交换两个字符?

    有没有快速更改的命令 Cnotrol to Control While in normal mode with your cursor on top of the first character to swap you can type x
  • python 2.7编码解码

    我有一个涉及编码 解码的问题 我从文件中读取文本并将其与数据库 Postgres 中的文本进行比较 比较在两个列表内完成 从文件中我得到 jo 的 jo x9a 从数据库中我得到相同值的 jo xc5 xa1 common a for a
  • 在过滤器Javascript中添加两个条件

    我试图在过滤器中添加两个条件 但只有一个有效 第一个条件检查单词之间是否有空格 第二个条件检查words length 是否大于给定的最小长度 如果字符串是 hello world 然后我需要在分割它时得到 hello world 相反 我
  • 使用 jQuery 替换 XMLHttpRequest

    我对 JavaScript 库还很陌生 我想用 jQuery 替换我当前的代码 我当前的代码如下所示 var req function createRequest var key document getElementById key va
  • 这是 Oracle 可能的错误还是我遗漏了什么?

    数据库是 Oracle 10 2 0 1 0 64 位 在 Red Hat Enterprise Linux ES 第 4 版 Nahant 更新 8 上运行 在 SQL Plus 中 以下代码可以完美运行 var comment id n
  • 即使在客户端设置 Access-Control-Allow-Origin 或其他 Access-Control-Allow-* 标头后,仍会出现 CORS 错误

    我有一个使用以下命令生成的 Vue 应用程序webpack simple选项 我正在尝试做一个GET请求https api forismatic com api 1 0 method getQuote format json lang en
  • 如何在 R 中设置一个包含自身的类(对于树)?

    我需要一个可能包含也可能不包含自身的类 以用作 R 中的树 每个节点都有 Side Analytical Matrix MaxChi2 P 和 Sons 也是节点类型 第一次创建节点时 我需要子节点为空或 NULL 但后来我创建了它们并将它
  • 渐进式 JPEG 的完整缩略图需要多少字节?

    我正在尝试构建一个上传器 它分两步上传渐进式文件 上传创建缩略图所需的最小字节数 0 10 上传缩略图的其余字节 11 100 我希望这样做可以更早地提供缩略图 而无需上传单独的缩略图 拍摄使用以下命令创建的图像 3426398 字节 jp
  • 为什么使用 Dijkstra 算法而不是最佳(最便宜)优先搜索?

    从我到目前为止所读到的来看 这最佳优先搜索 https en wikipedia org wiki Best first search在找到到达目标的最短路径方面似乎更快 因为 Dijkstra 算法在遍历图时必须放松所有节点 是什么让 D
  • Ajax请求成功但结果为空

    我正在构建一个 Google Chrome 浏览器扩展 它使用 ajax请求将数据从网页发送到我的服务器 当前使用本地主机托管 这content script js在网页上下文中执行的文件 有关内容脚本的更多信息 http develope
  • 理想的 Android Studio gitignore 文件

    我最近创建了一个 Android 项目 但这是我第一次使用 Android Studio 我将该项目放在 Git 文件夹中 以便能够通过 Git 与其他开发人员远程工作 我发现默认的 gitignore 文件包含以下内容 iml gradl
  • RESTful API 设计:更新 (PUT) 中不可更改的数据是否应该是可选的?

    我正在实现 RESTful API 并且我不确定对于无法更改的数据的存在是否存在 社区接受 行为 例如 在我的 API 中 有一个 文件 资源 该资源在创建时包含许多在创建后无法修改的字段 例如文件的二进制数据以及与其关联的一些元数据 此外