Flutter网络请求适配器插件dio_adapter的使用
Flutter网络请求适配器插件dio_adapter的使用
DioAdapterBase
DioBuilder 是一个 Dart 包装,它简化了使用 Dio 库进行 HTTP 请求。 它提供了一处理 API CRUD 操作的结构化方式,包括自定义请求和响应处理、错误管理以及 HTTP 客户端适应。
功能
- CRUD 操作: 简单地执行 GET, POST, PUT 和 DELETE 请求。
- 自定义请求和响应处理器: 自定义请求和响应处理器。
- 错误处理: 综合错误处理来管理各种 Dio 异常。
- HTTP 客户端适应: 为特定用例适应 HTTP 客户端,包括自签名证书。
开始使用
安装
将 dio_adapter
包添加到您的 pubspec.yaml
文件中:
dependencies:
dio_adapter: ^2.1.2 # 这是最新版本
示例代码
// 示例使用 DioBuilderBase
import 'package:dio_adapter/dio_adapter.dart';
void main() async {
final dioBuilder = DioAdapterBase(
baseUrl: 'https://jsonplaceholder.typicode.com',
connectTimeout: Duration(seconds: 1000),
receiveTimeout: Duration(seconds: 1800),
contentTypeEnum: ContentTypeEnum.applicationJson,
responseTypeEnum: ResponseTypeEnum.json,
sslCertificateSHa256:
"drJ7gKWAJ9w88dpo2sFEO2TmX0LYDYD4vrb6FASSTtac=", // 这个值必须存储在安全的地方,如 .env 文件中,并不提交到源代码控制
customRequestHandler: (options, handler) async {
// 在发送请求之前做点什么。
// 如果你想用自定义数据解决请求,你可以用 `handler.resolve(response)` 来解决
// if (options.path.contains("/mock-endpoint")) {
// // 创建一个模拟响应
// final mockResponse = Response(
// requestOptions: options,
// data: {"message": "This is a mock response"},
// statusCode: 200,
// statusMessage: "OK",
// );
// // 解决请求与模拟响应
// return handler.resolve(mockResponse);
// }
// 如果你想用错误信息拒绝请求,你可以用 `handler.reject(dioError)` 来拒绝
// final token = options.headers["Authorization"];
// if (token == null || token.isEmpty) {
// return handler.reject(
// DioException(
// requestOptions: options,
// type: DioExceptionType.badResponse,
// error: "Unauthorized: Missing or invalid token",
// ),
// );
// }
return options;
},
customResponseHandler: (response, handler) async {
// 处理响应数据。
// 如果你想用错误信息拒绝请求,你可以用 `handler.reject(dioError)` 来拒绝。
return response;
},
customErrorHandler: (error, handler) async {
// 处理响应错误。
// 如果你想用自定义数据解决请求,你可以用 `handler.resolve(response)` 来解决。
return error;
},
);
// 示例 GET 请求
final getResult = await dioBuilder.get('/posts/1');
getResult.fold(
(error) => print('GET Error: $error'),
(response) => print('GET Response: ${response.data}'),
);
// 示例 POST 请求
final postResult = await dioBuilder
.post('/posts', body: {'title': 'foo', 'body': 'bar', 'userId': 1});
postResult.fold(
(error) => print('POST Error: $error'),
(response) => print('POST Response: ${response.data}'),
);
// 示例 PUT 请求
final putResult = await dioBuilder.put('/posts/1', body: {
'id': 1,
'title': 'updated title',
'body': 'updated body',
'userId': 1
});
putResult.fold(
(error) => print('PUT Error: $error'),
(response) => print('PUT Response: ${response.data}'),
);
// 示例 DELETE 请求
final deleteResult = await dioBuilder.delete('/posts/1');
deleteResult.fold(
(error) => print('DELETE Error: $error'),
(response) => print('DELETE Response: ${response.statusCode}'),
);
}
更多关于Flutter网络请求适配器插件dio_adapter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter网络请求适配器插件dio_adapter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter中使用dio_adapter
插件来进行网络请求适配器的示例代码。dio_adapter
插件允许你拦截和修改请求/响应,非常适合用于日志记录、错误处理、添加认证头部等操作。
首先,确保你的pubspec.yaml
文件中已经添加了dio
和dio_http_adapter
依赖:
dependencies:
flutter:
sdk: flutter
dio: ^4.0.0
dio_http_adapter: ^4.0.0
然后运行flutter pub get
来安装这些依赖。
以下是一个完整的示例,展示如何使用dio
和dio_http_adapter
来进行网络请求,并添加请求和响应的拦截器:
import 'package:dio/dio.dart';
import 'package:dio_http_adapter/dio_http_adapter.dart';
void main() async {
// 创建Dio实例
final dio = Dio();
// 创建HttpAdapter实例
final adapter = HttpAdapter(dio);
// 添加请求拦截器
adapter.onRequest = (RequestOptions options) async {
// 打印请求信息
print("Sending request to ${options.path}");
print("Request Method: ${options.method}");
// 添加自定义头部信息(例如认证头部)
options.headers['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN';
// 可以根据需求修改请求数据
// options.data = {...};
// 返回RequestOptions对象,继续请求流程
return options;
};
// 添加响应拦截器
adapter.onResponse = (Response response) async {
// 打印响应信息
print("Received response from ${response.requestOptions.path}");
print("Response Status Code: ${response.statusCode}");
// 可以根据需求修改响应数据
// final modifiedData = response.data;
// response.data = modifiedData;
// 返回Response对象,继续响应流程
return response;
};
// 添加错误拦截器
adapter.onError = (DioError err) async {
// 打印错误信息
print("Request failed: ${err.message}");
// 可以根据错误类型进行不同的处理
if (err.type == DioErrorType.RESPONSE) {
// 服务器返回了错误响应码
print("Response error data: ${err.response?.data}");
} else if (err.type == DioErrorType.CONNECT_TIMEOUT || err.type == DioErrorType.SEND_TIMEOUT || err.type == DioErrorType.RECEIVE_TIMEOUT) {
// 请求超时
print("Request timed out");
} else if (err.type == DioErrorType.CANCEL) {
// 请求被取消
print("Request was cancelled");
} else {
// 其他错误
print("Other error: ${err.error}");
}
// 返回DioError对象,继续错误处理流程(可选)
// 你可以抛出一个新的异常或返回null来忽略错误处理
return err;
};
// 使用dio进行网络请求
try {
final response = await dio.get('https://jsonplaceholder.typicode.com/posts/1');
print("Response Data: ${response.data}");
} catch (e) {
// 捕获并处理异常
print("An error occurred: $e");
}
}
在这个示例中:
- 我们创建了一个
Dio
实例和一个HttpAdapter
实例。 - 使用
adapter.onRequest
添加了一个请求拦截器,用于打印请求信息并添加自定义头部。 - 使用
adapter.onResponse
添加了一个响应拦截器,用于打印响应信息。 - 使用
adapter.onError
添加了一个错误拦截器,用于打印错误信息并根据错误类型进行不同的处理。 - 最后,我们发起了一个GET请求,并打印了响应数据。
这样,你就能够在Flutter应用中使用dio_adapter
来进行网络请求,并添加请求/响应的拦截逻辑。