【问题标题】:POST parameters on REST api - links or inline?REST api上的POST参数-链接还是内联?
【发布时间】:2020-11-06 17:56:43
【问题描述】:

我正在尝试设计一个 rest api,我有一个资源链接到另一个资源。说

GET /resource1/id1

{
  "property1": "value1",
  ...
  "links" : [
    {
       "rel": "res1to2rel",
       "href": "/resource2/r2"
    }
  ]

现在在创建资源 1 的帖子上,我想将关系传递给资源 2。 POST 调用应该是什么样子的

POST /resource1

{
  "res1to2rel": "/resource/r2"
}

还是应该看起来像

POST /resource1

{
  "links" : [
    {
      "rel": "res1to2rel",
      "href": "/resource2/r2"
    }
  ]
}

最佳实践是什么,POST 是否应该与 GET 匹配,或者它是否具有您在 GET 上看不到的属性?

【问题讨论】:

  • 我认为在大多数情况下如果它们匹配会更容易,但它们匹配不是必需

标签: rest design-patterns


【解决方案1】:

在 REST 设计方面几乎没有绝对的规则,但我认为如果资源具有一组一致的表示形式,对客户端来说会更容易。当您POST 表示时,您通常会创建一个新资源。这可以通过以下方式更加明确:

  1. 返回201 Created
  2. 在响应中返回 Location 标头。
  3. 返回服务器看到的表示的副本。

因此,POST 可能如下所示:

POST /resource1 HTTP/1.1
Content-Type: application/json

{
  "property1": "value1",
  ...
  "links" : [
    {
       "rel": "res1to2rel",
       "href": "/resource2/r2"
    }
  ]
}

响应可能是:

HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
Location: /resource1/id1

{
  "property1": "value1",
  ...
  "links" : [
    {
      "rel": "self",
      "href": "/resource1/id1"
    },
    {
       "rel": "res1to2rel",
       "href": "/resource2/r2"
    }
  ]
}

请注意,允许服务器丰富资源,在上面的示例中通过添加"self" 链接。

如果客户端稍后针对LOCATION 标头中提供的地址发出GET 请求,它将收到与从POST 请求中收到的回显相同的响应:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{
  "property1": "value1",
  ...
  "links" : [
    {
      "rel": "self",
      "href": "/resource1/id1"
    },
    {
       "rel": "res1to2rel",
       "href": "/resource2/r2"
    }
  ]
}

这使客户端更容易与 API 交互,因为它可以使用相同的内部模型来读取和写入(即序列化和反序列化)资源表示。

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多