我有以下两个资源需要表示为两个不同的实体(想象它们实际上是两个不同的资源,即来自两个不同数据存储的类似资源):
// 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')
这是明确识别这两种资源的可接受方式吗?
答案 0 :(得分:1)
主要思想是,您公开的资源必须具有唯一标识符(或复合标识符),而不管实现细节如何。虽然@Jose的想法还可以,但它暗示了数据库方面的一些变化。但是你的哈希想法是不可行的 - 哈希是单向函数,所以如果客户端将基于哈希请求资源,你将必须哈希数据库中的所有项目(直到你找到匹配)。
话虽如此,你的第一个想法非常接近。我唯一要改变的就是你将复合标识符连接起来的方式:
资源1 => id:'data_store_1_1'// URI:resource?dataStore=1&id=1
这样,通过使用URI模板(查询字符串),您将在服务器端“按原样”获取这些参数,并且您还可以无缝地强制执行解析/验证(例如,两者都必须是整数),而不是接收字符串,将其拆分为_
,然后将结果解析为整数。
答案 1 :(得分:0)
我假设两个数据存储都与一个应用程序相关联。 如果是,请尝试从两个数据存储的单个函数生成GUID作为资源ID,然后可以唯一地标识资源,如:
URI: resource/AD24F6E6C15B4A1FA853D6F78376CC1D