Flutter | 工程中网络请求工具的使用

154 阅读2分钟

image.png 开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

前言

在真实的项目中,往往都需要涉及到网络请求。在这篇文章中,我们将理解Flutter中的网络请求,以及介绍目前比较流行的网络请求库Dio,在最后为大家提供一种工具类的封装方式的思路。

正文

在Flutter中,Http网络请求的实现主要分为三种:io.dart里的HttpClient实现、Dart原生http请求库(需要依赖)实现、第三方库实现。

1.HttpClient

这是Flutter中自带的io包提供的一个方法,提供了一些比较基础的请求方式,缺点就是无法处理复杂的数据格式以及请求,例如POST方法中的有几种Body请求体传输内容类型部分还无法支持,如:multipart/form-data这个类型传输还不支持。假如要使用这个库,还是要看看自己的业务需求是否不是很复杂。

2.http库

这是Flutter没有集成的一个库,需要自己在yaml中配置。也可以直接前往pub.dev官网查看

dependencies:
  http: ^0.13.5

使用起来也比较方便:

http.get('https://www.baidu.com')
    .then((onValue) {
        print("get方式->status: ${onValue.statusCode}");
        print("get方式->body: ${onValue.body}");
    }
);

若需要保持一个长连接,也可以使用client

var client = http.Client();
try {
  var response = await client.post(
      Uri.https('example.com', 'whatsit/create'),
      body: {'name': 'doodle', 'color': 'blue'});
  var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)) as Map;
  var uri = Uri.parse(decodedResponse['uri'] as String);
  print(await client.get(uri));
} finally {
  client.close();
}

3.Dio库

这是目前使用比较多的库。我们这篇文章最后提供的封装思路也是基于这个库。获取方法跟http库差不多,这里就不再赘述。

4. 工具类

下面直接进行分析。在很多时候,我们对后端的服务器发送请求后,返回的数据都是有固定格式的。因此我们假设有以下数据类:

class CallBack {
  bool? success; //请求成功或失败
  int? state; // 状态
  String? info; // 信息
  Map<String, dynamic>? data;// 数据

  CallBack({this.success, this.state, this.info, this.data});

  factory CallBack.fromJson(Map<String, dynamic> json) {
    return CallBack(
        success: json['success'],
        state: json['state'],
        info: json['info'],
        data: json['data']);
  }
}

这些数据均是要与服务器进行对接。并且由于所有返回前端的数据都是这个格式,因此,我们可以在工具类中对请求的数据统一返回这个格式。

Future<CallBack> getResponse(var url,{Options? options}) async {
  try {
    Response response;
    if (options != null)
      response =
      await Dio().get(url, options: options);
    else
      response = await Dio().get(url);
    final jsonMap = json.decode(response.toString());
    CallBack callBack = CallBack.fromJson(jsonMap);
    return callBack;
  } catch (e) {
    print(e);
  }
  return CallBack(success: false);
}

而后,我们可以将很多种请求封装在一个类中,在项目中就可以直接调用啦!

使用这种工具类的好处就是,万一到时候我们要更换请求库,比如从Dio换成http,那我们直接在工具类中修改即可,无需对到项目中用到请求的地方中逐个逐个修改。