2016-11-22 46 views
2

我想知道在請求所有記錄時,我的RESTful應用程序的最佳方法是什麼。使用RESTful應用程序請求所有記錄的模式是什麼?

例如,如果沒有提供$ top值以避免超載,我將限制爲10。但是,如何格式化我的請求?好的$ top = allrows或$ top = all ?.我檢查有沒有什麼圖案?

如果沒有提供$ top值,我只能返回10行。

GET /products?$top= 

我只是想避免這種情況:提前

GET /products/all 

感謝,

Alirio。

回答

3

沒有官方模式,任何選擇都取決於您的數據大小。

不管你做什麼,總是把的最大限制增加到你將返回的項目數量,而不管客戶端在請求中提供的參數。

另外,創建一個默認計數以在參數未提供信息時返回。

如果您沒有噸要返回的項目,你計數設置您默認計數最大限制和足以總是返回所有的,你可以只作鏈接不上的特定任何細節計數全部返回。

GET /products (no count/provided) 

如果你有數百或數千,你有一個默認計數說100,也許還可以利用的東西明確count延長該限制(最多當然最大 - 如果要求計數>最大,返回與消息,表明計數400錯誤的請求比最大不能更高)

GET /products?count=1000000 

但是,如果持續推動最大極限更高,這可能是可怕的爲您的服務器(S)和/或客戶端和更高。

通常,如果你已經有很多的記錄,你大塊它和使用的計數和偏移把它拉下來的字節大小的塊。還元數據添加到響應對象讓請求者知道當前位置,總的記錄,並供給

小僞碼偏移:

$count = 1000 
$offset = 0 
While count*offset < total records: 
    GET /products?count=$count&offset=$offset 
    $offset = $offset + $count 

假設請求中的一個看起來像:

GET /products?count=1000&offset=1000 

然後在響應正文你所期望的是這樣的:

{ 
    "result": [ 
     { 
      "id": "123", 
      "name": "some product", 
      "link": "/product/123" 
     }, 

     ... many more products ... 

     { 
      "id": "465", 
      "name": "another product", 
      "link": "/product/465" 
      } 

    ], 
    "meta": { 
     "count": 1000, 
     "offset": 1000, 
     "total_count": 3000, 
     "next_link": "/products?count=1000&offset=2000", 
     "prev_link": "/products?count=1000&offset=0", 

    }, 

    "status": 200 
} 

如果你真的想要金星,你可以讓你的資源堅持HATEOS(https://en.wikipedia.org/wiki/HATEOAS),並且包含指向列表中單個資源的鏈接,也可以在元中鏈接到列表的下一個和前一個塊,如果你正在走大項目清單。我在上面的json示例中添加了一些示例鏈接。

+0

WOW Ray。非常感謝您的詳細解答。這真的有助於我更多地瞭解我應該遵循的方法。 – Alirio

0

我會做這樣的:

對所有產品GET /產品

對於某些產品GET /產品/ {ID}

對於篩選或排序的所有產品, 使用GET /產品,但讓客戶端發送請求正文中的Filter對象。 那裏,如果他想在分頁某一頁它可以指定,或過濾一些記錄等

過濾對象可能看起來像: {「PAGENUMBER」:1,「pageSize的」:12,「自由文本」:「」, 「條件」:[],「分類」:{}} 在您的服務中,將其映射到內部服務篩選器並返回請求的記錄。

+0

這將是很好的檢查@Ray答案。 _「無論你做什麼,無論客戶在請求中提供的參數如何,總是對你要返回的物品數量設置**最大限制**。」_ – Alirio

相關問題