以 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 的正确方法的讨论。我发现了 LINK
和 UNLINK
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/#Item
的 item
属性 等等。我假设您可以添加替代项的 link,例如 http://api.example.com/items/
,这样您就可以生成一个 select 输入框。请注意,这项技术还不稳定。
所以你可以发送一个简单的 JSON 作为 POST 正文 {item: {id:1}, customer: {id:1}}
或类似的东西,你根据 POST link 生成。 RDF 适用于客户端而不适用于服务器。服务器可以理解它需要的数据结构,它不需要 RDF。你不需要字典来了解自己...
如果我想创建 (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 的正确方法的讨论。我发现了 LINK
和 UNLINK
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/#Item
的 item
属性 等等。我假设您可以添加替代项的 link,例如 http://api.example.com/items/
,这样您就可以生成一个 select 输入框。请注意,这项技术还不稳定。
所以你可以发送一个简单的 JSON 作为 POST 正文 {item: {id:1}, customer: {id:1}}
或类似的东西,你根据 POST link 生成。 RDF 适用于客户端而不适用于服务器。服务器可以理解它需要的数据结构,它不需要 RDF。你不需要字典来了解自己...