Flutter网络请求插件http_dio的使用

Flutter网络请求插件http_dio的使用

在Flutter开发中,http_dio 插件是一个非常强大的网络请求库。它提供了丰富的功能和配置选项,可以轻松地处理各种复杂的网络请求任务。本篇文档将向你展示如何使用 http_dio 进行基本的网络请求操作。

安装dio插件

首先,在你的 pubspec.yaml 文件中添加 dio 依赖:

dependencies:
  flutter:
    sdk: flutter
  dio: ^5.0.0  # 请确保使用最新版本

然后运行 flutter pub get 命令来安装该插件。

基本使用

以下是一个简单的示例,演示了如何使用 dio 发送GET请求并获取响应数据。

import 'package:dio/dio.dart';

void main() async {
  // 创建Dio实例
  Dio dio = Dio();

  try {
    // 发送GET请求
    Response response = await dio.get("https://jsonplaceholder.typicode.com/todos/1");

    // 打印响应结果
    print(response.data);
  } catch (e) {
    // 捕获异常
    print(e);
  }
}

在这个示例中,我们首先创建了一个 Dio 实例。然后,我们使用 dio.get() 方法发送一个GET请求到指定的URL,并等待其完成。如果请求成功,我们将打印响应的数据;如果发生错误,则捕获并打印异常信息。

配置请求参数

dio 提供了丰富的配置选项,允许你自定义请求头、超时时间等。以下示例展示了如何设置请求头和超时时间。

import 'package:dio/dio.dart';

void main() async {
  // 创建Dio实例
  Dio dio = Dio();

  // 设置请求头
  dio.options.headers['content-Type'] = 'application/json';
  dio.options.headers['Authorization'] = 'Bearer your_token_here';

  // 设置超时时间
  dio.options.connectTimeout = 5000; // 5秒
  dio.options.receiveTimeout = 3000; // 3秒

  try {
    // 发送GET请求
    Response response = await dio.get("https://jsonplaceholder.typicode.com/todos/1");

    // 打印响应结果
    print(response.data);
  } catch (e) {
    // 捕获异常
    print(e);
  }
}

处理POST请求

除了GET请求,dio 也支持其他类型的HTTP请求,例如POST请求。以下示例演示了如何发送POST请求并传递JSON数据。

import 'package:dio/dio.dart';

void main() async {
  // 创建Dio实例
  Dio dio = Dio();

  // 设置请求头
  dio.options.headers['content-Type'] = 'application/json';

  // 要发送的数据
  Map<String, dynamic> data = {
    "title": 'foo',
    "body": 'bar',
    "userId": 1,
  };

  try {
    // 发送POST请求
    Response response = await dio.post(
      "https://jsonplaceholder.typicode.com/posts",
      data: data,
    );

    // 打印响应结果
    print(response.data);
  } catch (e) {
    // 捕获异常
    print(e);
  }
}

在这个示例中,我们创建了一个包含要发送数据的 Map 对象,并通过 dio.post() 方法发送POST请求。请求数据被编码为JSON格式并作为请求体的一部分发送。

错误处理

为了更好地处理可能出现的网络错误,你可以使用 try-catch 语句块来捕获并处理这些错误。dio 会抛出一些特定的异常类型,如 DioError,你可以根据不同的错误类型进行相应的处理。

import 'package:dio/dio.dart';

void main() async {
  // 创建Dio实例
  Dio dio = Dio();

  try {
    // 发送GET请求
    Response response = await dio.get("https://jsonplaceholder.typicode.com/todos/1");

    // 打印响应结果
    print(response.data);
  } on DioError catch (e) {
    // 捕获并处理DioError
    if (e.type == DioErrorType.connectTimeout) {
      print("连接超时");
    } else if (e.type == DioErrorType.receiveTimeout) {
      print("接收超时");
    } else {
      print("未知错误: ${e.message}");
    }
  } catch (e) {
    // 捕获其他异常
    print("其他错误: $e");
  }
}

更多关于Flutter网络请求插件http_dio的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求插件http_dio的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


http_dio 是一个用于 Flutter 的网络请求插件,它基于 Dio 库,提供了更简洁的 API 来进行网络请求。Dio 是 Dart 语言中一个强大的 HTTP 客户端,支持拦截器、全局配置、FormData、文件上传/下载、请求取消等功能。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 http_dio 依赖:

dependencies:
  flutter:
    sdk: flutter
  http_dio: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入包

在你的 Dart 文件中导入 http_dio

import 'package:http_dio/http_dio.dart';

3. 基本使用

3.1 创建 HttpDio 实例

你可以创建一个 HttpDio 实例来发起网络请求:

final httpDio = HttpDio();

3.2 发起 GET 请求

void fetchData() async {
  final response = await httpDio.get('https://jsonplaceholder.typicode.com/posts/1');
  print(response.data);
}

3.3 发起 POST 请求

void postData() async {
  final response = await httpDio.post(
    'https://jsonplaceholder.typicode.com/posts',
    data: {
      'title': 'foo',
      'body': 'bar',
      'userId': 1,
    },
  );
  print(response.data);
}

3.4 发起 PUT 请求

void updateData() async {
  final response = await httpDio.put(
    'https://jsonplaceholder.typicode.com/posts/1',
    data: {
      'id': 1,
      'title': 'foo',
      'body': 'bar',
      'userId': 1,
    },
  );
  print(response.data);
}

3.5 发起 DELETE 请求

void deleteData() async {
  final response = await httpDio.delete('https://jsonplaceholder.typicode.com/posts/1');
  print(response.data);
}

4. 配置 HttpDio

你可以通过 HttpDio 的构造函数来配置一些全局选项,例如超时时间、拦截器等。

final httpDio = HttpDio(
  options: BaseOptions(
    baseUrl: 'https://jsonplaceholder.typicode.com',
    connectTimeout: 5000,
    receiveTimeout: 3000,
  ),
  interceptors: [
    InterceptorsWrapper(
      onRequest: (options, handler) {
        // 在请求之前做一些处理
        return handler.next(options);
      },
      onResponse: (response, handler) {
        // 在响应之前做一些处理
        return handler.next(response);
      },
      onError: (DioError e, handler) {
        // 在错误时做一些处理
        return handler.next(e);
      },
    ),
  ],
);

5. 文件上传

http_dio 也支持文件上传:

void uploadFile() async {
  final formData = FormData.fromMap({
    'file': await MultipartFile.fromFile('path/to/file', filename: 'upload.txt'),
  });

  final response = await httpDio.post(
    'https://example.com/upload',
    data: formData,
  );
  print(response.data);
}

6. 文件下载

你还可以使用 http_dio 下载文件:

void downloadFile() async {
  final response = await httpDio.download(
    'https://example.com/file',
    'path/to/save/file',
  );
  print('File downloaded to ${response.data}');
}

7. 错误处理

http_dio 会自动处理网络请求中的错误,你可以通过 try-catch 来捕获异常:

void fetchData() async {
  try {
    final response = await httpDio.get('https://jsonplaceholder.typicode.com/posts/1');
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

8. 取消请求

你可以使用 CancelToken 来取消请求:

void fetchData() async {
  final cancelToken = CancelToken();

  httpDio.get(
    'https://jsonplaceholder.typicode.com/posts/1',
    cancelToken: cancelToken,
  ).then((response) {
    print(response.data);
  }).catchError((e) {
    if (CancelToken.isCancel(e)) {
      print('Request canceled');
    } else {
      print('Error: $e');
    }
  });

  // 取消请求
  cancelToken.cancel('Request canceled by user');
}
回到顶部