使用与REST API的关系发布数据

时间:2016-02-09 10:49:57

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

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

的帖子
    public Bitmap StringToBitMap(String encodedString) {
    try {
        byte[] encodeByte = Base64.decode(encodedString, Base64.DEFAULT);
        Bitmap bitmap = BitmapFactory.decodeByteArray(encodeByte, 0,
                encodeByte.length);
        return bitmap;
    } catch (Exception e) {
        e.getMessage();
        return null;
    }
}

你会向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" }
  ]
}

或者你会按照以下步骤做到这一点:

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

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

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

2 个答案:

答案 0 :(得分:3)

取决于您希望如何展示您的API以及您希望它的彻底程度。鉴于你的模型,我会做以下几点。

我会在发布/发布时有一个端点,并会发送帖子模型的整个主体。

我还会在 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} /标签/ {标签识别}。由于您的标签只包含引用ID,因此PUT和PATCH没有意义,因为您只想添加或删除标签。

我假设你还需要处理标签删除。使用单级端点方法,您可以通过 / posts / {id} PUT 请求提交没有要删除的标记的整个帖子模型。例如,如果您要删除标记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请求。

答案 1 :(得分:0)

在REST中,这些情况没有硬性规定。

如果我们假设客户想要一次性创建所有内容并等待尽可能少的时间来进行响应,常识会建议将所有内容保留在一个请求中以避免(a)主要{{1}之间的同步问题}和POST s用于标记。