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
更多关于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请求、错误处理以及拦截器的使用。你可以根据实际需求进行调整和扩展。