以 REST 方式创建或更新引用的资源

RESTfully create or update a resource that references

如果我想创建 (POST) 一个新资源 linking 两个独立的资源,什么是最合适的 - 相对于 HATEOAS 和 REST 原则 - 构建实体的方式请求?

RFC、W3C 文档、Fielding 的论文等中关于客户端请求将两个独立资源 link 整合在一起的正确方法的任何参考资料都是最有价值的。或者,如果我感兴趣的只是在 REST、HATEOAS 的范围之外,解释为什么也很好。

希望我上面的问题很清楚。如果没有,这里有一个场景和一些背景来解决这个问题。

假设我有两个独立的资源:/customer/item,第三个资源 /order 用于这两个资源。

如果我以类似 HATEOAS 的方式(比如 JSON-LD)向客户展示这些资源,客户可能(至少)看起来像:

{
    "@id": "http://api.example.com/customer/1"
}

还有类似的项目:

{
    "@id": "http://api.example.com/item/1"
}

我更关心 POST 请求的实体应该采用什么方案,而不是我正在向其发送请求的 URL。假设我正在向 /order 发送请求,POST 以下 运行 是否会以任何方式违反 HATEOAS 和 REST 原则?

{
    "customer": {"@id": "http://api.example.com/customer/1"},
    "item": {"@id": "http://api.example.com/item/1"}
}

对我来说,直觉上这似乎没问题。但是,我找不到太多关于 link 两个独立资源与 POST 的正确方法的讨论。我发现了 LINKUNLINK HTTP 方法,但这些方法似乎不适合 public API.

客户端不构建 URI,因此这是错误的,除非这些资源标识符或至少它们的模板来自服务。在包含 POST link.

的响应中对此进行描述之前,可以使用 ID 编号而不是 URI

来自 hydra documentation 的示例:

{
  "@context": "http://www.w3.org/ns/hydra/context.jsonld",
  "@id": "http://api.example.com/doc/#comments",
  "@type": "Link",
  "title": "Comments",
  "description": "A link to comments with an operation to create a new comment.",
  "supportedOperation": [
    {
      "@type": "CreateResourceOperation",
      "title": "Creates a new comment",
      "method": "POST",
      "expects": "http://api.example.com/doc/#Comment",
      "returns": "http://api.example.com/doc/#Comment",
      "possibleStatus": [
        ... Statuses that should be expected and handled properly ...
      ]
    }
  ]
}

"http://api.example.com/doc/#Comment" 包含 属性 个描述。

{
  "@context": "http://www.w3.org/ns/hydra/context.jsonld",
  "@id": "http://api.example.com/doc/#Comment",
  "@type": "Class",
  "title": "The name of the class",
  "description": "A short description of the class.",
  "supportedProperty": [
    ... Properties known to be supported by the class ...
    {
      "@type": "SupportedProperty",
      "property": "#property", // The property
      "required": true, // Is the property required in a request to be valid?
      "readable": false, // Can the client retrieve the property's value?
      "writeable": true // Can the client change the property's value?
    }
  ]
}

支持的 属性 可以有一个 rdfs:range,它描述了值约束。这是 not yet (2015.10.22.) added to the hydra vocab as far as I can tell, but I don't have time to follow the project. I think you still can use the rdfs:range 而不是等待九头蛇范围。

因此,在您的情况下,您可以添加范围为 http://api.example.com/doc/#Itemitem 属性 等等。我假设您可以添加替代项的 link,例如 http://api.example.com/items/,这样您就可以生成一个 select 输入框。请注意,这项技术还不稳定。

所以你可以发送一个简单的 JSON 作为 POST 正文 {item: {id:1}, customer: {id:1}} 或类似的东西,你根据 POST link 生成。 RDF 适用于客户端而不适用于服务器。服务器可以理解它需要的数据结构,它不需要 RDF。你不需要字典来了解自己...