Flutter開發(fā)對于Http對于網絡請求的封裝及Json數(shù)據處理
目錄
前言
????自谷歌在2018大會公布Beta1也有了一段時間,這段時間以來flutter也越來越熱。這段時間我也對Flutter進行了一些學習秉犹,今天準備把一些學的內容進行整理,一是為了梳理下學習的一些知識節(jié)點,二是通過一些封裝整理,方便后期如過需要使用flutter開發(fā)可以快速搭建基礎組件進行開發(fā)跑杭。
目錄結構
對于項目,我做了如上一些目錄區(qū)分:
dao:主要做一些接口調用及邏輯處理咆耿。
exts:做一些擴展累比如callback等德谅。
http:對網絡請求dio的再次封裝。
json:對數(shù)據json解析接口定義萨螺。
model:對bean類的定義窄做。
viewmodel:對頁面數(shù)據集合類。
這篇文章中屑迂,主要是對http和json解析兩塊的封裝使用浸策。
HTTP
Dio
????dio作為一個強大的Drat Http開源請求庫,我們已經可以很方便的使用它進行一些網絡請求惹盼,但我對它進行了二次封裝庸汗,主要是一些配置的統(tǒng)一設置和一些邏輯的統(tǒng)一處理。
????我們先來看DioUtil類手报,這里我采用單例模式來創(chuàng)建dio對象蚯舱,并默認設置了baseurl,也可以在項目啟動使用通過init()方法設置Options來初始化配置掩蛤。
http
????在HttpUtil中最主要是對dio的request()方法進行封裝枉昏,提供了統(tǒng)一的配置和處理。
其中:
//可以通過mheaders配置公共head
mheaders = new Map<String, dynamic>();
if (handers != null) {
mheaders.addAll(handers);
}
options.headers = mheaders;
????可以通過mheaders配置統(tǒng)一的head及組合由方法傳入的handers組成最終的請求head揍鸟。
static String errorNet = "{\"code\":19,\"msg\":\"網絡錯誤兄裂,請檢查網絡情況\"}";
ConnectUtil.isConnect((val) async {
if (val) {
...
} else {
callback(19, errorNet);
}
}
????在真正請求開始前通過ConnectUtil做網絡情況判斷,因為異步阳藻,所以通過回調方式處理并做預定格式返回錯誤晰奖。(網絡情況判斷通過第三方connectivity框架實現(xiàn))
static String errorMsg = "{\"code\":0,\"msg\":\"數(shù)據訪問錯誤,請檢查\"}";
final code = response.statusCode;
final strJson = response.data.toString();
LogUtil.d("HttpUtil", "code:" + code.toString() + " outdata:" + data);
if (strJson != null && strJson != "") {
if (code != 200) {
callback(0, errorMsg);
} else {
callback(code, strJson);
}
} else {
callback(0, errorMsg);
}
????請求返回后腥泥,如果請求錯誤匾南,也同樣做了統(tǒng)一的錯誤格式返回,同時也可以在這里做統(tǒng)一的錯誤邏輯處理蛔外。
????同時HttpUtil提供get和post兩個簡單的api進行及少量入參即可進行網絡請求蛆楞。
JSON
????因為Flutter中是禁止反射的溯乒,所為我們也就不能使用GSON / Jackson之類的進行序列化和反序列化。然而我們現(xiàn)在很多時間接口請求都是以json格式進行返回的豹爹。那么又怎么樣實現(xiàn)從json到model到轉換呢裆悄。
????在項目中我通過我通過dart:convert中內置的JSON解碼器,它將原始JSON字符串傳遞給JSON.decode() 方法臂聋,然后在返回的Map<String, dynamic>中查找所需的值灯帮,通過手動的方式進行實現(xiàn)。
????首先通過JsonModel設置抽象方法bind(),然后讓所有model類都繼承JsonModel類并實現(xiàn)bind()方法逻住,并且bing方法的參數(shù)為Map類型,所以每個model方法只需先實現(xiàn)中通過map獲取所需的屬性值即可迎献。如下面UserModel類所示瞎访。
????那我們又在什么時候吧json轉換成map的呢?入下圖吁恍,我創(chuàng)建了JsonViewModel類來進行此項操作扒秸。
????在JsonViewModel中通過fromJson()方法傳入json字符串,然后通過json.decode(data)方法解析成map冀瓦。
????因為JsonViewModel也同樣繼承了JsonModel伴奥。所以我們可以bind(jMap["data"]);的形式調研bind方法并傳入對于數(shù)據,并且在JsonViewModel的子類中做具體處理翼闽。
????要注意的是拾徙,我們預先把返回的json格式定義成了code,msg感局,data的形式尼啡,如果預定義的返回格式有修改可以在這邊進行調整。
????至此询微,我們只需要在請求返回時候實例化對應的viewmodel類崖瞭,并調用fromJson()方法就可以得到對于的數(shù)據實體了。
GitHub
要看源碼點這里