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

相关文章
相关标签/搜索