likes
comments
collection
share

Flutter网络请求,快速构建高效接口调用系统

作者站长头像
站长
· 阅读数 1

  在 Flutter 开发中,我们经常需要进行网络请求,而 Dio 是一个强大的网络请求库,支持多种请求方式,具有高效、简洁的特点。但是每次发起请求时都需要编写一些公共代码,如设置请求头、处理错误等,这些代码会让我们的业务逻辑变得繁琐,为了提高开发效率,我们可以将这些公共代码进行封装,方便我们在业务中直接调用。

封装思路

本文将以 GET 请求为例,介绍如何基于 Dio 进行网络请求的封装。

  1. 我们需要封装一个基础请求类,其中包含一些公共的配置和方法,比如设置请求头、处理错误等。
  2. 我们需要封装一个具体的请求类,继承自基础请求类,用于处理业务相关的请求。
  3. 我们将具体的请求类进行组合,形成一个完整的网络请求工具类。

基础请求类封装

我们首先来封装一个基础请求类,包含以下功能:

  • 设置请求头
  • 处理错误
import 'dart:convert';

import 'package:dio/dio.dart';

class BaseRequest {
  Dio dio;

  BaseRequest() {
    dio = Dio();
    dio.options.headers = {
      'Content-Type': 'application/json;charset=UTF-8',
    };
  }

  Future<Map<String, dynamic>> get(String path,
      {Map<String, dynamic> queryParameters}) async {
    try {
      Response response = await dio.get(path, queryParameters: queryParameters);
      return json.decode(response.toString());
    } on DioError catch (e) {
      if (e.response != null) {
        // 请求成功,但是服务器返回错误信息
        return json.decode(e.response.toString());
      } else {
        // 请求失败
        throw Exception('网络异常,请稍后重试');
      }
    }
  }
}

  上述代码中,我们定义了一个 BaseRequest 类,其中包含了一个 Dio 实例,我们在构造函数中设置了默认的请求头。

  在 get 方法中,我们首先通过 Dio 实例发起 GET 请求,同时可以传入一些查询参数。如果请求成功,我们将响应数据转为 Map 类型返回;如果请求失败,我们通过判断错误类型,处理不同的错误信息。

具体请求类封装

  接下来,我们来封装一个具体的请求类,用于处理业务相关的请求。我们假设需要请求一个文章列表接口,返回的数据结构如下:

{
    "code": 0,
    "message": "success",
    "data": [{
            "id": 1,
            "title": "Flutter 实战",
            "author": "张三",
            "create_time": "2022-01-01 10:00:00"
        }, {
            "id": 2,
            "title": "Dart 语言",
            "author": "李四",
            "create_time": "2022-01-02 10:00:00"
        }
    }

  为了封装文章列表接口请求,我们可以定义一个 ArticleRequest 类,继承自基础请求类,并且添加一个获取文章列表的方法 getArticles,具体代码如下:

class ArticleRequest extends BaseRequest {
  Future<Map<String, dynamic>> getArticles() async {
    return await get('/articles');
  }
}

  上述代码中,我们定义了一个 ArticleRequest 类,继承自 BaseRequest 类,因此我们可以直接使用 get 方法来发起 GET 请求。

  在 getArticles 方法中,我们调用了父类的 get 方法,传入了文章列表接口的路径,同时返回响应数据。

完整网络请求工具类封装

最后,我们将具体的请求类进行组合,形成一个完整的网络请求工具类。具体代码如下:

class Http {
  static ArticleRequest articleRequest = ArticleRequest();

  static Future<Map<String, dynamic>> getArticles() async {
    return await articleRequest.getArticles();
  }
}

  上述代码中,我们定义了一个 Http 类,其中包含一个 ArticleRequest 类型的实例,我们可以通过该实例来发起文章列表接口的请求。

  同时,我们定义了一个 getArticles 方法,该方法调用了 ArticleRequest 类的 getArticles 方法,用于获取文章列表数据。