3

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

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

大多数 URL 我都清楚,但是许可证需要一些有趣的操作。许可证的基本 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)上根据自己的信息生成的(没有序列号的中央数据库)。

非常感谢!

4

1 回答 1

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

我的问题是: -

  • 这个 URL 方案是“正确”或明智的做法吗?
    • 或者我应该有一个“许可证分配”和“许可证激活”的集合(例如/assignments/{licenceId}/{userId}:)

你建议的方案大多是好的,有一些改动。

  • 我是否遗漏了一些基本的东西(当我读完这本书时可能会清楚)

不,不是。

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

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

于 2012-12-04T14:40:26.973 回答