具有多个ID的资源的REST路径设计

时间:2019-05-28 10:08:50

标签: rest

我正在尝试为具有设备的新服务的REST路径定义API,其中每个设备都具有当前位置。

要了解该问题,需要一些背景知识:

  • 这是关于将当前设备位置推送到中央服务器
  • 位置更新有时会在设备本身(GPS)上进行计算,然后从设备(智能手机)发送到服务器,但有时也会通过外部服务(例如WiFi定位系统)从该系统发送到服务器 li>
  • 每个设备都有智能手机知道的唯一ID。 WiFi定位系统无法知道此ID,仅知道WiFi Mac地址。
  • 每个设备都有几个用于位置更新(mac地址)的接口
  • 无论接口位置更新来自哪里/来自何处,所有位置数据都应链接到相同的唯一设备ID

背景非常重要。现在介绍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路径,以及如何更改?

1 个答案:

答案 0 :(得分:1)

考虑如何设计一个支持这种行为的网站可能会很有用...

您可以通过以下方式设计该协议:客户端加载已知的书签URI。该页面的表示形式中有两个链接,一个链接用于知道mac地址的客户端,另一个链接用于那些知道标识符的客户端。客户将选择适当的链接来关注。这样返回的表示形式将是针对特定用例定制的表格;表单说明将指定期望的字段。客户将填写已知字段(忽略任何可能具有合理默认值的未知字段),然后提交表单。浏览器将使用标准处理规则为表单中指定的操作生成适当的HTTP请求。

在这种情况下,如果我们感兴趣的是(有效地)根据所拥有的信息查找所需资源的URI,则通常将GET用作form方法。这样会将查询发送到服务器,然后服务器可以从那里通信(也许通过重定向)用于该设备的适当URI。

一旦使用了正确的URI,GET / PUT / POST / PATCH / DELETE就应该可以正常工作。

  

这是有效的REST设计,我可以在其中拥有指向同一资源的多个路径吗?

如果标识符不同,则资源也不同。当然,您可以拥有多个表达某个概念的资源(或者换句话说,可以允许两个不同的resources共享一个语义映射)。

对于您的特定情况,可以为通过id知道设备的客户端提供一个资源,并为通过位置知道设备的客户端提供一个资源。但是,在两种情况下共享单个资源标识符可以简化服务器端的缓存过程。

REST的一部分:如果您仔细定义媒体类型和关系,则服务器应该能够更改使用的缓存策略而不会破坏任何客户端(因为客户端只是在跟踪链接并提交服务器提供的表单) )。