用于变异实体的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,如果属性,则属于主体。