2013-04-09 92 views
5

我正在创建一个Web服务,我对路径名有一些疑问。如何在RESTful Web服务中的资源中指定操作?命名RESTful路径

例如:测验资源。你有正常的CRUD操作,你也想在测验中做些事情。如产生一个新的测验。这是一个行动。你使用类似/quiz/top5/quiz?type=top5的路径还是什么?

我不明白在创建RESTful服务时如何编写对资源执行操作的路径。

+0

我会使用'/ quiz/generate/123'作为id'123' – 2013-04-09 15:00:08

+0

我会使用'/ quiz/{id}' – 2013-04-09 15:00:41

回答

1

我就从apigee推荐这本电子书:Web API Design: Crafting Interfaces that Developers Love

按照他们的建议:

  • 的语用REST风格的设计排名第一的原则是:保持简单 事情简单。
  • 保持您的基本网址简单直观。
+------------+-------------------+--------------+----------------------------------------+------------------+ 
| Resource | POST create  | GET read  | PUT update        | DELETE delete | 
| /quizzes | Create a new quiz | List quizs | Bulk update quizs      | Delete all quizs | 
| /quizes/12 | Error    | Show Quiz 12 | If exists update Quiz 12, if not Error | Delete Quiz 12 | 
+------------+-------------------+--------------+-----------------------------------------+------------------+ 

关于你想要的顶级目录,也许类似于他们的“分页和部分缓解”一节中勾勒出一个解决方案可满足您的需求:

quizzes/top?limit=5

通过这种方式,您可以首先制作具有默认值(5或10个项目)的资源quizs/top,然后提供分页/更改项目数量的功能。

+0

如果您要遵循该电子书中的指导原则并拥有2个基准网址。你将如何获得由服务器随机生成的新测验?/quize保留列出所有测验(集合)? – LuckyLuke 2013-04-09 17:20:13

+0

我不是在客户端创建它,我只是想从服务器生成一个 – LuckyLuke 2013-04-09 17:25:10

+0

我会去测验/随机(顺便说一句,我要编辑我的帖子来写测验复数 - quizzes-正确:-) – jalopaba 2013-04-09 17:36:58

0

这真的取决于你 - RESTful模式不要求命名约定。

What are the best/common RESTful url verbs and actions?这可能对你有帮助吗?

只要路线合理:例如测验/显示/ {编号},测验/顶部/ {编号}等...

编辑:添加回答评论围绕路线行动命名,取自Rails公约。 http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

+0

那么如何编写在资源上触发“进程”的路径呢?我的意思是像一个动作,而不仅仅是CRUD路径? – LuckyLuke 2013-04-09 15:03:34

+0

查看编辑abouve ... – diagonalbatman 2013-04-09 15:04:21

+0

在另一个答案他说,你应该使用URL来指定对象,而不是动作。嗯...所以你使用“top”指定对象的例子? – LuckyLuke 2013-04-09 15:07:10

0

我推荐阅读这个回答https://stackoverflow.com/a/11170376/300886到类似的问题。

一般来说,你应该考虑你的API的哪些部分应该可以通过GET获得,哪些通过POST获得。通过GET可用的资源通常应该使用名词来描述,动作(比如可能发布测验的答案)应该可以通过使用动词描述的POST(或DELETE,可能)来描述,可能在名词 - 资源的名称之后该行为已被采纳。

0

this文章中所解释的,其更适于使用目录结构作为REST URL。

的URL像/{type}/{operation}/{param1}/{param2}...

看起来更加直观和maitainable(帕拉姆可以作为经典?=,如果他们有太多的传递)

所以在你的情况下,可以/quiz/top/5或者明天应该是前100,则同样能为/quiz/top/100

0

网址识别你的对象被重复使用。 HTTP方法指定服务器应该在对象上执行的动作(或操作)。

例如:

/quiz/top5 
  • HTTP GET:客户端请求查看测验TOP5,这意味着创建一个新的?或者这是否意味着显示一个现有的?这取决于你(GET的惯例是在不改变服务器状态的情况下请求对象)。
  • HTTP POST:客户端请求保存变更
+0

top5部分将意味着动态处理前5个对象的列表。那么这适合识别物体的保护伞?不采取行动? – LuckyLuke 2013-04-09 15:24:16

+0

完全正确。 – Ulises 2013-04-09 15:33:37