用于资源关联的REST Api

时间:2015-02-26 18:41:51

标签: api rest api-design

尝试为系统建模REST接口我发现很难看出什么是最好的方法。

考虑使用类型resource的实体和描述其关联的另一个实体:resourceAssoc。关联可以是n类型,但这并不重要。

resource的情况下,api将是微不足道的:

/resources 
/resource/{resource_id}

resourceAssoc考虑它的标识符的最佳方法是:PK(from_resource_id, to_resource_id, association_type)

2 个答案:

答案 0 :(得分:0)

我不确定客观上是否是最好的'回答这里。有许多方法可以遵循REST原则。话虽如此,我建议:

/{association_type}/{from_resource_id}/{to_resource_id}

或者,如果基于关联类型不够清楚:

/association/{association_type}/{from_resource_id}/{to_resource_id}

编辑:

根据您的评论,这样的事情可能更合适:

/associations/from/{from_resource_id}/to/{to_resource_id}

/associations/to/{to_resource_id}

那将是最明确的。我认为这里有很多创造空间。很大程度上取决于您是否希望人们自己键入这些内容或创建自己的路径,而不是将其从API的其他部分中提取出来。

答案 1 :(得分:0)

我希望我的回答会提供一些提示,因为我不太确定你的问题; - )

事实上,我看到有关REST URL和响应内容的以下可能性:

  • <强> /资源/ {RESOURCE_ID} /协会/

    [
      {
        "toResourceId": "resourceid1",
        "associationKind": "kind1",
        (...)
      },
      {
        "toResourceId": "resourceid2",
        "associationKind": "kind2",
        (...)
      }
      (...)
    ]
    
  • <强> /资源/ {RESOURCE_ID} /协会/ {to_resource_id}

    [
      {
        "associationKind": "kind1",
        (...)
      },
      {
        "associationKind": "kind2",
        (...)
      }
      (...)
    ]
    
  • <强> /资源/ {RESOURCE_ID} /协会/ {to_resource_id}

    {
      (...)
    }
    

以下介绍了新的根资源路径associations。在这种情况下,您可以独立于具有根路径resources的资源管理关联。

  • <强> /协会/ {from_resource_id},{to_resource_id} /

    [
      {
        "fromResourceId": "resourceid1",
        "toResourceId": "resourceid2",
        "kind": "kind1",
        (...)
      },
      (...)
    ]
    
  • <强> /协会/ {from_resource_id},{to_resource_id} / {种类}

    {
      "fromResourceId": "resourceid1",
      "toResourceId": "resourceid2",
      "kind": "kind1",
      (...)
    }
    

请注意,您可以对这些URL应用多种HTTP方法来获取内容,但也可以对其进行管理(更新,删除)。

我认为您还可以考虑只选择具有根路径resources的资源并管理有效负载内的关联direclty。

以下是一个示例:

GET /resources/<resource_id>/associations/
[
    {
        "toResourceId": "resourceId1",
        "kind": "kind"
        (...)
    },
    {
        "toResourceId": "resourceId2",
        "kind": "kind"
        (...)
    },
    (...)
]

要管理这些关联,您可以实现描述要更新内容的方法PATCH

PATCH /resources/<resource_id>/associations/
[
    { "action": "add", "toResourceId":"resourceId1","kind":"kind1" (...) },
    { "action": "delete", "toResourceId":"resourceId2","kind":"kind2" (...) },
]

此链接可以帮助您实现此方法:http://williamdurand.fr/2014/02/14/please-do-not-patch-like-an-idiot/

要完成,我们可以注意到OData技术支持元素之间的关系及其功能“导航链接”,但没有关联类型的概念。

希望它可以帮到你, 亨利