REST设计:用于过滤服务的动词和资源名称

kab*_*ros 4 rest webserver http restful-architecture

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

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

  2. 定义Service接口的好方法是什么?命名资源/清理或/过滤器似乎很奇怪主要是因为在我看到的在线示例中,它始终是名称而不是用于资源名称的动词.

  3. Am I right to feel that REST services are better suited for CRUD operations and you start bending the rules in situations like this service? If yes, am I then making a wrong architectural choice.

  4. I've pushed to develop this service in REST-ful style (as opposed to SOAP) for simplicity, but such awkward cases happen a lot and make me feel like I am missing something. Either choosing REST where it shouldn't be used or may be over-thinking some stuff that doesn't really matter? In that case, what really matters?

bry*_*mac 5

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

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

很难给出确切的指导,因为问题不明确但希望RESTful原则上的指导和思想能让你走上正轨.如果你澄清确切的电话,我会尝试推荐API.

所以,假设你想清理复制的foos.

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

返回一个标识为重复的foos的主体.假设返回1,2,5(可能是名称).

然后你可以发出:

[DELETE]/foos,正文是一个包含1,2,5(或名称,如果唯一)的数组.删除调用是被动的,所以即使根据REST原则缓存GET调用也没关系.

通过http而不是REST路由(例如POX或JOSN RPC)也是有效的,但只是意识到它不是REST.这很好,但是你没有从fielding的论文中获得REST的好处.

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

另外,请阅读:

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

编辑:

在阅读了你澄清的评论之后,你发送服务器的是一组对象(不是持久的服务器端),并且它返回了带有dupes的子集(如服务器端辅助函数),一些选项是:

  1. 如果可能,请执行此客户端/浏览器端 - 为什么要通过网络往返来过滤掉收集中的欺骗?
  2. 如果由于某种原因,只有服务器具有特定的知识/数据来确定两个项是功能等效的(即使数据不完全相同),则考虑将数据集POST到服务器,其响应主体包含唯一/过滤集.即使服务器没有持久化该集合,它也会落入"临时"对象或集合中,服务器正在对其进行修改.从概念上讲,它不是服务器资源的GET,而缓存在这种情况下没有任何好处.