当您在 REST 中需要更多动词时该怎么办

2024-04-26

还有一个类似的question https://stackoverflow.com/questions/2001773/understanding-rest-verbs-error-codes-and-authentication对我来说,但讨论偏离了我遇到的问题。

假设我有一个处理费用报告 (ER) 的系统。您可以创建和编辑它们、添加附件以及批准/拒绝它们。

费用报告可能如下所示:

GET /er/1
=>
{"title": "Trip to NY", "totalcost": "400 USD",
 "comments": [
   "john: Please add the total cost",
   "mike: done, can you approve it now?"
   ],
 "approvals": [
   {"john": "Pending"}, {"finance-group": "Pending"}]
}

看起来不错,对吧?这就是费用报告文档的样子。

如果你想更新它,你可以这样做:

POST /er/1
{"title": "Trip to NY 2010"}

如果您想批准它,您可以这样做:

POST /er/1/approval
{"approved": true}

但是,如果您想更新报告怎么办and同时批准吗?我们该怎么做呢?如果您只想批准,那么做一个POST类似的东西/er/1/approval说得通。

我们可以在 URL 中添加一个标志,POST /er/1?approve=1,并将数据更改作为正文发送,但该标志似乎不是 RESTful。

我们也可以设置要提交的特殊字段,但这似乎也有点老套。如果我们这样做了,那么为什么不发送具有以下属性的数据:set_title or add_to_cost?

我们可以创建一个用于更新和批准的新资源,但是(1)我无法想到如何在没有动词的情况下命名它,并且(2)根据可以执行的操作来命名资源似乎不正确它(如果我们添加更多操作会发生什么?)

我们可以有一个 X-Approve: True|False 标头,但标头似乎不适合这项工作。如果不在浏览器中使用 javascript,也很难获得设置的标头。

我们可以使用自定义媒体类型,application/approve+yes,但这似乎并不比创建新资源更好。

我们可以创建一个临时的“批量操作”url,/er/1/batch/A。然后客户端发送多个请求,也许POST /er/1/batch/A更新,然后POST /er/1/batch/A/approval批准,然后POST /er/1/batch/A/status结束批次。在后端,服务器将所有批处理请求排队到某处,然后在收到“结束批处理”请求时在同一后端事务中处理它们。显然,这样做的缺点是它引入了很多复杂性。

那么,有什么好的通用方法可以解决在单个请求中执行多个操作的问题呢?通用是因为很容易想象在同一请求中可能执行的其他操作:

  1. 禁止或发送通知(发送至电子邮件、聊天、其他系统等)
  2. 覆盖一些验证(最高成本、晚宴参加者姓名)
  3. 触发文档中没有表示的后端工作流程。

这也是一个性能问题。 HTTP 调用会访问网络(如果您的延迟较高或连接不稳定,这可能会成为问题),因此您可以进行的调用越少越好。


REST 架构表示资源由服务器管理并由 URL 标识。

在那样的光线下/er/1/approval不是一个合理的 URL 或模型,除非您有在服务器端管理和操作的批准对象或实体。在我看来,该实体就是费用报告本身,这意味着,/er/1是你的 URL 路径。

现在,至于动词...您可以将任何您喜欢的消息发送(POST)到该资源。

设置数据:

{ action: "modify", data: { purpose : "Club hopping" } }

批准:

{ action: "approve" }

新增项目:

{ action:"additem", data: { amount:72.13, category:113, note:"client dinner" }}

etc.


From Fielding 的 Ch5,定义了 REST http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm,

(请求的)内参数由请求控制数据、指示请求目标的资源标识符和可选表示组成。

...和...

控制数据定义组件之间消息的用途,例如请求的操作或回应的意义。它还用于参数化请求并覆盖某些连接元素的默认行为。例如,可以通过请求或响应消息中包括的控制数据来修改缓存行为。


因此,如果您想对资源执行多个操作,那么您应该在“控制数据”中嵌入多个消息或操作请求。在我的示例中,发布的数据类似于:

{ action: "modify", data: { purpose : "Club hopping" } }
{ action: "approve" }

但你可能想概括一下,这样它就是:

