📜  dio 图片 (1)

📅  最后修改于: 2023-12-03 15:00:24.978000             🧑  作者: Mango

Dio - 网络请求框架

Dio

Dio 是一个强大的Dart编写的网络请求框架。它非常适合于Flutter应用程序开发,提供了可扩展、可定制的配置选项。

Dio不仅仅是一个网络请求库,它还支持拦截器、全局错误拦截、formData上传、下载、REST API等许多功能。

特性
  • 强大的拦截器支持,包括请求,响应,错误拦截器,方便做全局的错误处理。
  • FormData和application/x-www-form-urlencoded数据格式的支持。
  • 支持请求取消和清理。
  • 支持全局和请求级别的超时设置。
  • 支持文件下载和上传。
  • 支持RESTful API。
  • 支持自定义认证。
  • 支持Cookie的自动管理,无需手动处理。
  • 支持自定义转换器,例如json,protobuff等。
  • 方便的请求日志记录和打印。
安装

pubspec.yaml 文件中添加依赖:

dependencies:
  dio: ^4.0.0
使用
import 'package:dio/dio.dart';

void main() async {
  
  var dio = Dio();
  // 发送GET请求
  Response response = await dio.get('https://github.com/flutterchina');
  
  // 打印结果
  print(response.data);
  
}

更多使用请看 Dio官方文档

拦截器

Dio的拦截器是它的一大特色,我们可以在请求和响应的各个阶段来干预请求和响应的行为。例如添加 token、日志记录、错误处理等。

dio.interceptors.add(InterceptorsWrapper(
  onRequest: (options, handler) {
    // 在请求之前做一些业务操作
    return handler.next(options); // continue
  },
  onResponse: (response, handler) {
    // 在响应之后做一些业务操作
    return handler.next(response); // continue
  },
  onError: (DioError e, handler) {
    // 在请求失败时做一些业务操作
    return handler.next(e); // continue
  },
));
FormData

Dio支持FormData上传。可以使用 FormData.fromMap() 将map转换为FormData对象。

FormData formData = FormData.fromMap({
  'name': 'wendux',
  'age': 25,
  'file': await MultipartFile.fromFile('./text.txt', filename: 'upload.txt'),
  // 支持File类型、List<File>类型和字节流类型(Uint8List)和 filename属性
});
response = await dio.post('/info', data: formData);
文件下载

Dio支持文件下载。可以直接使用dio.download方法下载文件。

await dio.download('https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg', './download.jpg');
文件上传

Dio也支持文件上传。可以使用MultipartFile类型上传文件。

// 上传单个文件
FormData formData = FormData.fromMap({
  "file": await MultipartFile.fromFile(file.path, filename: "upload.txt"),
});
response = await dio.post("/upload", data: formData);

// 上传多个文件
FormData formData = FormData.fromMap({
  "files": [
    await MultipartFile.fromFile("./file1.txt", filename: "upload.txt"),
    await MultipartFile.fromFile("./file2.txt", filename: "upload.txt"),
  ],
});
response = await dio.post("/uploads", data: formData);
RESTful API

每个API的设计都应该符合RESTful的规范,Dio也很好的支持Restful API。

class User {
  int id;
  String name;
  User({this.id, this.name});
  User.fromJson(Map<String, dynamic> json)
      : id = json['id'],
        name = json['name'];
  Map<String, dynamic> toJson() => {'id': id, 'name': name};
}

// GET请求
response = await dio.get('/users/${id}'); // 获取单个用户
User user = User.fromJson(response.data);

// POST请求
User newUser = User(id: 0, name: 'NewUser');
response = await dio.post('/users', data: newUser.toJson()); // 添加用户

// PUT请求
User updatedUser = User(id: id, name: 'UpdatedUser');
response = await dio.put('/users/${id}', data: updatedUser.toJson()); // 修改用户

// DELETE请求
response = await dio.delete('/users/${id}'); // 删除用户
总结

Dio 是一款非常强大的网络请求框架,支持文件上传,下载,拦截器,全局错误拦截,请求取消等功能。可以帮助开发者更加便捷地与服务器进行数据交互。