在 RESTful Web API 一书中,作者建议公开配置文件并使用确认链接关系的内容类型。 JSON-LD由 Hydra 扩展似乎符合这些要求,我想在我的新 API 设计中使用它们。
我目前遇到性能问题。假设我有一家在线自行车商店,我想检索有关给定自行车车轮的信息。
对于 Hydra 规范,在我看来我需要发送 2 个请求来获取有关轮子的详细信息。 第一个请求是针对自行车本身的:
GET /mybike HTTP/1.1
Host: wowbike.com
响应包含一个 Hydra::Link 到轮子集合:
HTTP/1.1 200 OK
Content-Type: application/ld+json
{
"@context" :
{
"Bike": "/contexts/vocab#Bike"
},
"@id" : "/mybike",
"@type" : "Bike",
"size" : "L",
"wheels" : "/mybike/wheels" // "wheels" is a "hydra:Link"
}
现在我可以向 wheels 资源发送第二个请求以获取详细信息:
GET /mybike/wheels HTTP/1.1
Host: wowbike.com
HTTP/1.1 200 OK
Content-Type: application/ld+json
{
"@context":
{
"Collection": "http://www.w3.org/ns/hydra/core#Collection",
"Wheel" : "/contexts/vocab#Wheel"
},
"@type" : "Collection",
"@id" : "/mybike/wheels",
"member" :
[
{
"@id" : "/mybike/wheels/firstwheel",
"@type" : "Wheel",
"color" : "blue"
},
{
"@id" : "/mybike/wheels/secondwheel",
"@type" : "Wheel",
"color" : "white"
}
]
}
发送单个请求并获得如下响应是否有效?
GET /mybike HTTP/1.1
Host: wowbike.com
HTTP/1.1 200 OK
Content-Type: application/ld+json
{
"@context" :
{
"Collection": "http://www.w3.org/ns/hydra/core#Collection",
"Bike" : "/contexts/vocab#Bike",
"Wheel" : "/contexts/vocab#Wheel"
},
"@id" : "/mybike",
"@type" : "Bike",
"size" : "L",
"wheels" :
{
"@id" : "/mybike/wheels",
"@type" : "Link",
"member":
[
{
"@id" : "/mybike/wheels/firstwheel",
"@type" : "Wheel",
"color" : "blue"
},
{
"@id" : "/mybike/wheels/secondwheel",
"@type" : "Wheel",
"color" : "white"
}
]
}
}
最佳答案
很高兴看到您考虑使用 JSON-LD 和 Hydra。当然,可以在一次响应中获取所有数据。不过,您不必将集合类型从 Collection
更改为 Link
。另外,您可能想稍微调整一下上下文。总而言之,您的回复看起来有点像这样:
{
"@context": [
"http://www.w3.org/ns/hydra/context.jsonld",
{ "@vocab": "/contexts/vocab#" }
],
"@id": "/mybike",
"@type": "Bike",
"size": "L",
"wheels": {
"@id" : "/mybike/wheels",
"@type" : "Collection",
"member": [
{
"@id" : "/mybike/wheels/firstwheel",
"@type" : "Wheel",
"color" : "blue"
},
{
"@id" : "/mybike/wheels/secondwheel",
"@type" : "Wheel",
"color" : "white"
}
]
}
}
我在这里导入 Hydra 的上下文,然后覆盖默认词汇表,这意味着 Hydra 上下文中尚未定义的所有内容都通过将其附加到 /contexts/vocab#
进行扩展。因此,例如 Bike
将扩展为 /contexts/vocab#Bike
。
顺便说一句。有一个W3C Community Groupw working on Hydra如果你正在使用它,你应该加入。我们还有一个 mailing list您的所有问题都将得到解答。
加入群的说明可以在http://www.hydra-cg.com/#community找到
关于rest - 使用 JSON-LD 和 Hydra 一次获取子资源的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25297719/