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

我现在正在阅读“ RESTful Web服务”,并正在考虑如何使其成为RESTful(也包括HATEOAS)。

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


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


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


清单: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)上根据其自身的信息(没有序列号的中央数据库)生成的。



非常感谢!

最佳答案

清单: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,如果属于属性,则属于主体。

关于rest - 用于更改实体的RESTful URL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13701828/

10-10 22:30