2015-04-23 40 views
2

尋找一些建議來幫助我設計一個寧靜的服務。REST風格的服務設計:調用獲取所有資源端點

  1. 獲取所有產品:客戶試圖獲得所有產品時會發生什麼/products。我應該歸還所有產品還是前50名?
  2. 如果服務將返回前50或前100,那麼我應該在哪裏編寫分頁邏輯?我應該寫在同一個getAllProducts()方法嗎?
  3. 我打算有sortsearch功能。這兩個去哪裏?

這裏是我的假設:

@RequestMapping("/products") 
public String getAllProducts(@QueryParam(value="page") int page, @QueryParam(value="sort") String orderBy) { 

@RequestMapping("/search/products") 
public String findProducts(@QueryParam(value="q") String searchCriteria) { 
+2

投票決定關閉,因爲它是基於IMO意見;無論如何'/ search /'是一個動詞,並不適合真正的寧靜服務。 –

+0

@ᴳᵁᴵᴰᴼ瞭解您的關注。你對這個問題有一個更清潔的方法嗎? –

+0

投票結束,並且完全基於意見。這就是說,我的意見是更聰明地工作,而不是更難。你有沒有想過要以json格式返回所有產品,並使用像[DataTables](http://datatables.net/)這樣的jQuery工具來處理分頁,排序,搜索等。你可以節省大量不必要的編碼後端(重複努力),並且可以快速啓動並運行。除非你有成千上萬的產品,否則我會讓插件爲你處理。 – Shaggy

回答

1

的慣常做法,如你所說,是使用的參數。
根據您的要求,您可以使用theese之一:

  1. ?page=$pagenumber(由你定義的頁面大小)
  2. ?page=$pagenumber?per_page=$pagesize(由客戶端定義的頁面大小)
  3. (做這件事的那GitHubs方式)
  4. ?start=$idOfFirstElement?per_page=$idOfLastElement(沒有「人造」的網頁,更接近數據庫)

當然你可以(或者應該)中限制var的輸入iant 2和3,如果結果很大,則返回一個#4XX響應代碼。


  1. 獲取所有產品:當客戶端試圖讓所有的產品/products會發生什麼。我應該歸還所有產品還是前50名?

常規和預期的RESTful行爲將得到所有產品,而在實際環境中往往這是不可能的。 (請考慮使用10k產品的「小型」網上商店)。
基本上有兩種設計方案:

  1. 沒有尋呼信息的HTTP請求是壞的。給出一個#4XX響應。
  2. 沒有分頁信息的HTTP請求使用默認值。 (例如第一頁和每頁50個產品)

我會建議使用第一個,因爲它看起來更清潔,不會對客戶造成混淆。


  • 我打算具有sortsearch功能良好。這兩個去哪裏?
  • 與頁面參數相同。只需將它們添加到URI即可。
    例如?sortBy="price"?sort="ASC"?sort="DESC"?searchFor="lalalala"


  • 如果服務將返回第50或第100,則應該在哪裏我寫分頁邏輯?我應該寫在同一個getAllProducts()方法嗎?
  • 不幸的是,我們不能真正評論你與少量給定的代碼。 ...並且SO不是真的Code Review

    1

    我推薦的是保持查詢字符串的語義簡單,API的使用者可以輕鬆遵循的單詞,分頁這些查詢參數可以是例如:

    我可能只是對偏移量爲100的前2個元素感興趣,這會比如果您檢索一個偏移量更好每次固定金額。請記住,儘管客戶端可以設置限制,但您應該在服務器端有一個最大限制值,以便最終不會檢索所有對象並放慢您的應用程序。

    的URL表示使用分頁偏移和限制是:

    GET /products?offset=10,limit=50

    關於搜索你也想使用的方法,你必須定義你的資源屬性是可查詢和訂單等。還,您可能希望定義一個從所有查詢的屬性將查詢參數(例如q)所以到您的收藏的請求看起來像:

    GET /products?offset=10,limit=50,name=*rest*&description=*rest*

    GET /products?offset=10,limit=50,q=rest

    此外,我建議你檢查一下Designing REST + JSON APIs這個視頻(全面披露我在Stormpath工作,但我真正作爲一種寶貴的資源它的東西),萊斯談論分頁1左右: 00:00,以防你想快速轉發。

    希望它能幫助,

    何塞·路易斯·

    +0

    而不是offset = x和limit = y,我更喜歡skip = x和take = y。這是Linq使用的術語,我認爲它更直觀。 –