首页 文章

在URL中使用动词从根本上与REST不兼容吗?

提问于
浏览
42

因此,假设我们有一些似乎不能最好地表示为资源的东西(我们想要暂停的进程状态,我们想要在服务器上执行的无状态计算等) .

如果在API设计中我们使用 process/123/pausecalculations/fibonacci - 这与REST根本不兼容吗?只要这些URL可以使用HATEOAS发现并且媒体类型是标准化的,那么到目前为止,我似乎没有看到它 .

或者我是否应该像回答here那样在消息中添加操作?

Note 1:
我确实理解我可以用名词来重新描述我的一些例子 . 但是我觉得,对于特定情况,名词不像动词那样有效 . 所以我试图理解是否有这些动词会立即取消 . 如果是,那么为什么推荐是如此严格,以及在这些情况下不遵循它可能会让我感到遗憾 .

Note 2:
回答"REST does not have any constraints on that"将是一个有效的答案(这意味着这种方法是RESTful) . 答案"it depends on who you ask"或"it is a best practice"并没有真正回答这个问题 . 这个问题假定REST的概念存在于一个明确定义的常用术语中,两个人可以使用它来引用同一组约束 . 如果假设本身不正确并且REST的正式讨论毫无意义,请说出来 .

4 回答

  • 4

    它并不严格关于名词与动词的关系;这是关于你是否:

    • 识别资源

    • 通过表示来操纵资源

    什么是资源?菲尔丁如此定义:

    REST中信息的关键抽象是一种资源 . 可以命名的任何信息都可以是资源:文档或图像,临时服务(例如“洛杉矶的今天天气”),其他资源的集合,非虚拟对象(例如人)等等 . 换句话说,任何可能是作者超文本引用目标的概念都必须符合资源的定义 . 资源是对一组实体的概念映射,而不是与任何特定时间点的映射相对应的实体 . “

    现在,问你的问题 . 你可以真正重要的一点 . 更重要的是,URL process/123/pausecalculations/fibonacci 通过上述定义来识别资源 . 如果他们这样做,那么就没有违反REST的统一接口约束 . 您的示例让我相信它不符合资源定义,因此会违反此约束 .

    要说明此系统中的资源可能是什么,您可以通过将其POST到 paused-processes 资源集合来更改进程的状态 . 虽然这可能是处理进程的一种不寻常的方式,但它与REST架构风格并没有根本的不兼容 .

    在计算的情况下,计算本身可能是资源,该资源可能如下所示:

    Request:
    GET /calculations/5
    
    Response:
    {
      fibonacci: 5,
      prime-number: true,
      square-root: 2.23607
    }
    

    尽管如此,这是一个有点不同寻常的资源概念 . 我想稍微更典型的用法可能如下所示:

    Request:
    GET /stored-calculations/12381728 (note that URL is a random identifier)
    
    Response:
    {
      number: 5,
      fibonacci: 5,
      prime-number: true,
      square-root: 2.23607
    }
    

    虽然大概你想存储关于该资源的其他信息,而不是任何人都可以用计算器进行的计算......

    Response:
    {
      number: 5,
      fibonacci: 5,
      prime-number: true,
      square-root: 2.23607,
      last-accessed-date: 2013-10-28T00:00:00Z,
      number-of-retrievals-of-this-resource: 183
    }
    
  • 24

    这篇文章有一些很好的提示:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

    引用文章:

    那些不适合CRUD操作世界的行为呢?这是事情变得模糊的地方 . 有许多方法:将操作重组为显示为资源字段 . 如果操作不采用参数,则此方法有效 . 例如,激活动作可以映射到布尔激活的字段,并通过PATCH更新到资源 . 将其视为具有RESTful原则的子资源 . 例如,GitHub的API让你用PUT / gists /:id / star和unstar与DELETE / gists /:id / star加注 . 有时你真的无法将动作映射到合理的RESTful结构 . 例如,多资源搜索实际上没有意义应用于特定资源的 endpoints . 在这种情况下,/搜索将是最有意义的,即使它不是名词 . 这没关系 - 只需从API使用者的角度做正确的事情,并确保明确记录以避免混淆 .

    我个人喜欢建议#2 . 如果你需要暂停某些事情,你还在暂停什么?如果它是一个带有名称的进程,那么试试这个:

    /process/{processName}/pause
    
  • 25

    在REST API中使用动词被认为是不好的做法 .

    有一些材料SO和其他地方为什么以及如何避免使用动词 . 话虽这么说,有很多_b34136_ API使用动词 .

    对于 process API,我会让资源Process有一个 state 字段,可以使用 PUT 进行修改 .

    假设 GET /process/$id 当前返回:

    {
       state: "PAUSED"
    }
    

    然后你 PUT 这到 /process/$id

    {
       state: "RUNNING"
    }
    

    这使得流程改变了状态 .

    在Fibonacci的情况下,只需要一个名为 fibonacci 的资源,并使用带有参数的 POST (比如n代表前n个斐波那契数字),或者甚至可以使用URL中的查询 GET .

  • 0

    HTTP方法是动词:GET,PUT,POST等,而URL应始终引用名词(动作的接收者) . 可以这样想:句子中的两个动词是否有意义? "GET calculate"是无意义的,其中"GET state"是好的,"GET process"更好("state"是进程的元数据) .

相关问题