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

标签 rest http json-ld hypermedia hydra-core

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

相关文章:

powershell - 无法将 Web 请求发送到 Tomcat 上的 CAS 服务器

android - 是否有用于指定设备类型、操作系统版本、应用程序版本等的移动 http 请求的标准 header ?

html - 一个页面中的多个 JSON-LD 标签组

http - 与 RestSharp 的持久 HTTP 连接

java - 读取大文件并连续处理时连接重置

ruby-on-rails - 从 Cucumber 发出 POST 请求来创建新对象的最佳方法是什么?

facebook-opengraph - 具有多个 Facebook 目录变体的产品的 JSON-LD 微数据

javascript - AngularJS - 自动生成用于访问 REST API 的工厂的建议

jquery - 当出现用户/表单验证错误时,我应该向 AJAX 请求发送什么响应/状态代码?

seo - 搜索引擎如何将结构化数据与页面内容进行交叉检查?