HATEOAS没有在响应中发送HTTP链接

时间:2018-01-11 10:53:33

标签: hateoas

您好REST HATEOAS专家!

以下是来自HATEOAS服务的典型JSON响应

{
  links: {
     'add': 'http://myhost/API/students',
     'csv-export': 'http://myhost/API/students/export'
  },
  list: [
      {id: '1', name: 'John Doe', links: {'see': 'http://myhost/API/students/1'},
      {id: '2', name: 'Jane Doe', links: {'see': 'http://myhost/API/students/2'},
      ...
  ]
}

从中我们可以看到发送完整的HTTP(s)链接和响应是

  1. 非常耗费空间(是的,我知道gzip)
  2. 难以阅读(想象当列表中有1000个元素时)
  3. 还不够,因为您仍然不知道使用哪种方法(也不需要发送哪些内容)
  4. 所以我正在做的是以下内容:

    {
      resType: 'studentsCollection',
      rels: ['add','csv-export'],
      list: [
          {id: '1', name: 'John Doe', resType: 'studentCollectionItem', rels: ['see'],
          {id: '2', name: 'Jane Doe', resType: 'studentCollectionItem', rels: ['see'],
          ...
      ]
    }
    

    我提供了额外的端点: / resTypes / studentsColelction / rels

    {
        resType: 'studentsCollection',
        links: {
           'add': {method: 'POST', url: '/students', contentType: 'studentForm', resultType: 'studentId'},
           'csv-export': {method: 'GET', url: '/students/export', contentType: 'studentCriteria', resultType: 'binary'}
        }
    }
    

    / resTypes / studentCollectionItem / RELS     {         resType:'studentCollectionItem',         链接:{            'see':{method:'GET',url:'/ students / {id}',resultType:'studentEntity'}         }     }

    还存在/ resTypes,它们一次返回所有resTypes以避免多次往返

1 个答案:

答案 0 :(得分:0)

听起来JSON Hyper-Schema非常适合您。 JSON Hyper-Schema是一种超媒体媒体类型,可用于将链接应用于原始数据,而无需修改数据。

我们假设你有这个JSON响应数据

{
  "list": [
    {
      "id": "1",
      "name": "foo"
    },
    {
      "id": "2",
      "name": "bar"
    }
  ]
}

然后可以通过以下的Hyper-Schema来描述该数据。

{
  "title": "Students",
  "type": "object",
  "properties": {
    "list": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": { "type": "string" },
          "name": { "type": "string" }
        },
        "links": [
          { "rel": "student", "href": "/students/{id}" }
        ]
      }
    }
  }
  "links": [
    {
      "rel": "create", "href": "/students",
      "method": "POST",
      "schema": { "$ref": "/schemas/createStudent" }
    }
  ]
}

Hyper-Schema就像一个超媒体模板,可以应用于普通的JSON文档,将普通的JSON响应转换为支持超媒体的JSON响应。请注意示例/students/{id}中的URL模板。 {id}变量从实例数据填充。因此,列表中的第一项具有链接/students/1,第二项具有链接/students/2。这使您无需在每个响应中复制所有链接样板。

使用标题链接将JSON响应与超模式相关联

Link: </schema/students>; rel="describedby"

此时您可能会想,&#34;这很好但是为每个响应获取Hyper-Schema的额外请求比发送膨胀的响应需要更多的资源&#34;。这就是为什么你应该设计你的系统以便Hyper-Schemas永远可以缓存的原因。然后,当客户端看到已经拥有的资源的describeby链接时,它只使用它的缓存版本。无需其他要求。如果您需要更改Hyper-Schema,只需将describeby链接更改为其他URI /schema/v2/student,客户端将一次性下载新的Hyper-Schema。尽管偶尔会有额外的请求来检索超级架构,但您的总体带宽使用率应该低于在每个请求中发送所有链接的情况。

此示例使用draft-04版本的JSON Hyper-Schema。自04年草案以来,JSON Schema已经在新的管理层和#34;可以这么说。虽然04号草案远非完美,但我个人对自04年草案以来他们采用该规范的方向并不满意。不过,我建议您查看最新草稿(目前为draft-07)并做出自己的决定。