日常開發中,少不了對第三方api的封裝。api封裝的好壞絕定了后期維護的難度以及使用api的開發人員是否抱怨。比如:有一天第三方api的域名變了。或者自己封裝的api沒有參數說明,過段時間來改代碼自己忘什么意思了。或者應該調用哪個URL來滿足我當前的需求。考慮到這些因素,最終選擇將api封裝為jar包,並生成相應的文檔。
首先看一個錯誤案例:

錯誤例子
url沒有使用全局變量,一旦域名變更或者http變為https,你就得滿項目的替換。bug的幾率可以說是飆升。大家千萬別存在僥幸心理說域名和http協議是不會變的。在我封裝的oppo api中就出現了http協議的變更,而360點睛api出現了域名的變更(這種事情不可以不預防)。再者上面的傳參是存在問題的。個人認為應該寫成javaBean,並且bean中要有注釋,不然可能出現開發人員過段時間不知道字段什么意思了,或者開發者塊的程序員離職了,下一個開發者的人完全不知道這寫的什么。
雖然說像oppo會給你一份pdf文檔,告訴你傳遞哪些參數。360點睛是提供的html頁面。但是在開發中難道還要找文檔去編碼嗎。多影響效率而且代碼會寫的很亂,一個人一個樣。后期一旦出現問題,有的程序員會記錄調用api的日志,但是有的人沒有記錄,找bug時,無論是對於管理人還是開發人都是頭疼的事。所以在封裝api的前期就一定得把好脈。
綜上所述,我選擇封裝成jar包,放在svn上,誰要是使用,就下載jar包,放在自己的項目里。而且這個jar包我只讓一個人管理開發,其他人只管使用jar包。這樣后期出問題可以直接定位到人。
現在說下如何封裝(我拿今日頭條的API說下)
1、首先我要有一個全局的url定義,目的就是一旦出現域名或者協議變更,更改一處代碼就OK了,如圖:

全局URL
2、封裝HTTP請求,(GET、POST),並記錄詳細日志【我使用的HttpClient,也可以使用別的,如java自帶的】

自己封裝請求
這里詳細的記錄,請求數據,返回數據,消耗時間。這么寫后開發人員完全就不必關心日志的問題,而且一旦http改成https在這里修改一下就可以了。
3、定義實體類(javaBean)【請求bean、返回bean】,這塊是最煩人的,看着返回的json,一個一個字段的寫。我教個簡單的。

json示例
如圖中的這個json,訪問此url:http://www.bejson.com/json2javapojo/new/

直接生成javaBean
把json放在里面會自動為我們生成bean,很方便吧。
4、對外提供方法,供別人調用(通過javadoc生成文檔),如圖:

提供外部調用
這樣如果別人想要獲取代理商下的廣告主ID列表,直接調用AccountService.getAdvertiserList(xx,xx)就可以了,不必關心內部的實現。生成的文檔可以看到。

文檔1
點擊進去看詳細參數

文檔詳細描述
在點擊AccountParams看詳細參數

參數描述
到此api封裝就完事了。這里說下如何將json數據轉為javaBean。看到我上面代碼的應該知道我使用的是Gson
最簡單的實現就是:
response = (AccountClientLoginResponse) gson.fromJson(result,
AccountClientLoginResponse.class);
AccountClientLoginResponse就是你想轉為的bean。
復雜些的如帶泛型:
response = gson.fromJson(jsonStr,
new TypeToken<BasicsResponse<ConvertInfo>>() {
}.getType());
這2個內容,我放在下一篇文章說。喜歡的可以關注下,等待我下次更新。
總結:在一些公司調用第三方api如:oppo、vivo、頭條、360,這些api不知道什么時候會更新,為了為會期的維護和開發着想,一定要對api統一管理。避免牽一發而動全身