【问题标题】:Confusion Between Noun vs. Verb in Rest URLsRest URL中名词与动词之间的混淆
【发布时间】:2015-01-23 03:55:28
【问题描述】:

我在互联网上研究了关于 url 模式中的名词而不是动词的 restful API,但现在我看到多个链接在 URL 中使用动词。

这是一个例子。

  • POST /v1/payments/authorization//capture
  • POST /v1/payments/authorization//void
  • POST /v1/payments/authorization//reauthorize

这是 Paypal api。 PayPal API

在 HTATEOAS 页面上的维基百科上,他们也举了一个例子;

<?xml version="1.0"?>
<account>
   <account_number>12345</account_number>
   <balance currency="usd">100.00</balance>
   <link rel="deposit" href="/account/12345/deposit" />
   <link rel="withdraw" href="/account/12345/withdraw" /> 
   <link rel="transfer" href="/account/12345/transfer" />
   <link rel="close" href="/account/12345/close" />
 </account>

链接:维基HATEOAS

谁能帮我弄清楚这一点?为什么 'capture'、'void'、'deposit'、'withdraw'、'close' 在 URI 中,因为它们都是动词而不是名词?

或者在rest-full apis url中使用这些词可以吗?

【问题讨论】:

    标签: rest restful-url


    【解决方案1】:

    来自REST API Design Rulebook 的一些关于不同资源类型的sn-ps:

    文档

    文档资源是一个类似于对象实例或数据库的单一概念 记录。

    示例: http://api.soccer.restapi.org/leagues/seattle/teams/trebuchet

    收藏

    集合资源是服务器管理的资源目录。客户可以提出 要添加到集合中的新资源。但是,这取决于收藏品的选择 是否创建新资源。

    例如:http://api.soccer.restapi.org/leagues/seattle/teams

    商店

    存储是客户端管理的资源存储库。存储资源让 API 客户端放置 资源,将它们取出,并决定何时删除它们。就他们自己而言,商店 不创造新资源;因此商店永远不会生成新的 URI。相反,每个 存储的资源有一个 URI,该 URI 由客户端在最初放入 商店。

    示例:PUT /users/1234/favorites/alonso

    控制器

    控制器资源对程序概念进行建模。控制器资源就像可执行函数,有参数和返回值;输入和输出。

    与使用 HTML 表单的传统 Web 应用程序一样,REST API 依赖于控制器 执行无法在逻辑上映射到的特定于应用程序的操作的资源 标准方法之一(创建、检索、更新和删除,也称为 CRUD)。

    控制器名称通常显示为 URI 路径中的最后一段,没有子 在层次结构中跟随它们的资源。

    示例:POST /alerts/245743/resend

    根据书中的定义,您发布的 URI 可能属于 Controller 资源类型,本书稍后指出:

    规则:控制器名称应使用动词或动词短语

    例子:

    • http://api.college.restapi.org/students/morgan/register
    • http://api.example.restapi.org/lists/4324/dedupe
    • http://api.ognom.restapi.org/dbs/reindex
    • http://api.build.restapi.org/qa/nightly/runTestSuite

    其他命名规则,只是为了完整性

    • 规则:文档名称应使用单数名词
    • 规则:集合名称应使用复数名词
    • 规则:商店名称应使用复数名词

    【讨论】:

    • 这本书的作者可能有这样的看法,RPC 没问题。他们甚至可能将 RPC 称为“控制器资源”。但我不同意这是一个很好的建议,因为在这样的 URI 上没有资源可以使用其他 HTTP 动词进行操作。 GET /.../reindex 毫无意义,这是一个强有力的指标,表明整个 URL 毫无意义。
    • @LutzHorn 这本书并没有暗示应该使用GET /../reindex。我不想引用所有内容,但其含义是使用 POST。 GET 应该用于 CRUD 检索操作,书中明确指出不应由控制器定义
    • 所以这样的控制器不是 REST 意义上的资源。我投票反对这个概念。
    • @LutzHorn 但是您所描述的是CRUD(创建)操作。我在询问“无法在逻辑上映射到 CRUD” 的操作。上面的控制器示例 URI 表示 "..resource,它允许客户端向用户重新发送警报"。您对此有何看法?
    • 听起来有些评论者拒绝将“控制器”资源类型作为 REST API 的一部分的概念,因为它不适合 CRUD 模型。但这是说只有 CRUD API 是“好”的,而任何超出 CRUD 的都是“坏”的吗?我了解不受约束的 RPC 模型会出现的问题,但我不确定我是否接受 CRUD 模型是所有问题的答案。更详细地说明何时可以使用“控制器资源”会很有用。
    【解决方案2】:

    诀窍是让它成为所有与 CRUD 动词一起操作的名词(或实体)。

    所以不是;

    POST /v1/payments/authorization/<Authorization-Id>/capture
    POST /v1/payments/authorization/<Authorization-Id>/void
    POST /v1/payments/authorization/<Authorization-Id>/reauthorize
    

    这样做;

    capture -> POST /v1/payments/authorization/
    void    -> DELETE /v1/payments/authorization/<Authorization-Id>
    reauthorize -> delete first then capture again.
    

    【讨论】:

    • 赞成不是因为这种方式“RESTful”,而是更优雅。
    【解决方案3】:

    在 REST 中,动词是 HTTP 方法。在您的示例中,它是 POST,但也可以是 GETPUTDELETE

    名词是由 URL 标识的资源。在您的示例中,“名词”是/v1/payments/authorization/&lt;Authorization-Id&gt;/capture 等。

    如您所见,这并不是一个真正的名词,因为capture 是一个动词:捕获支付授权。这不是 RESTful,因为它是一个命令、一个动词,而不是一个事物、一个名词。

    更好的方法是将这些命令建模为/v1/payments/authorization/&lt;Authorization-Id&gt;/capturecommand 之类的东西。这个命令将是一个事物,一个名词。它可以有状态,例如它是否成功,结果是什么等。

    有很多代码声称是 RESTful 的,但实际上并非如此。

    【讨论】:

    • 我特别喜欢最后的陈述:&gt; There is a lot of code out there that claims to be RESTful and isn't.
    • 我不同意。当你开始无缘无故地命名动词时,这是一个好兆头,你可能想要休息一下,喘口气,并提醒自己这些规则是为你的代码制定的,而不是相反。
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    相关资源
    最近更新 更多