2016-09-22 53 views
1

有什麼更好的?當爲實體查詢REST端點時 - 一次返回所有實體和子實體,然後使用一些客戶端代碼(我們稱之爲「渴望」模式)在UI上顯示它們,或者最好返回主實體首先取代它的子實體,然後返回這些子實體的ID,然後讓UI小心併爲每個ID發出正確的REST請求? (我們稱之爲lazy模式)。REST API渴望還是懶惰?

所以返回該JSON(這其實不是一個有效的JSON,剛出區域:前綴爲您瞭解什麼是實體):

country: { 
name: 'C1', 
regions: [ 
    region: { 
     id: 'I1' 
     name: 'R1', 
     area: 'A1' 
    }, 

    region: { 
     id: 'I2' 
     name: 'R2', 
     area: 'A2' 
    }, 
] 

} 

或本:

country: { 
name: 'C1', 
regions: ['I1','I2'] 
} 

然後:

GET /rest/region/I1 
GET /rest/region/I2 

哪一個更好?何時使用哪個? 謝謝

+0

第二個是更「RESTful」,但取決於你必須做多少個後續api調用,你可能想要做前者。 – Falmarri

+1

你不應該在你的數據中需要''region「'鍵。 ''regions''列表應該已經告訴你,你有區域對象。 –

+0

遠不是不需要區域密鑰,它實際上在當前是無效的JSON ... – tonicsoft

回答

3

這樣的決定通常應根據需要進行,而不是試圖事先設計一切。考慮誰在使用你的服務(你提到它將在UI中使用)以及需求是什麼。

用戶界面是否總是需要加載所有的數據?如果是這樣,那麼延遲加載毫無意義,並會增加客戶端代碼的複雜性。如果您遇到性能問題或者添加了另一個不需要所有數據的UI頁面,則可以稍後在另一個URL中實現「延遲加載」。

如果UI在默認情況下只顯示「頂級數據」,而更詳細的信息只是基於用戶的某些輸入有條件地顯示,那麼爲「懶惰模式」的數據並非一直需要。

實質上,在編寫API之前,在編寫之前編寫UI代碼。這將告訴你哪個實現更有意義。

3

嗯,這取決於,不是嗎?

如果數據不會改變,您可以進行急切加載。

如果您提供脫機支持,即使用戶斷開Internet連接,但希望客戶端正常工作,也必須進行急切加載。儘管如此,它需要一個精心設計的客戶端框架。

如果數據經常被修改,最好進行延遲加載。

如果數據是安全的,那麼最好將它分成小塊而不是一次全部放入,但這是開放的討論。

簡而言之,經驗法則是,如果您的用戶界面非常聰明,而且後端很笨(er),則需要加載,而如果所有的業務邏輯都位於後端,並且UI僅僅是一種表示形式,請進行延遲加載。

混合不是一個壞主意。

1

我認爲這取決於。我會和第一個一起去,因爲你可以減少數據庫調用次數,以及同步AJAX調用的延遲時間(在進行第二次和第三次調用之前,你需要得到第一個返回值)。

我說這取決於的原因是因爲如果有大量數據,或者第一個請求花費的時間比連接或額外的數據要長得多,那麼您可以讓用戶看到第一個結果並讓剩餘的在查看第一個結果時加載。

這也假定數據在數據庫中,用戶一定需要額外的數據。

2

我不確定這是否是正確的方式來做到這一點,但我更喜歡。

  • 如果嵌套,即內部模型相對較小,那麼我寧願使用「渴望」模式。沒有意義再做一次API調用來獲取嵌套模型。保持網絡請求的最低限度是我努力的目標。
  • 如果來自嵌套模型的數據要顯示在同一個屏幕或頁面上,那麼我更喜歡「渴望」模式。由於我需要嵌套的模型信息,因此請使用相同的API調用。在這種情況下,嵌套模型的大小是否巨大並不重要。我需要它任何方式!
  • 如果在後續屏幕或頁面中需要嵌套模型的數據,則可以通過決定使用一個需要更多時間或一系列API的API調用來使用「渴望」或「懶惰」模式每次調用時間相對較短。

你可以看到很多這取決於如何在客戶端應用程序的功能。所以根據需要做出決定。也儘量保持API調用的最低限度。網絡請求很昂貴。但是,如果由於嵌套模型中的所有數據導致任何響應變得過於龐大,除非用戶執行某些操作,否則您可能不會使用這些數據,然後將其分解爲多個API調用。

相關問題