我正在尝试为具有设备的新服务的REST路径定义API,其中每个设备都具有当前位置。
要了解该问题,需要一些背景知识:
背景非常重要。现在介绍API设计。如上所述,我可能会获得仅知道Mac地址的位置更新,并且我可能会获知唯一设备ID的位置更新。在这两种情况下,我都可以假设我获得的ID是唯一的,从理论上讲,我可以说mac地址x属于设备y。实际上,这意味着我对我的位置REST API有一个非唯一索引:
例如,假设我有一台ID为“ 123”的设备,并且有两个mac地址为“ abc”和“ xyz”。通常,我的REST API路径会将唯一设备下的位置分组:
/devices/$id/location
现在的问题是,存在多个(唯一)ID,但是每个ID与一个相同的设备相关。
例如,这将通过智能手机的唯一设备ID(我知道该唯一ID,但不知道界面的MAC地址)来推送位置:
PUT /devices/123/location
这是仅知道mac地址的外部系统正在使用mac地址作为键来推送位置更新的地方:
PUT /devices/abc/location
PUT /devices/xyz/location
您可以假设在内部可以将mac地址和唯一的设备ID关联到一个唯一的内部设备。我可以使用mac地址和设备ID更新并返回位置和设备信息。
例如,以下使用唯一设备ID或唯一mac的GET请求将返回相同的位置对象:
GET /devices/123/location
GET /devices/abc/location
GET /devices/xyz/location
但是这是有效的REST设计,在其中我可以有多个路径访问同一资源吗?我是否应该更改我的REST路径,以及如何更改?
答案 0 :(得分:1)
考虑如何设计一个支持这种行为的网站可能会很有用...
您可以通过以下方式设计该协议:客户端加载已知的书签URI。该页面的表示形式中有两个链接,一个链接用于知道mac地址的客户端,另一个链接用于那些知道标识符的客户端。客户将选择适当的链接来关注。这样返回的表示形式将是针对特定用例定制的表格;表单说明将指定期望的字段。客户将填写已知字段(忽略任何可能具有合理默认值的未知字段),然后提交表单。浏览器将使用标准处理规则为表单中指定的操作生成适当的HTTP请求。
在这种情况下,如果我们感兴趣的是(有效地)根据所拥有的信息查找所需资源的URI,则通常将GET
用作form方法。这样会将查询发送到服务器,然后服务器可以从那里通信(也许通过重定向)用于该设备的适当URI。
一旦使用了正确的URI,GET / PUT / POST / PATCH / DELETE就应该可以正常工作。
这是有效的REST设计,我可以在其中拥有指向同一资源的多个路径吗?
如果标识符不同,则资源也不同。当然,您可以拥有多个表达某个概念的资源(或者换句话说,可以允许两个不同的resources共享一个语义映射)。
对于您的特定情况,可以为通过id知道设备的客户端提供一个资源,并为通过位置知道设备的客户端提供一个资源。但是,在两种情况下共享单个资源标识符可以简化服务器端的缓存过程。
REST的一部分:如果您仔细定义媒体类型和关系,则服务器应该能够更改使用的缓存策略而不会破坏任何客户端(因为客户端只是在跟踪链接并提交服务器提供的表单) )。