RESTful创建或更新引用

时间:2015-10-22 05:14:27

标签: rest post hateoas

如果我想创建(POST)链接两个独立资源的新资源,那么最合适的是什么 - 关于HATEOAS和REST原则 - 构建请求实体的方法是什么?

RFC,W3C文档,Fielding论文等中关于客户请求将两个独立资源链接在一起的正确方法的任何参考都是最有价值的。或者,如果我感兴趣的仅仅是在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发出请求,是否会以任何方式对HATEOAS和REST原则发布以下命令?

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

对我来说,这看起来很直观。但是,我找不到太多或任何关于使用POST链接两个独立资源的正确方法的讨论。我发现了LINKUNLINK HTTP方法,但这些方法似乎不适合公共API。

1 个答案:

答案 0 :(得分:2)

客户端不构建URI,因此除非这些资源标识符或至少其模板来自服务,否则这是错误的。可以使用id号而不是URI,直到在包含POST链接的响应中描述它为止。

来自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,但我没有时间关注该项目。我想你仍然可以使用rdfs:range而不是等待一个九头蛇。

因此,在您的情况下,您可以添加范围为item的{​​{1}}属性,依此类推。我假设您可以添加备选项的链接,例如http://api.example.com/doc/#Item,这样您就可以生成一个选择输入框。请注意,此技术尚不稳定。

因此,您可以发送一个简单的JSON作为POST正文http://api.example.com/items/或类似的东西,您可以根据POST链接生成它。 RDF用于客户端而不是服务器。服务器可以理解它需要的数据结构,它不需要RDF。你不需要字典来了解自己......