Flutter学习之旅~Http请求封装

刚开始接触Flutter,需要封装一个Http请求文件。废话不多直接上代码

1.设置全局变量,用来缓存Token信息

class Global {
  static String _tokenId = "";

  Global() {
    _tokenId = "";
  }

  //设置token信息
  static void setTokenId(val) {
    _tokenId = val;
  }

  //调用tokenId信息
  static String getTokenId() {
    return _tokenId;
  }

}

1.封装Http请求信息

import 'package:dio/dio.dart';
import 'package:/common/global.dart';

class HttpUtil {
  //实例化对象
  static HttpUtil _instance;
  Dio _dio;
  BaseOptions _options;

  CancelToken cancelToken = new CancelToken();

  static HttpUtil getInstance() {
    if (null == _instance) _instance = new HttpUtil();
    return _instance;
  }

  /*
   * config it and create
   */
  HttpUtil() {
    //BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数
    var baseOptions = new BaseOptions(
      //请求基地址,可以包含子路径
      baseUrl: "http://127.0.0.1:8080",

      //连接服务器超时时间,单位是毫秒.
      connectTimeout: 30000,
      //响应流上前后两次接受到数据的间隔,单位为毫秒。
      receiveTimeout: 120000,
      //Http请求头.
      headers: {
        "Accept": "application/json",
        //do something
        "TokenId": Global.getTokenId(),
      },
      //请求的Content-Type,默认值是[ContentType.json]. 也可以用ContentType.parse("application/x-www-form-urlencoded")
      contentType: "application/json",
      //表示期望以那种格式(方式)接受响应数据。接受三种类型 `json`, `stream`, `plain`, `bytes`. 默认值是 `json`,
      responseType: ResponseType.json,
    );

    _options = baseOptions;
    _dio = new Dio(_options);
  }

  //设置初始化信息
  setBaseOptions(String tokenId) async {
    var baseOptions = new BaseOptions(
      //请求基地址,可以包含子路径
      baseUrl: "http://127.0.0.1:8080",
      //连接服务器超时时间,单位是毫秒.
      connectTimeout: 30000,
      //响应流上前后两次接受到数据的间隔,单位为毫秒。
      receiveTimeout: 120000,
      //Http请求头.
      headers: {
        "Accept": "application/json",
        //do something
        "TokenId": tokenId,
      },
      //请求的Content-Type,默认值是[ContentType.json]. 也可以用ContentType.parse("application/x-www-form-urlencoded")
      contentType: "application/json",
      //表示期望以那种格式(方式)接受响应数据。接受三种类型 `json`, `stream`, `plain`, `bytes`. 默认值是 `json`,
      responseType: ResponseType.json,
    );
    _options = baseOptions;
    _dio = new Dio(_options);
  }

  /*
   * get请求(不带参)
   */
  get(url) async {
    Response response;
    try {
      print('get:' + url);
      response = await _dio.get(url);
      // print('get success---------${response.statusCode}');
      print('get success:${response.data}');
      return response.data;
    } catch (e) {
      print('get error:$e');
      formatError(e);
    }
    return null;
  }

  /*
   * get请求参数传参
   */
  getData(url, {data}) async {
    Response response;
    try {
      print('get data:' + url);
      Map<String, dynamic> k = data;
      response = await _dio.get(url, queryParameters: k);
      // print('get success---------${response.statusCode}');
      print('get data success:${response.data}');
      return response.data;
    } catch (e) {
      print('get data error:$e');
      formatError(e);
    }
    return null;
  }

  /*
   * post请求,对象传参
   */
  postData(url, {data}) async {
    Response response;
    try {
      print('post data:' + url);
      response = await _dio.post(url, data: data);
      print('post data success:${response.data}');
      return response.data;
    } on DioError catch (e) {
      print('post data error:$e');
      formatError(e);
    }
    return null;
  }

  /*
   * post请求,参数传参
   */
  postParam(url, {data}) async {
    Response response;
    Map<String, dynamic> k = data;
    try {
      print('post param:' + url);
      response = await _dio.post(url, queryParameters: k);
      print('post param success:${response.data}');
      return response.data;
    } on DioError catch (e) {
      print('post param error:$e');
      formatError(e);
    }
    return null;
  }

  /*
   * 下载文件
   */
  downloadFile(urlPath, savePath) async {
    Response response;
    try {
      print('download :' + urlPath);
      response = await _dio.download(urlPath, savePath,
          onReceiveProgress: (int count, int total) {
        //进度
        print("现在进度: 当前:$count  总:$total");
      });
      if (response.data.statusCode == 200) {
        print('文件下载完成!:${response.data}');
        return true;
      }
    } on DioError catch (e) {
      print('downloadFile error:$e');
      formatError(e);
    }
    return false;
  }

  /*
   * 异常处理
   */
  void formatError(DioError e) {
    if (e.type == DioErrorType.CONNECT_TIMEOUT) {
      // It occurs when url is opened timeout.
      print("连接超时");
    } else if (e.type == DioErrorType.SEND_TIMEOUT) {
      // It occurs when url is sent timeout.
      print("请求超时");
    } else if (e.type == DioErrorType.RECEIVE_TIMEOUT) {
      //It occurs when receiving timeout
      print("响应超时");
    } else if (e.type == DioErrorType.RESPONSE) {
      // When the server response, but with a incorrect status, such as 404, 503...
      print("出现异常");
    } else if (e.type == DioErrorType.CANCEL) {
      // When the request is cancelled, _dio will throw a error with this type.
      print("请求取消");
    } else {
      //DEFAULT Default error type, Some other Error. In this case, you can read the DioError.error if it is not null.
      print("未知错误");
    }
  }
}

3.接口调用方式

import '/utils/httpUtils.dart';

HttpUtil _httpUtil;

@override
void initState() {
    _httpUtil = new HttpUtil();
}

//Body调用
var data = await _httpUtil.postData("/api/postData", data: {"a": '123'});

//参数调用
var data = await _httpUtil.getData("/api/getData", data: {"a": "123"});

//无参调用
var data = await _httpUtil.get('/api/get');

//post 参数调用
var data = await _httpUtil.postParam('/api/postParam', data: {"a": "123"});
if (data != null) {
    //重新刷新界面
    setState(() {});
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值