【问题标题】:Get a collection of sub-resources at once with JSON-LD and Hydra使用 JSON-LD 和 Hydra 一次获取一组子资源
【发布时间】:2014-10-07 11:52:55
【问题描述】:

在 RESTful Web API 书中,作者建议公开配置文件并使用承认链接关系的内容类型。由Hydra 扩展的JSON-LD 似乎符合这些要求,我想在我的新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"
                             }
                            ]
               }

}

【问题讨论】:

    标签: rest http json-ld hypermedia hydra-core


    【解决方案1】:

    很高兴看到您考虑使用 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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    相关资源
    最近更新 更多