如何以RESTful方式“延迟加载”?

时间:2009-10-26 17:10:01

标签: rest lazy-loading restful-url

根据这项服务获取有关酒店的信息:

> 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的属性。

3 个答案:

答案 0 :(得分:13)

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

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>

答案 1 :(得分:3)

将其设置为两个资源可行,但如果您不喜欢,可以考虑使用缓存;根据数据的性质,这实际上可能比分割成多个资源节省更多的负担。

答案 2 :(得分:1)

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

  1. 每次都发送所有属性
  2. 根据要求单独发送属性(/{id}/a/{id}/b/{id}/biggie
  3. 根据您的建议,发送所有属性,除了不寻常的属性。
  4. 1和2很不错,因为它们是统一的,但是3在你的情况下是有意义的,或者在一个数据需要登录凭证的情况下,例如。

    (2还有一个缺点,就是要求与请求者更紧密地联系,他们必须知道每个属性的名称。)