【问题标题】:Posting data with relationships to a REST API将具有关系的数据发布到 REST API
【发布时间】:2016-05-19 07:43:10
【问题描述】:

我正在创建一个 API,我需要创建一个定义为的帖子:

{
  "Title": "Blog first post",
  "Body": "Some body text for the post",
  "PublishedAt": "2016-02-08",
  "Category": {
    "Id": "20",
    "Name": "Travel"
  },
  "Tags": [
    { "Id": "12", "Name": "Vacation" },
    { "Id": "18", "Name": "Beach" }
  ]
}

您会向 API 发布什么内容?以下?

{
  "Title": "Blog first post",
  "Body": "Some body text for the post",
  "PublishedAt": "2016-02-08",
  "Category": {
    "Id": "20",
  },
  "Tags": [
    { "Id": "12" },
    { "Id": "18" }
  ]
}

或者您会按照以下步骤进行:

POST /category/20/posts

POST /posts/recently-created-post-id/tags  >> Add tags one by one?

但是当整个数据都准备好发布时该怎么办?

REST API 中这种情况的标准是什么?

【问题讨论】:

    标签: angularjs api rest asp.net-web-api


    【解决方案1】:

    取决于您希望如何呈现您的 API 以及您希望它有多彻底。考虑到您的模型,我会执行以下操作。

    我会在 POST /posts 有一个端点,并会发送整个帖子模型。

    我还会在 POST /posts/{id}/tags 有一个端点,以允许在创建帖子后提交标签。因此,对 POST /posts/{id}/tags 的调用将收到以下内容:

    { "Id" : 12 }
    

    为简单起见,许多人会建议您只坚持一个级别,这意味着您将为 PUT /posts/{id}PATCH /posts/{ 创建一个端点id} 并通过这些端点提交您的新标签。 PUT 请求将提交您在 POST 中使用的完整正文以及任何新标签。 PUT 的目的是用新的主体完全替换现有的柱模型。 PATCH 请求将提交一个符合a REST PATCH endpoint 的主体,这允许在不提交整个模型的情况下修改对象模型。

    如果您使用多级模型,则需要在端点 PUT /posts/{id}/tags/{tagid} 和 PATCH /posts 支持 PUT 和 PATCH 请求/{id}/tags/{tagid}。由于您的标签仅包含参考 ID,因此 PUT 和 PATCH 没有意义,因为您要做的只是添加或删除标签。

    我假设您还需要处理标签删除。使用一级端点方法,您将通过 PUT 请求向 /posts/{id} 提交整个帖子模型,而无需删除要删除的标签。例如,如果你想删除标签 12 你的:

    {
       "Title": "Blog first post",
       "Body": "Some body text for the post",
       "PublishedAt": "2016-02-08",
       "Category": {
          "Id": "20",
        },
        "Tags": [
           { "Id": "18" }
        ]
    }
    

    如果您想采用多级方法,您可以向 /posts/{id}/tags/12 发出 DELETE 请求。

    【讨论】:

      【解决方案2】:

      对于 REST 中的这些情况,没有硬性规定。

      如果我们假设客户端想要一次性创建所有内容并等待尽可能短的响应时间,常识会建议将所有内容保留在一个请求中以避免(a)主要POST之间的同步问题和POSTs 作为标签。

      【讨论】:

        猜你喜欢
        • 2017-03-13
        • 2016-08-19
        • 2020-12-07
        • 2013-06-21
        • 2018-07-24
        • 1970-01-01
        • 2013-10-30
        • 2014-07-09
        • 2018-06-30
        相关资源
        最近更新 更多