命名RESTful路径

5

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

例如:一种Quiz资源。您需要进行普通的CRUD操作,还要对测验进行一些其他操作,例如生成新的测验。这就是一个动作。您是否使用/quiz/top5/quiz?type=top5之类的路径?

我不理解如何编写可以在RESTful服务中执行资源操作的路径。


我会使用/quiz/generate/123来代表id为123 - Aram Kocharyan
我会使用/quiz/{id} - burning_LEGION
6个回答

1
我建议您阅读来自apigee的这本电子书:Web API Design:Crafting Interfaces that Developers Love
遵循他们的建议:
  • 务实RESTful设计中的首要原则是:保持简单。
  • 保持您的基本URL简单和直观。
+------------+-------------------+--------------+----------------------------------------+------------------+
| 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   |
+------------+-------------------+--------------+-----------------------------------------+------------------+
关于您想要的排行榜,也许类似于“分页和部分响应”部分中概述的解决方案可能适合您的需求: < p > < code > quizzes / top?limit = 5 使用此方法,您可以首先创建一个资源 < code > quizs / top ,其中包含默认值(5或10个项目),然后提供分页/更改项目数量的功能。

如果您按照该电子书中的指南并拥有2个基本URL,那么您将如何从服务器获取新的随机生成的测验?/quizes是否保留用于列出所有测验(集合)? - LuckyLuke
我不是在客户端创建它,我只想从服务器生成一个。 - LuckyLuke
我会选择随机测试(顺便说一下,我将编辑我的帖子以正确地写出quiz的复数形式 - quizzes :-) - jalopaba
但是你会违背他们的建议吗? - LuckyLuke
我认为我没有违反他们的建议(至少在广义上):集合(测验)的第一个元素,集合中特定元素的第二个元素(随机=刚生成的随机测验)。该资源的特殊之处在于每次从服务器获取时都会更改(但当有人阅读“随机”时,这一点是清楚的)。 - jalopaba

1

0

那么,你如何编写触发资源上的“进程”的路径呢?我的意思是像一个动作,而不仅仅是CRUD路径? - LuckyLuke
在另一个回答中,他说应该使用URL来指定对象,而不是动作。嗯...所以你使用"top"来指定对象的例子呢? - LuckyLuke
看起来这取决于您希望应用程序如何工作... 您希望用户如何与您的API进行交互? - diagonalbatman
假设有许多不同类型的测验,例如“随机测验”,您将如何为其创建路径?GET ... - LuckyLuke
如果您想展示一个名为“randomquiz”的测验,您需要执行 GET /quizes/randomquiz。 如果您想创建一个“随机测验”,您需要向 /quizes 发送一个 post 请求。 - diagonalbatman
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/27876/discussion-between-diagonalbatman-and-luckyluke - diagonalbatman

0

我建议阅读这个类似问题的答案https://dev59.com/inRA5IYBdhLWcg3w8SeJ#11170376

一般来说,您应该考虑哪些部分的API应该通过GET可用,哪些通过POST可用。 通过GET可用的资源通常应使用名词进行描述,而动作(例如回答测验)应该通过POST(或DELETE,也许)进行描述,可以在名词之后使用动词,可能是在执行操作的资源名称之后。


0

最好使用像目录一样的结构来构建REST URL,就像this文章中所解释的那样。

/{type}/{operation}/{param1}/{param2}...这样的URL

看起来更直观和易于维护(如果参数太多,可以使用经典的?=传递参数)

因此,在您的情况下,它可以是/quiz/top/5,或者如果明天应该是前100名,则可以重复使用相同的/quiz/top/100


0

URLs识别您的对象。 HTTP方法指定服务器应在对象上执行的操作(或操作)。

例如:

/quiz/top5
  • HTTP GET: 客户端请求查看前五名的测验,这意味着创建一个新的测验吗?还是显示现有的测验?由您决定(GET 的约定是在不改变服务器状态的情况下请求对象)。
  • HTTP POST: 客户端请求持久化更改。

“Top5” 部分指的是动态处理前五个对象的列表。这符合识别对象的范畴吗?而不是行为? - LuckyLuke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接