【问题标题】:How to Identify Distinct Resources that Might Have the Same Identifier?如何识别可能具有相同标识符的不同资源?
【发布时间】:2016-10-29 16:10:41
【问题描述】:

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

// 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'
}

由于这两个实体具有相同的标识符(即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')

问题

这是区分这两种资源的一种可接受的方式吗?

【问题讨论】:

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


    【解决方案1】:

    主要思想是,无论实现细节如何,您公开的资源都必须具有唯一标识符(或复合标识符)。虽然@Jose 的想法没问题,但它意味着数据库方面的一些变化。但是,您的散列想法不可行 - 散列是一种单向函数,因此如果客户端将基于散列请求资源,则您必须对数据库中的所有项目进行散列(直到找到匹配项)。

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

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

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

    【讨论】:

      【解决方案2】:

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

      URI: resource/AD24F6E6C15B4A1FA853D6F78376CC1D
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-22
        • 2012-08-23
        • 2018-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多