2013-04-23 93 views
6

我正在构建事件管理系统。架构如下所述。 API了解这些关系并将请求结果中的相关资源链接返回。例如,REST - 扩大关系

GET /Events/1 

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

大部分我读过关于REST和HATEOAS表明,这是“正确”的方式做到这一点但它是非常低效的。例如,如果我想生成参与事件的用户和团队的报告,则需要很多请求。这类似于运行多个select查询,而不是针对数据库运行单个连接查询。所以我的问题是,我应该扩大关系并在资源请求中嵌入相关资源吗?这也会造成问题,因为上面的请求会返回大量的数据。答案可能是坚持关系链接并设置适当的缓存。无论如何,我希望你的意见。

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 

回答

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。

+0

谢谢。我无法告诉你我在线阅读了多少指南/教程,从未遇到过这个术语或概念。 – newb1123 2013-04-24 03:49:05

+0

找不到关于这个术语的任何内容...:S Btw。 Tickets,Teams,Registrations应该是具有单个url属性而不是字符串的对象。用这种方式处理它们更容易... – inf3rno 2013-09-05 01:58:44

+0

我从RESTFul食​​谱中得到它。它基本上是另一种在不使用正常内容协商或具有数千个表示的情况下对“表示”进行微调的方式。它允许您基本上为您想要的表示定义规范。 http://www.amazon.co.uk/RESTful-Services-Cookbook-Subbu-Allamaraju/dp/0596801688/ref=sr_1_1?ie=UTF8&qid=1378368152&sr=8-1&keywords=rest+cookbook – James 2013-09-05 08:03:26