{ actions: [ {action:"modify", data: {...} }, { action:"approve"} ] } 

您的服务器可以对每种特定类型的实体处理的消息或操作由您定义。

ps:有时 REST 实现使用 HTTPPUT创建资源并POST修改或作用于现有资源。

并且:我喜欢这篇文章,如何获得一杯咖啡 http://www.infoq.com/articles/webber-rest-workflow.

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

当您在 REST 中需要更多动词时该怎么办 的相关文章

  • 在 RESTful WCF 中混合 XML 和 JSON,无需单独的方法

    我有一个 RESTful WCF 服务 可以返回 XML JSON 或 JSONP 具体取决于参数 例如 service svc stuff format xml or service svc stuff format json callb
  • 无法从 ASP.NET 调用 DLL

    您好 我有一个 C Dll 它将与 cobol 应用程序交互 我们想通过互联网将数据发送到cobol 所以我创建了一个 C DLL 它将调用 C DLL 当我执行控制台应用程序时 它工作正常 但是当我尝试从 ASP NET 调用相同的 DL
  • 一般如何处理 CXF 请求处理程序中的输入参数?

    我一直在使用 apache CXF 版本 2 2 2 JAX RS 进行一些工作 我试图在调用业务方法之前在 CXF 请求处理程序中引入数据验证层 幸运的是 我在请求处理程序 DataValidationHandler 中遇到输入参数处理问
  • ASP.NET:WebService 类实例化的频率是多少?如何在其中制作一个持久对象?

    一个简单的问题 但我在谷歌上找不到答案 Web 服务类实例化的频率是多少 是每次调用 Web 服务一次 还是每次 任意时间段 一次 还是每次其他事情一次 EDIT 我本来希望这个班级能长久地生活下去 但事实似乎并非如此 关键是 我有一个用于
  • 序列化 .NET WCF 服务的类型时出现问题:服务 WSDL 在 XSD 中定义空类型

    我正在使用 WCF 编写一个 Web 服务 我创建了数据合约 我创建了我的服务合同 界面 我定义了方法 其参数的类型与数据契约相同 我实现了创建服务类的服务合同 我使用 svc 文件和 IIS 托管我的服务 我尝试了我的服务 寻找http
  • RestEasy @Path 正则表达式问题

    是否可以使用可选路径变量定义路径 就像下面的 uri app make make model model year year mileage mileage fuelType fuelType maxPrice maxprice trans
  • 如何添加重试以调用 Web 服务?

    我有一个应用程序调用使用 wsHttpBinding 的 Web 服务 我需要在连接超时等情况下对 Web 服务调用实现某种重试功能 执行此操作的最佳方法是什么 我已经阅读过有关 WS ReliableMessaging 的内容 但这不是
  • ASP.Net Web API 与 WCF,我的项目中应该选择哪一个

    到目前为止 我已经在网络上阅读了很多关于 WCF 和 ASP Net Web API 之间的差异的文章 不幸的是 我无法清楚地知道什么才能达到我的目的 我读过的大多数文章都强调了这两个 Web 服务的设计观点 但我很困惑什么最适合我的项目
  • 如何在 SoapUI 中测试使用 JWT 的 REST 服务?

    我正在实施一些 REST 服务 我所有的测试都是使用 SoapUI 进行的 最近 我决定采用 JSON Web Token JWT 进行身份验证 但我在 SoapUI 上找不到对此的任何支持 本机安装或插件 什么也没有 我发现了一些在线生成
  • 如何在 Jersey 容器中配置欢迎文件 (HTML/JSP)

    我有一个 Jersey RESTful Web 服务项目 我已经在中配置了 Jersey 容器web xml一切正常 在同一个项目中 我引入了一个 HTML 页面并包含在
  • 除了 GET 和 POST 之外,如何从浏览器向 RESTful 应用程序发送任何内容?

    我没有得到 RESTful 的东西 是的 我知道如何从浏览器向我的应用程序发送 GET 请求 这是通过 URL 链接 a href user someone 并且还可以通过form方法发送POST请求 a
  • Delphi XE5 REST/Android 客户端“会话已过期”

    我有一个REST Server与Android Client 都在Deplhi Xe5 Android客户端成功连接Rest服务器 在我的服务器中我有一个TDSHttpWebDispatcher with SessionTimeout 12
  • XML-RPC 与 REST

    我打算在这里构建一个小型服务器 并想为其创建一个 API 我正在决定什么是更好的并且已经排除了SOAP因为在我看来那件事是一团糟 我只剩下REST and XML RPC 我真的很喜欢XML RPC 它实现起来非常简单 并且足够常规 所有客
  • 如何限制 JSON 访问?

    我有一个 Web 应用程序 可以从新创建的 JSON API 中提取数据 我的静态 HTML 页面通过 JavaScript 从静态 HTML 页面动态调用 JSON API 如何限制对 JSON API 的访问 以便只有我 我的网站 可以
  • 使用“邮递员”chrome 应用程序的肥皂请求正文

    假日网络服务 的肥皂请求正文会是什么样子 http www holidaywebservice com HolidayService v2 HolidayService2 asmx wsdl http www holidaywebservi
  • 微服务、amqp 和服务注册/发现

    我正在研究微服务架构 实际上我想知道一些事情 我非常同意使用 返回 服务发现来在基于 REST 的微服务上发出请求 我需要知道发出请求的服务 或至少是服务器集群的前端 在哪里 因此在这种情况下能够发现 ip port 是有意义的 但我想知道
  • App.Config 和 Web.Config 之间的区别?

    当在 wpf 中构建桌面应用程序时 您可以阅读问题文档并在人们的答案引用 web config 时安全地替换 app config 吗 如果是这样 您是否需要注意任何明显的陷阱 tnx 阅读文档 http msdn microsoft co
  • 如何使用继承来建模 RESTful API?

    我有一个需要通过 RESTful API 公开的对象层次结构 但我不确定我的 URL 应该如何构建以及它们应该返回什么 我找不到任何最佳实践 假设我有从动物继承的狗和猫 我需要对狗和猫进行CRUD操作 我还希望能够对一般动物进行手术 我的第
  • 如何使用 php 将 base64 解码的图像保存在文件系统中?

    我通过向我的 Web 服务发出 POST 请求来获取 Base64 编码的 JPEG 字符串 我想解码它并将其保存在文件系统中 我如何使用 PHP 5 3 来实现这一点 我能够使用 base64 decode 函数成功解码数据 如何将此解码
  • 如何向我的 Spring MVC REST 服务添加错误?

    如果用户没有输入我正在编码的两个名称 我如何更改 更新来自 Spring MVC 的以下 REST 调用以返回错误 未找到 RequestMapping value name method RequestMethod GET Respons

