Flutter网络请求插件dio2的使用

以下是关于“Flutter网络请求插件dio2的使用”的详细内容和完整示例代码:

Flutter网络请求插件dio2的使用

添加依赖

pubspec.yaml文件中添加dio插件依赖:

dependencies:
  dio: ^4.0.0 # 使用最新版本

超简单的使用方法

首先导入dio库:

import 'package:dio/dio.dart';

然后使用dio进行HTTP请求:

void getHttp() async {
  try {
    Response response = await Dio().get("http://www.google.com");
    print(response);
  } catch (e) {
    print(e);
  }
}

示例代码

GET请求

Response response;
Dio dio = new Dio();
response = await dio.get("/test?id=12&name=wendu");
print(response.data.toString());

// 或者也可以这样写
response = await dio.get("/test", queryParameters: {"id": 12, "name": "wendu"});
print(response.data.toString());

POST请求

response = await dio.post("/test", data: {"id": 12, "name": "wendu"});

多并发请求

response = await Future.wait([dio.post("/info"), dio.get("/token")]);

下载文件

response = await dio.download("https://www.google.com/", "./xx.html");

获取响应流

Response<ResponseBody> rs = await Dio().get<ResponseBody>(url,
  options: Options(responseType: ResponseType.stream), // 设置响应类型为流
);
print(rs.data.stream); // 响应流

获取字节响应

Response<List<int>> rs = await Dio().get<List<int>>(url,
  options: Options(responseType: ResponseType.bytes), // 设置响应类型为字节
);
print(rs.data); // 字节列表

发送FormData

FormData formData = FormData.fromMap({
  "name": "wendux",
  "age": 25,
});
response = await dio.post("/info", data: formData);

多文件上传

FormData formData = FormData.fromMap({
  "name": "wendux",
  "age": 25,
  "file": await MultipartFile.fromFile("./text.txt", filename: "upload.txt"),
  "files": [
    await MultipartFile.fromFile("./text1.txt", filename: "text1.txt"),
    await MultipartFile.fromFile("./text2.txt", filename: "text2.txt"),
  ]
});
response = await dio.post("/info", data: formData);

监听上传进度

response = await dio.post(
  "http://www.dtworkroom.com/doris/1/2.0.0/test",
  data: {"aa": "bb" * 22},
  onSendProgress: (int sent, int total) {
    print("$sent $total");
  },
);

通过Stream发送二进制数据

List<int> postData = [...];
await dio.post(
  url,
  data: Stream.fromIterable(postData.map((e) => [e])), // 创建一个 Stream<List<int>>
  options: Options(
    headers: {
      Headers.contentLengthHeader: postData.length, // 设置内容长度
    },
  ),
);

配置Dio实例

创建Dio实例并设置默认配置:

Dio dio = new Dio(); // 使用默认选项

// 设置默认配置
dio.options.baseUrl = "https://www.xx.com/api";
dio.options.connectTimeout = 5000; // 5秒
dio.options.receiveTimeout = 3000;

// 或者用BaseOptions实例创建Dio
BaseOptions options = new BaseOptions(
    baseUrl: "https://www.xx.com/api",
    connectTimeout: 5000,
    receiveTimeout: 3000,
);
Dio dio = new Dio(options);

拦截器

添加拦截器以拦截请求或响应:

dio.interceptors.add(InterceptorsWrapper(
    onRequest: (RequestOptions options) async {
        // 在请求发送前做些操作
        return options; // 继续
    },
    onResponse: (Response response) async {
        // 对响应数据做些操作
        return response; // 继续
    },
    onError: (DioError e) async {
        // 对错误做些操作
        return e; // 继续
    }
));

锁定/解锁拦截器

dio.interceptors.requestLock.lock();
// 执行异步请求并解锁
dio.interceptors.requestLock.unlock();

自定义拦截器

可以通过继承Interceptor类来自定义拦截器。例如实现简单的缓存策略:

