網絡框架的封裝(一):第一層參數組裝層的API設計

什么是分層

app的架構,不管是MVC,MVP,MVVM,架構演變中,貫穿始終的概念都是分層和解耦.那么這個分層和解耦怎么體現出來?
簡單地說就是,我這一層接收上一層的輸入,上一層的你別管我怎么處理,我最終會給你一個輸出/返回值,你完全不用理會我是怎么處理的,只要有輸入,就會有輸出,而且一般是通過一個簡單的方法的調用來實現.

那么,對于app中常用的網絡層來說,怎么樣的封裝才是最合理的?

我們的口號是:一行代碼完成網絡請求!

其實非常簡單,看接口文檔你就知道了怎么做了:就傳那些個參數,返回就是那個json之類的.把接口文檔轉化為我們調用的一個方法,這網絡層與上層的接口就可以說是設計好了.

最常見的字符流請求:

接口文檔寫了什么:(百度圖片隨便找的一個)

所以,我們網絡層應該封裝成這樣一個方法:

傳入:

請求方式,url路徑,請求的參數key和值
注: 對于多個POST請求參數key-value,有的接口會定義成Map形式,有的會定義成Json形式.其實本質上都是一樣的,都是在requestBody上POST一個字符串(字符流)出去,只不過前者的形式是a=4&t=5的形式,而后者是一個json形式.
總體上來講,還是前者比較多見,畢竟參數拼接形式與GET請求一致,服務器端處理比較方便.

輸出/返回:

對于返回字符流數據的情況,可以歸納為返回一個String對象,怎么處理就看具體情況了.

app中常見的是返回json格式的字符串.當然,一般app里需要的是解析好的javabean,那么網絡框架接口應該能直接返回一個解析好的javabean.

當然,更進一步來看,大多數規范的api(看看各大api市場,比如聚合api之類的)返回的json格式都具備以下特點:

一般為三個字段,分別表示狀態碼,相關提示信息,以及一個用于攜帶數據的字段.(比如:{"code":0,"msg":"登錄成功","data":{...}}).攜帶數據的字段可以攜帶任何類型的數據,null,數字,字符串,jsonObject,JsonArray都可以.
在這里,我把這種三個字段的json稱為"標準格式的json"

封裝好的方法:

getString(String url, Map map, MyNetListener listener)//get請求,返回一個string,拿到這個string
postString( String url,  Map map,  MyNetListener listener)

getCommonJson(String url, Map map, Class clazz, MyNetListener listener)//get請求,返回一個json,將整個json解析成javabean
postCommonJson(String url, Map map, Class clazz, MyNetListener listener)

getStandardJson(String url, Map map, Class clazz, MyNetListener listener)//get請求,返回一個標準格式的json
postStandardJson(String url, Map map, Class clazz, MyNetListener listener) //post請求,返回一個標準格式的json,通過傳入的clazz,直接解析返回data字段的javabean

//如果參數以json形式發出,那么再調用方法setParamsAsJson()即可.

上傳和下載

下載:

一般是GET請求,傳入url.請求參數可有可無.最終下載得到一個文件(路徑可預先指定),并且在下載的過程中有進度的回調.
注意: 我上面一層不需要知道你的什么網絡流啊,斷點下載啊,分片多線程下載之類的細節.

download(String url, String savedpath, MyNetListener callback)

上傳

POST請求,傳入url,請求參數,文件相關的key名,文件的地址,最終返回一個結果(成功或失敗),并且在上傳的過程中有進度回調.
同樣的,上一層不需要知道里面具體的header設置啊,斷點續傳啊,分片上傳之類的細節.
注意: http是支持多文件上傳的.

upLoad(String url, Map<String,String> params,Map<String,String> files, MyNetListener callback)

你說還有很常見的拉取網絡圖片并顯示在imageview中?
那就是圖片加載框架的事兒了,不應該交給網絡框架處理.推薦fresco,以及我的這個FrescoUtils.

以上api的思維導圖概覽

基本api.jpg

返回的數據:統一的回調

回調采用抽象類的形式,而不是接口的形式

public void onPreExecute() {}//統一的開始
public void onFinish(){}//統一的結束

public  void onEmpty(){}//內容為空時--一般用在返回空的jsonArray時([]).


//成功的幾種情況:
public abstract void onSuccess(T response,String resonseStr);//主回調

public  void onSuccessArr(List<T> response,String resonseStr){}//主回調,需要時復寫

public  void onSuccessObj(T response,String responseStr,String data,int code,String msg){
        onSuccess(response,responseStr);
}

public  void onSuccessArr(List<T> response, String responseStr, String data, int code, String msg){
    onSuccessArr(response,responseStr);
}

//失敗的回調

public void onError(String msgCanShow) {}//主回調

 public void onUnFound() {
    onError("沒有找到該內容");
}
public    void onUnlogin(){
    onError("您還沒有登錄");
}


 public void onCodeError(String msgCanShow,String hiddenMsg,int code) {
    if (TextUtils.isEmpty(msgCanShow)){
        onError("錯誤碼為:"+code);
    }else {
        onError(msgCanShow);
    }
}

//進度回調
public void onProgressChange(long fileSize, long downloadedSize) {}

自定義請求時的一些參數

沒什么好說的,直接看圖,清晰明了

自定義設置的api.jpg

一個請求示例

            Map map8 = new HashMap<>();
            map8.put("versionName","1.0.0");
            map8.put("appType",0);
            MyNetApi.postStandardJson("http://app.xxtt.com:9090/app/appVersion/getLatestVersion",
                    map8, VersionInfo.class, new MyNetListener<VersionInfo>() {
                        @Override
                        public void onSuccess(VersionInfo response, String resonseStr) {
                            Logger.e(resonseStr);
                        }

                        @Override
                        public void onError(String msgCanShow) {
                            super.onError(msgCanShow);
                            Logger.e(msgCanShow);
                        }
                    })
                    .setParamsAsJson()
                    .setIsAppendToken(false)
                    .setCustomCodeValue(1,2,3)
                    .start();

代碼

https://github.com/hss01248/NetWrapper

附圖:整體層次圖

ps.是的,我沒有用逼格比較高的Rxjava,主要是因為比較習慣回調模式,這種模式下,代碼的聚合度比較高.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容

  • AFHTTPRequestOperationManager 網絡傳輸協議UDP、TCP、Http、Socket、X...
    Carden閱讀 4,372評論 0 12
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,828評論 18 139
  • 點擊查看原文 Web SDK 開發手冊 SDK 概述 網易云信 SDK 為 Web 應用提供一個完善的 IM 系統...
    layjoy閱讀 13,853評論 0 15
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,074評論 6 13
  • 今天中午陪孩子們一起看《龍貓》,感受什么是“富強、民主、和諧”。當看到小梅得知媽媽的病情惡化便抱著玉米棒向連大人都...
    枧文閱讀 359評論 0 0