dio 是一个强大的 HTTP 网络请求库,支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时、自定义适配器、转换器等。
导入 dio
import 'package:dio/dio.dart';
// 配置网络请求的基础选项
BaseOptions options = BaseOptions(
baseUrl: "http://example.com/api",
connectTimeout: 5000, // 连接超时时间
receiveTimeout: 3000, // 接收超时时间
contentType: 'application/json', // 请求体的内容类型
responseType: 'ResponseType.json', // 期望的响应数据类型
headers: {}, // 请求头
);
Dio dio = Dio(options);
GET 请求
Response response;
// 方法一
response = await dio.get('/test?id=12&name=dio');
// 方法二
response = await dio.get('/test', queryParameters: {'id': 12, 'name': 'dio'});
POST 请求
response = await dio.post('/test', data: {'id': 12, 'name': 'dio'});
// 响应数据
if (response.statusCode == 200){ // Http状态码
print(response.data); // 响应数据
}
FormData
FormData formData = FormData.fromMap({
'id': 12,
'name': 'dio',
})
response = await dio.post('/test', data: formData);
如果发送的数据是 FormData,则 dio 会将请求的 contentType 设为 multipart/form-data。
拦截器
在 Dio 中,你可以通过自定义拦截器来对请求和响应进行处理。拦截器允许你在发送请求之前(onRequest)、收到响应之后(onResponse)、发生异常时(onError)进行额外的操作,例如根据响应状态码进行错误处理。
// 添加拦截器
dio.interceptors.add(
InterceptorsWrapper(
onRequest: (RequestOptions options, RequestInterceptorHandler handler){
options.data = {...options.data, 'sign': 'test'}; // 请求前在data参数中增加sign数据
handler.next(options);
},
onResponse:(Response response, ResponseInterceptorHandler handler){
if (response.statusCode == 200) {
handler.next(response); // 继续操作
} else {
handler.reject(DioError( // 返回报错信息
error: "请求失败,状态码:${response.statusCode}",
response: response,
));
}
},
onError: (DioException err, ErrorInterceptorHandler handler){
// ...
}
)
)
try {
response = await dio.get("http://example.com/api/data");
print(response.data);
} catch (error) {
print("Error: $error");
}