Flutter網絡請求插件dio封裝

dio是flutter比較經常使用的網絡請求框架,下面是對dio簡單封裝,便於之後使用git

添加依賴

dependencies
  dio: ^2.1.0
複製代碼

代碼說明詳見註釋github

完整的代碼以下

import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio/dio.dart';
import 'package:kuaixin/network/Api.dart';
var httpUtil = HttpUtil(
    baseUrl:Api.baseUrl,
    header:headers
);
var httpUtilJson = HttpUtil(
    baseUrl:Api.baseUrl2,
    header:headersJson
);

//普通格式的header
Map<String, dynamic> headers = {
  "Accept":"application/json",
//  "Content-Type":"application/x-www-form-urlencoded",
};
//json格式的header
Map<String, dynamic> headersJson = {
  "Accept":"application/json",
  "Content-Type":"application/json; charset=UTF-8",
};
class HttpUtil {
  Dio dio;
  BaseOptions options;

  HttpUtil({String baseUrl= Api.baseUrl,Map<String, dynamic> header}) {
    print('dio賦值');
    // 或者經過傳遞一個 `options`來建立dio實例
    options = BaseOptions(
      // 請求基地址,通常爲域名,能夠包含路徑
      baseUrl: baseUrl,
      //鏈接服務器超時時間,單位是毫秒.
      connectTimeout: 10000,
      //[若是返回數據是json(content-type),dio默認會自動將數據轉爲json,無需再手動轉](https://github.com/flutterchina/dio/issues/30)
      responseType:ResponseType.plain,
      ///  響應流上先後兩次接受到數據的間隔,單位爲毫秒。若是兩次間隔超過[receiveTimeout],
      ///  [Dio] 將會拋出一個[DioErrorType.RECEIVE_TIMEOUT]的異常.
      ///  注意: 這並非接收數據的總時限.
      receiveTimeout: 3000,
      headers: header,
    );
    dio = new Dio(options);
    dio.interceptors.add(CookieManager(CookieJar()));
  }

  get(url, {data, options, cancelToken}) async {
    print('get請求啓動! url:$url ,body: $data');
    Response response;
    try {
      response = await dio.get(
        url,
        cancelToken: cancelToken,
      );
      print('get請求成功!response.data:${response.data}');
    } on DioError catch (e) {
      if (CancelToken.isCancel(e)) {
        print('get請求取消! ' + e.message);
      }
      print('get請求發生錯誤:$e');
    }
    return response.data;
  }

  post(url, {data, options, cancelToken}) async {
    print('post請求啓動! url:$url ,body: $data');
    Response response;
    try {
      response = await dio.post(
        url,
        data: data,
      );
      print('post請求成功!response.data:${response.data}');
    } on DioError catch (e) {
      if (CancelToken.isCancel(e)) {
        print('post請求取消! ' + e.message);
      }
      print('post請求發生錯誤:$e');
    }
    return response.data;
  }
}

複製代碼

以前有個bug一直困擾我好久,獲取到的json數據key,value都不帶引號,致使解析失敗,又來加上responseType:ResponseType.plain 這句就ok了json

調用

String url = Api.discover;
var jsonString = await httpUtil.get(url);
複製代碼

這裏jsonString即是一個json格式的數據了,還須要將其轉化爲實體類須要用到另外一個開源庫json_serializablebash

相關文章
相關標籤/搜索