代码之家  ›  专栏  ›  技术社区  ›  Marcus Leon

如何以一种宁静的方式“偷懒装载”?

  •  4
  • Marcus Leon  · 技术社区  · 15 年前

    提供此服务以获取有关酒店的信息:

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

    问题是 biggie 是30万,我们不想每次都回复。懒惰加载这个值的休息方式是什么?

    我们应该建立两种资源:

    > 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 当你真的需要这些数据的时候?

    这是可行的……虽然没有什么特别的 比吉 但它是一个大数据集。我觉得把一切都放在 hotel 级别,因为所有属性实际上只是 酒店 .

    3 回复  |  直到 15 年前
        1
  •  13
  •   Darrel Miller    15 年前

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

    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
  •   Hank Gay    15 年前

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

        3
  •  1
  •   Nathan Long    15 年前

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

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

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

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