命名 RESTful 路径

Posted

技术标签:

【中文标题】命名 RESTful 路径【英文标题】:Naming RESTful paths 【发布时间】:2013-04-09 14:58:15 【问题描述】:

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

例如:测验资源。您有正常的 CRUD 操作,并且您还想对测验做一些事情。比如生成一个新的测验。那是一个动作。你使用/quiz/top5/quiz?type=top5 之类的路径还是什么?

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

【问题讨论】:

我会使用 /quiz/generate/123 作为 id 123 我会使用/quiz/id 【参考方案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   |
+------------+-------------------+--------------+-----------------------------------------+------------------+

关于您想要的***列表,也许类似于他们在“分页和部分响应”部分中概述的解决方案可能适合您的需求:

quizzes/top?limit=5

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

【讨论】:

如果您要遵循该电子书中的指南并拥有 2 个基本 URL。您将如何获得由服务器随机生成的新测验? /quizes 是否保留用于列出所有测验(集合)? 我不是在客户端创建它,我只想从服务器生成一个 我会参加测验/随机(顺便说一句,我要编辑我的帖子以正确编写测验复数 -quizzes- :-) 但是你会违背他们的建议吗? 我想我并没有违背他们的建议(至少在广义上):集合的第一个元素(测验),集合中特定元素的第二个元素(随机 = 随机测验只是生成)。该资源的特殊之处在于每次从服务器获取它时都会发生变化(但当有人读取“随机”时很明显)。【参考方案2】:

这是你喜欢的。我个人喜欢 last.fm API 的工作方式:

http://www.last.fm/api/intro

但是,如果您正在寻找一些不错的标准,请查看以下帖子:

What are the best/common RESTful url verbs and actions?

How to create REST URLs without verbs?

【讨论】:

【参考方案3】:

这完全取决于您 - RESTful 模式不规定命名约定。

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

只要让路线合理:例如quiz/show/id, quiz/top/number 等...

编辑:添加对路由操作命名评论的答案,取自 Rails 约定。 http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

【讨论】:

那么如何编写触发资源“进程”的路径呢?我的意思是像一个动作,而不仅仅是 CRUD 路径? 在另一个答案中,他说您应该使用 URL 来指定对象,而不是操作。嗯...所以您使用“顶部”指定对象的示例? 看这真的取决于您希望您的应用程序如何工作......您希望用户如何与您的 API 进行交互? 假设有许多不同类型的测验,例如“随机测验”,您将如何为此创建路径?获取... 所以如果你想显示一个名为“randomquiz”的测验,你会做 GET /quizes/randomquiz 如果你想创建一个“随机测验”,你会发帖到 /quizes【参考方案4】:

按照this 文章中的说明,最好对 REST URL 使用 类似目录的结构

类似/type/operation/param1/param2... 的网址

看起来更直观和可维护(参数太多可以作为经典?=传递)

所以在你的情况下它可以是/quiz/top/5,或者如果明天它应该是top 100,那么可以像/quiz/top/100一样重复使用

【讨论】:

【参考方案5】:

URL 标识您的对象。 HTTP 方法指定服务器应该对对象执行的操作(或操作)。

例如:

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

【讨论】:

top5 部分意味着动态处理前 5 个对象的列表。所以这适合识别对象的保护伞吗?不行动?【参考方案6】:

我建议阅读此答案https://***.com/a/11170376/300886 来回答类似的问题。

一般来说,您应该考虑 API 的哪些部分应该可以通过 GET 访问,哪些可以通过 POST 访问。通过 GET 获得的资源通常应该用名词来描述,动作(比如可能发布一个测验的答案)应该通过 POST(或者 DELETE,也许)使用动词来描述,也许在名词之后 - 资源的名称正在采取行动。

【讨论】:

以上是关于命名 RESTful 路径的主要内容,如果未能解决你的问题,请参考以下文章

restful 架构风格的curd(增删改查)

RESTful 设计,如何在 CRUD 等之外命名页面?

Restful API 命名约定 [关闭]

RESTFUL API 中“操作”的命名约定

从 WCF RESTful 响应中删除 xml 命名空间

面试官:你连RESTful都不知道我怎么敢要你?