随机推荐

  • 对象Vba读取项目

    我无法读取电影对象 我不知道为什么 我试图将 JSOn API 返回到 Excel 中的工作表 但我无法读取电影对象 Sub getData Dim Movie As Object Dim R As Object Dim scriptCon
  • 检查 datagridview 单元格是否为空或为空[重复]

    这个问题在这里已经有答案了 我必须更改单元格的背景颜色 当它们的值为字符串或空时 这是我编写的代码 与此处的其他代码类似 for int rowIndex 0 rowIndex lt dataGridView1 RowCount rowIn
  • 如何从Python字符串中提取国家/地区

    我有一些文本 其中可能包含也可能不包含国家 地区名称 例如 尼日利亚 Hotspot Network LTD 农村电话可行性研究 这就是我从中提取国家 地区名称的方法 在我的第一次尝试中 findcountry Nigeria Hotspo
  • kubernetes POD IP什么时候会改变?

    我正在尝试将一个整体应用程序移植到 k8s pod 理论上 Pod 被认为是短暂的 建议使用服务概念来提供静态 IP 但到目前为止 在我的测试中 我还没有看到 POD IP 被更改 那么现在的问题是 k8s 什么时候会为我的 POD 分配一
  • 如何在 ubuntu 20 中安装旧版本的 gcc -3 或 gcc-4

    我正在尝试安装旧版本的 gcc 4enter code here对于我的ubuntu创建构建目录 mkdir gcc build cd gcc build 下载源文件 wgethttp www netgull com gcc release
  • 使用 Google 翻译翻译整个 Google 表格

    我有一张用日语写的 Google 表格 我需要将其转换成英文 我知道我们可以使用googletranslate
  • SSIS 与 DTS 性能

    这么晚了才这么做似乎很疯狂 但是 我正在使用 Rocket Software UniVerse 源和 SQL 目标重建一些 ETL 基础设施 旧的目标平台是 Windows Server 2003 上的 SQL 2000 新平台是 Wind
  • 如何检查一个点是否在给定半径内?

    我有以下代码 需要很长时间才能执行 pandas 数据框df and df plants非常小 小于 1Mb 我想知道是否有任何方法可以优化这段代码 import pandas as pd import geopy distance imp
  • 如何在 Ruby 中获取从位置 N 到最后一个字符的子字符串?

    我想从字符串中获取从位置 N 到字符串末尾的子字符串 在 Ruby 中如何做到这一点 只需将字符串切片即可 string N 1
  • 简单版jQuery live函数

    是否有可能在任何地方获得一个纯 Javascript 函数用于事件处理程序 其功能与 jQuery 类似live 我需要能够将事件附加到尚未创建的对象 但由于依赖于 jQuery 核心 jquery livequery 和 jquery e
  • 如何使用Python和Pandas在时间翻转时添加24小时

    我必须分析一些日志 并基于此 我必须计算一些东西 但我坚持了一件事 在这里 我尝试以简单的形式重新创建我的问题 假设我有以下日志 堆栈溢出 txt file 23 58 03 458 23 58 13 446 23 58 23 447 23
  • Visual Studio 网站中的项目设置实际存储在哪里?

    在 VS2010 中使用网站 而不是 Web 应用程序 因此没有 csproj 文件 右键单击解决方案资源管理器中的 站点 节点并选择 属性页 会弹出一个对话框 其中包含 引用 生成 辅助功能 启动选项 MSBuild 选项 和 Silve
  • 下载 VSTS 附件

    有人知道如何使用 C 库检索附件 ID 并从 VSTS 下载 WorkItem 附件吗 我已经审查了附件样本 https github com Microsoft vsts dotnet samples blob master Client
  • Symfony ArrayCollection 与 PersistentCollection

    据我了解 当您通过存储库查询数据库时 您会得到 PersistentCollection 而当您使用实体时 您会得到 ArrayCollection 因此 考虑到我的用户实体有一对多的自引用关系 在我的用户实体中 我有一个 setChild
  • WPF 中的多列树视图 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道我在哪里可以获得 WPF 中的多列树视图之类的控件吗 夏普开发 http www icshar
  • Xalan XSLT 多个输出文件?

    我只是想知道 是否可以使用 Xalan 将单个输入 XML 文件的处理输出到多个其他文件 我不一定必须这样做 我知道我可以使用其他工具来做到这一点 如 Saxon 和 或我可以处理不同的文件以获得不同的输出 我只是想知道我必须使用哪些选项来
  • 无法计算表达式 - Visual Studio 调试模式

    当尝试单步执行代码并使用 Visual Studio 中的立即窗口或监视窗口时 我不断收到以下信息 无法评估表达式 我正在使用 Visual Studio 2008 搜索论坛 有很多关于使用重载的 Response Redirect 并将
  • 如何确定单元测试的测试用例?

    我刚刚开始单元测试 并编写了一些简短的测试来检查名为 isPrime 的函数是否正常工作 我有一个测试来检查该函数是否正常工作 并有一些数字和预期返回值形式的测试数据 我应该测试多少 我如何决定测试哪个 这里的最佳实践是什么 一种方法是生成
  • 从另一个 Java 小程序访问 Java 小程序

    Web 应用程序使用 Java 小程序 该小程序将用户提交的密码存储在私有属性中 并在多个公共方法中使用该属性 我想知道从相同或不同网站加载的另一个 Java 小程序是否可以调用该小程序的方法或可能访问包含密码的私有属性 不同的小程序是在相
  • 当您在 REST 中需要更多动词时该怎么办

    还有一个类似的question https stackoverflow com questions 2001773 understanding rest verbs error codes and authentication对我来说 但讨