REST - 扩展关系

时间:2013-04-23 14:42:53

标签: rest

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

GET /Events/1

    "links": {
    "Venue": "/Venues/1",
    "Tickets": "/Tickets?event_id=1",
    "Teams": "/Teams?event_id=1",
    "Registrations": "/Registrations?event_id=1"
}

我读到的关于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

1 个答案:

答案 0 :(得分: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"
}

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

我建议您阅读Google的“休息预测”,或查看RESTful Cookbook。