REST - 扩展关系

new*_*123 6 rest

我正在建立一个事件管理系统.该模式如下所述.API了解这些关系并返回请求结果中相关资源的链接.例如,

GET /Events/1

    "links": {
    "Venue": "/Venues/1",
    "Tickets": "/Tickets?event_id=1",
    "Teams": "/Teams?event_id=1",
    "Registrations": "/Registrations?event_id=1"
}
Run Code Online (Sandbox Code Playgroud)

我读过的关于REST和HATEOAS的大部分内容都表明这是"正确"的方式,但效率非常低.例如,如果我想生成参与事件的用户和团队的报告,则需要许多请求.这类似于运行多个选择查询而不是针对DB运行单个连接查询.所以我的问题是,我是否应该扩展关系并在资源请求中嵌入相关资源?这也带来了问题b/c上面的请求将返回大量数据.答案可能是坚持关系链接并设置适当的缓存.无论如何,我想要你的意见.

Schema

events
    hasMany registrations
    hasMany tickets
    hasMany teams

team
    belongsTo event

ticket
    belongsTo event
    hasMany registrations

user
    hasMany registrations

registrations
    belongsTo event
    belongsTo ticket
    belongsTo user
    belongsTo team
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 6

在另一个请求的正文中返回资源的完整表示没有任何问题.正如你所提到的,这可能在冗长的一面.

鉴于该服务的某些调用者可能只想要返回的URI,但有时您希望减少通过网络的往返次数,即,您希望一次调用所有内容,您要搜索的术语是,投影.

这些是满足客户需求的资源的不同表示.

您可以在URI参数中指定它们,例如, GET /Events/1?venueProjection=full,teamProjection=uri

然后根据客户要求返回投影.

"links": {
"Venue": {
    "uri": "/Venues/1",
    "attr1": "value1",
    "attrN": "valueN"
},
"Tickets": "/Tickets?event_id=1",
"Teams": "/Teams?event_id=1",
"Registrations": "/Registrations?event_id=1"
}
Run Code Online (Sandbox Code Playgroud)

注意:始终使用您的投影返回URI,这样,如果它们未满,客户端可以在以后轻松访问完整资源.

我建议你阅读谷歌的"休息预测"或查看RESTful Cookbook.