4

我正在开发一个清理/过滤服务,它有一个方法可以接收在 xml 中序列化的对象列表,并应用一些过滤规则来返回这些对象的子集。

  1. 在 REST-ful 服务中,我应该为这种方法使用什么动词?我认为 GET 是一个自然的选择,但我必须将序列化的 XML 放在请求的正文中,这有效但感觉不正确。其他动词似乎不符合语义。

  2. 定义该服务接口的好方法是什么?命名资源 /Cleanup 或 /Filter 看起来很奇怪,主要是因为在我在网上看到的示例中,它始终是一个名称,而不是用于资源名称的动词。

  3. 我是否认为 REST 服务更适合 CRUD 操作,并且您开始在这种服务的情况下改变规则?如果是,那么我是否做出了错误的架构选择。

  4. 为了简单起见,我已经推动以 REST-ful 样式(而不是 SOAP)开发此服务,但这种尴尬的情况经常发生,让我觉得我错过了一些东西。要么选择不应该使用的 REST,要么可能会过度思考一些无关紧要的东西?在那种情况下,真正重要的是什么?

4

2 回答 2

5

REST 就是按照设计的方式使用 HTTP。要考虑 RESTful(标题是 REST 设计 :):

  • URL 应该是资源的永久链接(缓存优势、存储/共享端点等......)
  • 因为它们是资源的永久链接,所以 URL 中有动词暗示您走错了路径(过滤器是动词)。
  • 资源集合可以是端点 /foos。
  • 如果要过滤资源集合,请考虑查询字符串参数,例如 ?filter= 或类似 ?ids=1,2,3,4,5 的东西。
  • GET 不应更改资源。请注意,“清理”意味着某些内容将被删除,因此在执行 GET 时要小心更改资源。REST 说 GET 不应该改变资源。想象一下缓存服务器将您的清理请求作为 GET 并返回 OK,因为 t 已缓存。缓存服务器知道不缓存 POST、DELETE 等...(这就是 HTTP 的设计方式)。
  • 不要排除多次调用 - 例如,您可能会执行 get 过滤并获取一组要清理的资源,然后可能会跟随许多或一个 DELETE 动词调用来进行清理。
  • 有时有一个时间资源,比如事务或“工作”,可以像清理工作一样工作。不要排除对包含要清理的项目的主体的资源的 POST 并返回作业 ID。然后,您可以查询 jobid 以获取清理进度或状态。

很难给出准确的指导,因为问题不明确,但希望上面的 RESTful 原则指导和想法能让您走上正轨。如果您澄清确切的调用,我会尝试并推荐 API。

所以,假设你想清理重复的 foos。

[GET] /foos/duplicates(或 /foos?filter=duplicates)

返回具有重复标识的 foo 的主体。假设返回 1,2,5(可能是名称)。

然后你可以发出:

[DELETE] /foos 的主体是一个包含 1、2、5(或名称,如果唯一)的数组。删除调用是被动的,因此即使根据 REST 原则缓存 GET 调用也没问题。

不走 REST 路由(例如 POX 或 JOSN RPC over http)也是可能且有效的,但此时意识到它不是 REST。这很好,但你没有得到菲尔丁论文中描述的 REST 的好处。

http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

另外,请阅读:

http://blog.steveklabnik.com/posts/2011-07-03-nobody-understands-rest-or-http

编辑:

在阅读了您澄清的评论后,您将向服务器发送一组对象(不是持久的服务器端)并返回过滤掉欺骗的子集(如服务器端辅助函数),一些选项是:

  1. 如果可能的话,做这个客户端/浏览器端 - 为什么要使用网络往返来过滤掉收集中的欺骗?
  2. 如果由于某种原因只有服务器具有特定的知识/数据来确定两个项目在功能上是等效的(即使数据不完全相同),那么请考虑将数据集发布到服务器,并使用包含唯一/过滤集的响应正文。即使服务器没有持久化该集合,它也会落入一个“临时”对象或集合中,并且服务器正在修改它。从概念上讲,它不是服务器资源的 GET,并且缓存在这种情况下没有任何好处。
于 2012-11-03T22:42:06.003 回答
1

最后一个问题:真正重要的是以一种方式完成工作

  • 正确的
  • 尽可能简单易用
  • 由未来的程序员轻松维护(可能包括您自己)

REST 非常适合对资源进行操作,其中每个 URL 都匹配一些可以操作的对象。它不太适合其他用途,但这些是比实际规则更多的指导方针。其他人指出了关于 REST 的原始论文,但值得记住的是,很少有实现是纯粹的。

如果您有多个 URL 执行这些转换类型的功能,请考虑将它们放在自己的特殊 URL 空间中,例如/api/filterand/api/transliterate等。这将帮助用户和维护者知道某些 URL 不是 REST,而是更像远程过程调用。将数据发布到这些 URL 会导致您返回某种数据。

如果你被特定的名字卡住了,你应该列出一个候选人名单,喝几杯啤酒,然后从名单中选择一个。当我陷入细节问题时,我就是这样做的。

SOAP 是一个简洁的协议并且有它的用途,但它往往非常繁重。与使用任何特定技术相比,良好的文档和一致性对于您萌芽的 API 可能更重要。

于 2012-11-03T21:26:44.820 回答