我們正在構建Java SDK以簡化對提供REST API的服務之一的訪問。此SDK將由第三方開發人員使用。如何將REST請求的參數傳遞給Java方法?
其中一個問題是找到一種很好的方法來表示每個請求的可選參數。
比方說,我們有其他端點:GET /photos
其中有幾個可選參數:sortBy
,pageSize
,pageNumber
等
一個解決辦法是接受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覆蓋的服務有很多我們需要實現的請求,幾乎所有的請求都有他們允許的不同選項列表。這可能會導致大量的選項類別。
這裏的最佳解決方案是什麼?爲每個組合構建一個選項對象(及其構建器)?繼承在這裏沒有什麼幫助,因爲我有各種各樣的參數組合。
不要現在如果這將是對你有任何幫助。我寫這個https://github.com/spacifici/simple-rest-client,是一個REST客戶端庫,允許通過寫自己的接口(字面的Java接口)使用REST服務。 隨意使用它。 – j0n0