博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dio封装
阅读量:4084 次
发布时间:2019-05-25

本文共 2734 字,大约阅读时间需要 9 分钟。

dio

dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时等…

我们的网络请求就是在dio的基础上封装的 . 所以要引入dio包.

添加依赖

dependencies:
  dio: ^3.0.5  // 请使用pub上的最新版本
HttpUtil
 /*
 * author: Created by 李卓原 on 2019/11/21.
 * email: zhuoyuan93@gmail.com
 * https://blog.csdn.net/u011272795/article/details/82765544
 */
import 'package:daily_news/config/constant.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

class Http {

  static BaseOptions options = BaseOptions(
    // 请求基地址,可以包含子路径,如: "https://www.google.com/api/".
    baseUrl: "https://www.google.com/api/",
    //连接服务器超时时间,单位是毫秒.
    connectTimeout: 5000,

    ///  响应流上前后两次接受到数据的间隔,单位为毫秒。如果两次间隔超过[receiveTimeout],

    ///  [Dio] 将会抛出一个[DioErrorType.RECEIVE_TIMEOUT]的异常.
    ///  注意: 这并不是接收数据的总时限.
    receiveTimeout: 3000,
    headers: {},
  );

  static Dio dio = Dio(options);

  static Future get({

    @required String path,
    Map<String, String> data = const {},
    options,
    cancelToken,
  }) async {
    print('get请求启动! url:$path ,body: $data');
    Response response;
    data.addAll({'key': newsKey});

    try {

      response = await dio.get(
        path,
        queryParameters: data,
        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;
  }

  static Future post({

    @required String path,
    Map<String, String> data = const {},
    options,
    cancelToken,
  }) async {
    print('post请求启动! url:$path ,body: $data');
    Response response;
    data.addAll({'key': newsKey});

    try {

      response = await dio.post(
        path,
        data: data,
        cancelToken: cancelToken,
      );
      print('post请求成功!response.data:${response.data}');
    } on DioError catch (e) {
      if (CancelToken.isCancel(e)) {
        print('post请求取消! ' + e.message);
      }
      print('post请求发生错误:$e');
    }
    return response.data;
  }
}

使用
import ‘package:flutter_oschina/utils/HttpUtil.dart’;

  Future fetchNews({String type = ''}) async {

    await Http.get(path: 'index', data: {'type': type});
  }
更新:
本文写的时候是在dio1.x版本,现在已更新到2.x版本, Options中的baseUrl从Options移到了BaseOptions , 请查看下面的内容

Options

Options对象包含了对网络请求的配置,在1.x中无论是实例配置还是单次请求的配置都使用的是Options 对象,这样会带来一些二义性,甚至有时会让开发者感到疑惑,比如Options.baseUrl属性代表请求基地址,理论上它只应该在实例配置中设置,而不应该出现在每次请求的配置中;再比如Options.path属性,它代表请求的相对路径,不应该在实例请求配置中。2.1中将请求配置分拆成三个类:

| 类名 | 作用 |

| -------------- | ----------------------------------------------- |

| BaseOptions | Dio实例基配置,默认对该dio实例的所有请求生效 |

| Options | 单次请求配置,可以覆盖BaseOptions中的同名属性 |

| RequestOptions | 请求的最终配置,是对Option和BaseOptions合并后的 |

另外,添加了一些新的配置项:

cookies:可以添加一些公共cookie

receiveDataWhenStatusError:当响应状态码不是成功状态(如404)时,是否接收响应内容,如果是false,则response.data将会为null

maxRedirects: 重定向最大次数。

————————————————
版权声明:本文为CSDN博主「__卓原」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011272795/article/details/82765544

你可能感兴趣的文章
Flutter key
查看>>
Flutter 组件通信(父子、兄弟)
查看>>
Flutter Animation动画
查看>>
Flutter 全局监听路由堆栈变化
查看>>
Flutter学习之插件开发、自定义字体、国际化
查看>>
Android 混合Flutter之产物集成方式
查看>>
Flutter混合开发二-FlutterBoost使用介绍
查看>>
Flutter 混合开发框架模式探索
查看>>
Flutter 核心原理与混合开发模式
查看>>
Flutter Boost的router管理
查看>>
Android Flutter混合编译
查看>>
微信小程序 Audio API
查看>>
[React Native]react-native-scrollable-tab-view(进阶篇)
查看>>
Vue全家桶+Mint-Ui打造高仿QQMusic,搭配详细说明
查看>>
React Native for Android 发布独立的安装包
查看>>
React Native应用部署/热更新-CodePush最新集成总结(新)
查看>>
react-native-wechat
查看>>
基于云信的react-native聊天系统
查看>>
网易云音乐移动客户端Vue.js
查看>>
JavaScript异步函数
查看>>