2009-10-26 63 views
3

鉴于这种服务以获取宾馆信息:如何以RESTful方式“延迟加载”?

> GET /hotel/{id} 

< HTTP/1.1 200 OK 
< <hotel> 
< <a>aaa</a> 
< <b>aaa</b> 
> <biggie>aaa....I am 300K</biggie > 
< </hotel> 

问题是,biggie是300K,我们不希望与每一个响应返回。延迟加载此值的RESTful方式是什么?

我们应该建立两个资源:

> GET /hotel/{id} 

< HTTP/1.1 200 OK 
< <hotel> 
< <a>aaa</a> 
< <b>aaa</b> 
< </hotel> 

和..

> GET /hotel/{id}/biggie 

< HTTP/1.1 200 OK 
< <biggie> 
< <val>aaa....I am 300K</val> 
< </biggie> 

而且你只要求GET /hotel/{id}/biggie当你真的需要这些数据?

这将工作..虽然没有什么特别的关于biggie除了它是一个大型的数据集。我认为将所有内容都保存在hotel级别会更好,因为所有属性都只是hotel的属性。

回答

12

不要忘了,超媒体是你的朋友。

GET /hotel/{id} 

HTTP/1.1 200 OK 
<hotel Id="99"> 
    <a>aaa</a> 
    <b>aaa</b> 
    <biggieLink href="/Hotel/99/Biggie"/> 
</hotel> 

,或者你甚至可以做

GET /hotel/{id} 

HTTP/1.1 200 OK 
<hotel Id="99"> 
    <a>aaa</a> 
    <b>aaa</b> 
    <biggieSynopsis href="/Hotel/99/Biggie"> 
    <title>Here is a a summary of biggie</title> 
    </biggieSynopsis 
</hotel> 
3

将它设置为两个资源可以工作,但如果你不喜欢这样,你可以考虑使用缓存;取决于数据的性质,这可能实际上为您节省更多的负担,而不是分解为多个资源。

+0

缓存是我没想到的另一种可能性。好主意。 – 2009-10-26 17:19:27

1

我认为你的解决方案很好。有没有完美的答案,但三种可能性是:

  1. 发送的所有属性,每一个的要求(/{id}/a/{id}/b/{id}/biggie
  2. 发送的所有属性,除了不同寻常的,因为你
  3. 发送单独的属性时建议。

1和2是很好的,因为它们是统一的,但3对于您的情况有意义,或者在一个数据片段需要登录凭证的情况下。

(2还需要与请求者,谁知道每个属性的名称更紧密的耦合的缺点。)