2013-10-11 125 views
3

我們正在構建Java SDK以簡化對提供REST API的服務之一的訪問。此SDK將由第三方開發人員使用。如何將REST請求的參數傳遞給Java方法?

其中一個問題是找到一種很好的方法來表示每個請求的可選參數。

比方說,我們有其他端點:GET /photos 其中有幾個可選參數:sortBypageSizepageNumber

一個解決辦法是接受Map<String,String>作爲參數來表示,該API方法休息電話。

interface RestService { 
    public List<Photo> getPhotos(Map<String,String> parameters); 
} 

有一對夫婦的這種解決方案的問題:

  • 該方法的簽名使開發人員沒有關於可用此方法可選參數的名稱信息(以及有效的值)。他需要查閱REST api文檔,理想情況下我們希望避免這種需要。
  • 開發人員最終會用他將調用的方法的參數創建幾個Map,並對各個參數的名稱和值進行硬編碼。這意味着如果他們改變了,修復它們將是一件麻煩事。

另一種解決方案是使用一個Options對象,該對象將包含有關可選參數的信息。我們甚至可以使用構建器模式來構建這個對象。

這是方法簽名會是什麼樣子:

interface RestService { 
    public List<Photo> getPhotos(PhotosOptions options); 
} 

開發人員現在知道什麼是可用的可選參數,可以輕鬆地構建一個PhotosOptions這樣的:

PhotosOptions options = PhotosOptions.builder().sortBy(DESC).pageSize(200).build(); 
List<Photo> photos = getPhotos(options); 

問題是我們試圖用SDK覆蓋的服務有很多我們需要實現的請求,幾乎所有的請求都有他們允許的不同選項列表。這可能會導致大量的選項類別。

這裏的最佳解決方案是什麼?爲每個組合構建一個選項對象(及其構建器)?繼承在這裏沒有什麼幫助,因爲我有各種各樣的參數組合。

+0

不要現在如果這將是對你有任何幫助。我寫這個https://github.com/spacifici/simple-rest-client,是一個REST客戶端庫,允許通過寫自己的接口(字面的Java接口)使用REST服務。 隨意使用它。 – j0n0

回答

0

更好的方法是使用選項對象爲您呈現:

interface RestService { 
    public List<Photo> getPhotos(PhotosOptions options); 
} 

這是非常困難的方法,需要輸入大量的文字,你就會有很多類和其他的屁股痛。

但我認爲這種方式比其他方式更好,因爲它提供了強大的方法簽名,使您的SDK更具確定性。如果你正確地分開你的類,你會發現這是一個更好的方法。

用戶會告訴你的謝謝。

我有同樣的問題,前一段時間,經過多次嘗試我選擇這個方法,我現在很高興。

+0

我也相信這是最好的方法。然而,我擔心我們最終需要編寫和維護的Options類(及其構建者)數量過多。我們想知道對sdk用戶的好處是否補償了額外的工作和複雜性(通過大幅增加類的數量)。 –

相關問題