如何识别可能具有相同标识符的不同资源?

时间:2016-10-28 06:57:35

标签: rest asp.net-web-api restful-architecture api-design

我有以下两个资源需要表示为两个不同的实体(想象它们实际上是两个不同的资源,即来自两个不同数据存储的类似资源):

// Resource 1 from Data source 1:

{
  'id' : 1,
  'foo' : 'asd',
  'bar' : 'cbd', 
  'provider' : 'data_store_1'
}

// Resource 2 from Data source 2:

// lets say 'foo' and 'bar' were patched for this entity 
// to matched the entity definition, (i.e in Data store 2, both
// 'foo' and 'bar' does not map to an existing column )
{
 'id' : 1,
 'foo' : null,   
 'bar' : null ,  
 'provider' : 'data_store_2'
}

由于这两个entites具有相同的标识符(id),因此很难确定哪个只使用ID。

我想到的一件事是修补标识符:

resource 1 => id: 'data_store_1_1' // URI: resource/data_store_1_1
resource 2 => id: 'data_store_2_1' // URI: resource/data_store_2_1

所以我现在可以清楚地识别它们。我也想过为隐藏实现细节或出于美观原因而散列这些值

resource 1 => id: '6c2d2dbc992b435efd7d8e62e3637734' // resource/6c2d2dbc992b435efd7d8e62e3637734 ('data_store_1_1')
resource 2 => id: '4df3bb9d8d520f61a28972a550e6a84c' // resource/4df3bb9d8d520f61a28972a550e6a84c ('data_store_2_1')

问题

这是明确识别这两种资源的可接受方式吗?

2 个答案:

答案 0 :(得分:1)

主要思想是,您公开的资源必须具有唯一标识符(或复合标识符),而不管实现细节如何。虽然@Jose的想法还可以,但它暗示了数据库方面的一些变化。但是你的哈希想法是不可行的 - 哈希是单向函数,所以如果客户端将基于哈希请求资源,你将必须哈希数据库中的所有项目(直到你找到匹配)。

话虽如此,你的第一个想法非常接近。我唯一要改变的就是你将复合标识符连接起来的方式:

资源1 => id:'data_store_1_1'// URI:resource?dataStore=1&id=1

这样,通过使用URI模板(查询字符串),您将在服务器端“按原样”获取这些参数,并且您还可以无缝地强制执行解析/验证(例如,两者都必须是整数),而不是接收字符串,将其拆分为_,然后将结果解析为整数。

答案 1 :(得分:0)

我假设两个数据存储都与一个应用程序相关联。 如果是,请尝试从两个数据存储的单个函数生成GUID作为资源ID,然后可以唯一地标识资源,如:

URI: resource/AD24F6E6C15B4A1FA853D6F78376CC1D