Flutter网络请求插件dio封装

dio是flutter比较常用的网络请求框架,下面是对dio简单封装,便于以后使用

添加依赖

dependencies
  dio: ^2.1.0
复制代码

代码说明详见注释

完整的代码如下


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了

调用

String url = Api.discover;
var jsonString = await httpUtil.get(url);
复制代码

这里jsonString便是一个json格式的数据了,还需要将其转化为实体类需要用到另一个开源库json_serializable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值