用于变异实体的RESTful URL
我前段时间开发了一个用于授权我们的软件的网络应用程序。这有客户,帐户,用户和许可证。许可证分配给用户并通过序列号激活。许可证是作为处理采购订单的输出而创建的,即没有任何直接发布新许可证的方式。用于变异实体的RESTful URL
我在阅读“REST风格的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)应该作为路径参数还是查询参数?
- {用户id}指的是系统上的用户,这样可以从它自己的信息(无序列号的DB中心)的路径参数
- {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 WHERE valid==true
和/禁用的许可证将映射到licenses WHERE valid==false
。这没什么错。然后,可以在HTTP级别(即通过URI路径)而不是在应用程序级别(通过检查数据库中的字段值)来限制对无效许可证的访问。
我的问题是: -
- 这是URL方案做的“正确”或明智的良好做法呢?
- 或者我应该有“许可证分配”和“许可证激活”(例如:
/assignments/{licenceId}/{userId}
)集合
- 或者我应该有“许可证分配”和“许可证激活”(例如:
你建议的方案主要是一些改动不错。
- 我失去了一些基本的东西(当我读完这本书也许清楚)
没有,真的没有。
- 参数(userId和serialNumber)应该作为路径参数还是查询参数?
- {用户id}指的是系统上的用户,这样可以从它自己的信息(无序列号的DB中心)的路径参数
- {SERIALNUMBER}在客户(的Java Swing)产生。
再次,如果许可证仅具有一个用户ID和一个序列号,那么这些的值是资源属性和/或子资源。如果建模为子资源,则它们属于URI,如果属性,则属于主体。