使用JSON-LD和Hydra一次获取子资源的集合

Loï*_*net 2 rest http hypermedia json-ld hydra-core

在RESTful Web API一书中,作者建议公开一个配置文件并使用一种确认链接关系的内容类型.Hydra扩展的JSON-LD似乎符合这些要求,我想在我的新API设计中使用它们.

我目前遇到性能问题.假设我有一个在线自行车商店,我想要检索有关给定自行车车轮的信息.

根据Hydra规范,在我看来,我需要发送2个请求来获取有关车轮的详细信息.第一个要求是自行车本身:

GET /mybike HTTP/1.1
Host: wowbike.com
Run Code Online (Sandbox Code Playgroud)

响应包含一个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"
}
Run Code Online (Sandbox Code Playgroud)

现在我可以向wheel资源发送第二个请求以获取详细信息:

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"
                 }
                ]
}
Run Code Online (Sandbox Code Playgroud)

发送单个请求并获得如下所示的响应是否有效?

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"
                             }
                            ]
               }

}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ler 6

很高兴看到您考虑使用JSON-LD和Hydra.当然,可以在一个响应中获取所有数据.您不必更改从收集的类型CollectionLink虽然.此外,您可能想稍微调整一下您的上下文.总而言之,您的回答看起来有点像这样:

{
  "@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"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

我在这里导入Hydra的上下文,然后覆盖默认词汇表,这意味着Hydra上下文中尚未定义的所有内容都会通过附加来扩展/contexts/vocab#.因此,Bike例如将扩展到/contexts/vocab#Bike.

顺便说一句.有一个W3C社区Groupw正在使用Hydra,如果你正在使用它,你应该加入.我们还有一个邮件列表,您可以在其中回答所有问题.

有关加入该组的说明,请访问http://www.hydra-cg.com/#community

  • 请注意,如果wheel属性被定义为具有Wheel类型的对象作为值,则关系会中断,但是您指定了hydra:Collection.(即如果你的词汇定义:wheel rdfs:range:Wheel).出于这个原因,正在对Hydra中的Collection类型进行重新设计,请参阅https://github.com/HydraCG/Specifications/issues/41以及有关分页集合的讨论#42:https://lists.w3.org/Archives /Public/public-hydra/2015Feb/0086.html (2认同)