【问题标题】:How to "lazy load" in a RESTful manner?如何以 RESTful 方式“延迟加载”?
【发布时间】:2009-10-26 17:10:00
【问题描述】:

鉴于此服务可获取有关酒店的信息:

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

【问题讨论】:

    标签: rest lazy-loading restful-url


    【解决方案1】:

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

    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>
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 缓存是我没有想到的另一种可能性。好主意。
      【解决方案3】:

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

      1. 每次发送所有属性
      2. 按要求单独发送属性(/{id}/a/{id}/b/{id}/biggie
      3. 按照您的建议发送所有属性,不寻常的属性除外。

      1 和 2 很好,因为它们是统一的,但 3 在您的情况下是有意义的,或者在一条数据需要登录凭据的情况下,例如。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-02
        • 1970-01-01
        • 2022-07-08
        • 1970-01-01
        • 2014-01-31
        • 2022-10-07
        • 1970-01-01
        • 2012-02-28
        相关资源
        最近更新 更多