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