2009-10-26 67 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還需要與請求者,誰知道每個屬性的名稱更緊密的耦合的缺點。)