class CacheInterceptor extends Interceptor {
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    super.onRequest(options, handler);
    // 实现缓存逻辑
  }

  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    super.onResponse(response, handler);
    // 实现缓存逻辑
  }

  @override
  void onError(DioError err, ErrorInterceptorHandler handler) {
    super.onError(err, handler);
    // 实现缓存逻辑
  }
}

错误处理

当发生错误时,Dio会将错误包装成DioError:

try {
  // 404
  await dio.get("https://wendux.github.io/xsddddd");
} on DioError catch(e) {
  if(e.response) {
    print(e.response.data);
    print(e.response.headers);
    print(e.response.request);
  } else {
    print(e.request);
    print(e.message);
  }
}

其他功能

dio还支持设置代理、HTTPS证书验证、HTTP/2支持等功能,具体可以查看dio的官方文档。


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

1 回复

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


当然,下面是一个关于如何在Flutter中使用dio2插件进行网络请求的示例代码。dio2是一个强大的HTTP客户端,用于发送网络请求和处理响应。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.0  # 请注意dio2是dio的后续版本,一般使用dio即可,版本号根据需要调整

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

2. 导入dio

在你的Dart文件中导入dio库:

import 'package:dio/dio.dart';

3. 配置dio实例

你可以配置一个dio实例,设置baseURL、超时时间等:

void main() async {
  // 创建dio实例
  final Dio dio = Dio(
    BaseOptions(
      baseUrl: 'https://api.example.com', // 替换为你的API基础URL
      connectTimeout: 5000, // 连接超时时间
      receiveTimeout: 30000, // 接收超时时间
      headers: {
        'Content-Type': 'application/json',
      },
    )
  );

  // 使用dio实例进行网络请求
  try {
    // 发送GET请求
    Response<String> response = await dio.get('/endpoint');
    print(response.data);

    // 发送POST请求
    Response<Map<String, dynamic>> postResponse = await dio.post(
      '/endpoint',
      data: {
        'key1': 'value1',
        'key2': 'value2',
      },
      options: Options(
        contentType: Headers.formUrlEncodedContentType,
      ),
    );
    print(postResponse.data);
  } catch (e) {
    // 处理错误
    if (e is DioError) {
      switch (e.response?.statusCode) {
        case 400:
          print('Bad Request');
          break;
        case 404:
          print('Not Found');
          break;
        case 500:
          print('Server Error');
          break;
        default:
          print('Error: ${e.message}');
      }
    } else {
      print('Error: ${e.message}');
    }
  }
}

4. 使用dio拦截器(可选)

你可以添加拦截器来处理请求和响应的预处理或后处理:

void main() async {
  // 创建dio实例
  final Dio dio = Dio(BaseOptions(
    baseUrl: 'https://api.example.com',
    connectTimeout: 5000,
    receiveTimeout: 30000,
    headers: {
      'Content-Type': 'application/json',
    },
  ));

  // 添加请求拦截器
  dio.interceptors.add(InterceptorsWrapper(
    onRequest: (options, handler) async {
      // 在请求发送之前做些什么
      print('Sending request ${options.path}');
      // 你可以修改请求选项
      options.headers['Authorization'] = 'Bearer YOUR_TOKEN';
      return handler.next(options);
    },
    onResponse: (response, handler) async {
      // 对响应数据做点什么
      print('Received response from ${response.requestOptions.path}');
      return handler.next(response);
    },
    onError: (err, handler) async {
      // 对响应错误做点什么
      print('Error: ${err.message}');
      return handler.next(err);
    },
  ));

  // 使用dio实例进行网络请求
  try {
    Response<String> response = await dio.get('/endpoint');
    print(response.data);
  } catch (e) {
    print('Error: ${e.message}');
  }
}

以上示例展示了如何在Flutter中使用dio插件进行网络请求,包括GET和POST请求、错误处理以及拦截器的使用。你可以根据实际需求进行调整和扩展。

回到顶部