文档章节

Flutter 封装 dio,支持 Restful Api

dkvirus
 dkvirus
发布于 01/31 20:58
字数 721
阅读 398
收藏 0

背景

Dio 是 Flutter 第三方开源的网络请求库,直接使用原生 api 有点冗余,二次封装使用更加方便。

为什么要封装 dio?

做一些公共处理。

要做哪些公共处理?

  • 统一处理请求前缀;(https://novel.dkvirus.com/api/v1 不用每个请求都加这个前缀)
  • 统一打印请求信息;
  • 统一打印响应信息;
  • 统一打印报错信息;
  • 返回数据自动转 json 格式;

如果你是 Flutter 新手,just 想要发送网络请求,这个封装的工具类就显得很有用了,copy and use it.

快速开始

添加 dio 依赖

编辑 项目根目录/pubspec.yaml,找到 dependecies 属性,添加 dio 依赖。

dependencies:
  flutter:
    sdk: flutter

  dio: 1.0.13

添加工具类

新建 项目根目录/utils/HttpUtils.dart,将下面内容 copy 进去。

import 'package:dio/dio.dart';
import 'dart:async';

/*
 * 封装 restful 请求
 * 
 * GET、POST、DELETE、PATCH
 * 主要作用为统一处理相关事务:
 *  - 统一处理请求前缀;
 *  - 统一打印请求信息;
 *  - 统一打印响应信息;
 *  - 统一打印报错信息;
 */
class HttpUtils {

  /// global dio object
  static Dio dio;

  /// default options
  static const String API_PREFIX = 'https://novel.dkvirus.com/api/v1';
  static const int CONNECT_TIMEOUT = 10000;
  static const int RECEIVE_TIMEOUT = 3000;

  /// http request methods
  static const String GET = 'get';
  static const String POST = 'post';
  static const String PUT = 'put';
  static const String PATCH = 'patch';
  static const String DELETE = 'delete';

  /// request method
  static Future<Map> request (
    String url, 
    { data, method }) async {

    data = data ?? {};
    method = method ?? 'GET';

    /// restful 请求处理   
    /// /gysw/search/hist/:user_id        user_id=27
    /// 最终生成 url 为     /gysw/search/hist/27
    data.forEach((key, value) {
      if (url.indexOf(key) != -1) {
        url = url.replaceAll(':$key', value.toString());
      }
    });

    /// 打印请求相关信息:请求地址、请求方式、请求参数
    print('请求地址:【' + method + '  ' + url + '】');
    print('请求参数:' + data.toString());

    Dio dio = createInstance();
    var result;

    try {
      Response response = await dio.request(url, data: data, options: new Options(method: method));

      result = response.data;

      /// 打印响应相关信息
      print('响应数据:' + response.toString());
    } on DioError catch (e) {
      /// 打印请求失败相关信息
      print('请求出错:' + e.toString());
    } 

    return result;
  }

  /// 创建 dio 实例对象
  static Dio createInstance () {
    if (dio == null) {
      /// 全局属性:请求前缀、连接超时时间、响应超时时间
      Options options = new Options(
          baseUrl: API_PREFIX,
          connectTimeout: CONNECT_TIMEOUT,
          receiveTimeout: RECEIVE_TIMEOUT,
      );

      dio = new Dio(options);
    }

    return dio;
  }

  /// 清空 dio 对象
  static clear () {
    dio = null;
  }

}

使用示例

import 'dart:async';
import '../utils/HttpUtils.dart';

// GET 请求
// 返回的结果直接就是 json 格式
// 要使用 await,必须在方法名后面加上 async
_handleGetShelf () async {
  var result = await HttpUtils.request(
    '/gysw/shelf', 
    method: HttpUtils.GET,
    data: {
      'id': 1,
    }
  );
}


// POST 请求
_handleAddShelf () async {
  var result = await HttpUtils.request(
    '/gysw/shelf', 
    method: HttpUtils.POST,
    data: {
      'id': 1,
    }
  );
}

// PUT 请求
_handleEditShelf () async{
  var result = await HttpUtils.request(
    '/gysw/shelf/:id', 
    method: HttpUtils.PUT,
    data: {
      'id': 1,
    }
  );
}

// DELETE 请求
_handleDelShelf () async {
  var result = await HttpUtils.request(
    '/gysw/shelf/:id', 
    method: HttpUtils.DELETE,
    data: {
      'id': 1,
    }
  );
}

最后

如果在使用过程遇到问题,欢迎下方留言交流。

© 著作权归作者所有

共有 人打赏支持
dkvirus
粉丝 34
博文 119
码字总数 116803
作品 0
六安
程序员
私信 提问
Flutter Http库Dio 2.1正式发布

Dio 是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等。目前Dio在pub上综合得分100分,排名已上榜pub首页(Al...

wendux
03/12
0
0
强大的Flutter Http请求开源库-dio

dio是Flutter中文网开源的一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时等... 文档语言: English | 中文简体 dio 一个强大的D...

lazydu
2018/05/23
0
0
Flutter完整开发实战详解(二、 快速开发实战篇)

 作为系列文章的第二篇,继《Flutter完整开发实战详解(一、Dart语言和Flutter基础)》之后,本篇将为你着重展示:如何搭建一个通用的Flutter App 常用功能脚手架,快速开发一个完整的 Flutte...

恋猫月亮
2018/08/06
0
0
从零学习Fluter(五):Flutter中手势滑动拖动已经网络请求

从六号开始搞Flutter,到今天写这篇blog已经过了4天时间,文档初步浏览了一遍,写下了这个demo。demo源码分享在github上,现在对flutter有种说不出的喜欢了。大家一起搞吧! 废话不多说,开始...

topbrids
2018/12/09
0
0
一个前端码农的 Flutter 实战经验

前言 当年React Native 正火的时候,我撸了一个一席的客户端,最近抽空把我自己的项目用Flutter 写一下,项目地址戳这里,走过路过随手给个star🌟,不胜感激; 以下是作为前端对Flutter 的...

evont
03/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitmq安装教程

RabbitMQ有Windows与Linux版本的,这里先写Windows版本的安装。 以前安装软件总是在百度上找某某安装教程,结果能按照教程安装好的软件真的不多。想起先前以为大牛说的一句话,去官网按照官网...

em_aaron
今天
5
0
Android 贝塞尔曲线实践——波浪式运动

一、波浪效果如下 贝塞尔曲线自定义波浪效果的案例很多,同样方法也很简单,大多数和本案例一样使用二次贝塞尔曲线实现,同样还有一种是PathMeasure的方式,这里我们后续补充,先来看贝塞尔曲...

IamOkay
今天
2
0
Nmap之防火墙/IDS逃逸

选项 解释 -f 报文分段 --mtu 指定偏移大小 -D IP欺骗 -sI 原地址欺骗 --source-port 源端口欺骗 --data-length 指定发包长度 --randomize-hosts 目标主机随机排序 --spoof-mac Mac地址欺骗 ...

Frost729
今天
2
0
带你搭一个SpringBoot+SpringData JPA的环境

不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData JPA可以分分钟上手的。 其实我在学完SpringBoot和SpringData JPA了之...

java菜分享
今天
7
0
Chocolatey 在Window搭建一个开发环境

在看了(利用 Chocolatey 快速在 Windows 下搭建一个开发环境)后,准备从零开始 一、准备工作 1、用管理员权限启动:powershell,执行错误请参考(PowerShell因为在此系统中禁止执行脚本的解...

近在咫尺远在天涯
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部