用于变异实体的RESTful URL

时间:2012-12-04 11:26:27

标签: rest hateoas

我之前开发了一个网络应用程序来授权我们的软件。这有客户,帐户,用户和许可证。许可证分配给用户并使用序列号激活。许可证是作为处理采购订单的输出而创建的,即没有任何直接的方式来发布新许可证。

我正在阅读“RESTful Web Services”,并考虑如何使其成为RESTful(HATEOAS)。

我很清楚网址的大部分内容,但许可证需要一些有趣的操作。许可证的基本URL为/licence/{licenceID}

  • 为用户分配可用许可证(由支持人员完成)
  • 从用户处释放许可证(将其放回可用许可证池中)
  • 使用序列号激活许可证,并返回生成的密钥
  • 重新启用许可
  • 将许可续订到新的到期日
  • 禁用许可证:仅限单向,不可撤销。许可证仍然存在

现在,在REST中,我只能使用标准方法,并且不得在URL中嵌入“分配”操作。我在想的是挑选出我想要影响的许可证部分。这给出了: -

  • 列表:GET /licences/
  • 获取:GET /licences/{licenceID}
  • 分配:POST /licences/{licenceID}/assignee/{userID}
  • 发布:DELETE /licences/{licenceID}/assignee
  • 激活:POST /licences/{licenceID}/serialNumber/{serialNumber}
  • 停用:DELETE /licences/{licenceID}/serialNumber
  • 续订:POST /licences/{licenceID}/expires
  • 禁用:DELETE /licences/{licenceID}/enabled

我的问题是: -

  • 这个URL方案是“正确的”或明智的良好实践方式吗?
    • 或者我应该收集“许可证分配”和“许可证激活”(例如:/assignments/{licenceId}/{userId}
  • 我错过了一些基本的东西(当我完成这本书时可能很清楚)
  • 参数(userId和serialNumber)应该作为路径参数还是查询参数?
    • {userId}是指系统上的用户,因此可以是路径参数
    • {serialNumber}是在客户端(Java Swing)上根据自己的信息生成的(没有序列号的中央数据库)。

非常感谢!

1 个答案:

答案 0 :(得分:2)

  • 列表:GET /licences/

很好,虽然我会自己使用GET /licences:)

  • 获取:GET /licences/{licenceID}

看起来不错

  • 分配:POST /licences/{licenceID}/assignee/{userID}

我建议这会适得其反,除非许可证可分配给多个被许可人。相反,我建议

PATCH /licences/{licenceID}
{ assignee={userID} }

PUT /licences/{licenceID}/assignee
{userID}

选择哪个应取决于许可的受让人更改的频率。如果经常使用后一个选项,如果不经常使用前者。

  • 发布:DELETE /licences/{licenceID}/assignee

好。如果你使用它,那么你应该使用前面给出的两个存储选项中的第二个。如果您选择了第一个,那么类似:

PATCH /licences/{licenceID}
{ assignee=NULL }
  • 激活:POST /licences/{licenceID}/serialNumber/{serialNumber}
  • 停用:DELETE /licences/{licenceID}/serialNumber
  • 续订:POST /licences/{licenceID}/expires

您可以将这三种方法视为您为受让人决定的方式,以使您的客户更轻松。

  • 禁用:DELETE /licences/{licenceID}/enabled

我建议:

> DELETE /licences/{licenceID}
< 201 Created
< Location: /disabled-licenses/{licenseID}

然后,URI名称空间/许可证将映射到您的域模型licenses WHERE valid==true,而/ disabled-licenses将映射到licenses WHERE valid==false。这没什么不对。然后,可以在HTTP级别(即通过URI路径)而不是在应用程序级别(通过检查数据库中的字段值)限制对无效许可证的访问。

我的问题是: -

  • 这个URL方案是“正确的”或明智的良好实践方式吗?
    • 或者我应该收集“许可证分配”和“许可证激活”(例如:/assignments/{licenceId}/{userId}

您建议的方案主要是好的,有一些改动。

  • 我错过了一些基本的东西(当我完成这本书时可能很清楚)

不,不是真的。

  • 参数(userId和serialNumber)应该作为路径参数还是查询参数?
    • {userId}是指系统上的用户,因此可以是路径参数
    • {serialNumber}是在客户端(Java Swing)上根据自己的信息生成的(没有序列号的中央数据库)。

同样,如果许可证只有一个用户ID和一个序列号,那么它们的值是资源属性和/或子资源。如果建模为子资源,它们属于URI,如果属性,则属于正文。