您好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)链接和响应是
所以我正在做的是以下内容:
{
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以避免多次往返
答案 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)并做出自己的决定。