返回
用 Flutter DIO 处理 401 未授权响应的终极指南
前端
2024-01-14 07:23:51
引言
使用 Flutter Dio 进行网络调用时,您可能会遇到 401 未授权错误响应。这表明服务器已拒绝您的请求,因为您的访问令牌无效或已过期。本文将深入探讨如何使用刷新令牌和访问令牌在 Flutter 应用程序中处理 401 响应。
拦截 401 未授权响应
要在 Flutter 中处理 401 未授权响应,您需要设置一个拦截器。拦截器是一个回调函数,当 Dio 发出请求并接收到响应时,它会执行该函数。要拦截 401 响应,请执行以下步骤:
- 导入
dio/dio.dart
库。 - 创建
Dio
对象。 - 将
InterceptorsWrapper
类型的Interceptor
添加到Dio
对象的interceptors
数组中。
获取刷新令牌
接下来,您需要获取刷新令牌。刷新令牌是一个令牌,可用于获取新的访问令牌。要获取刷新令牌,请使用 Dio
对象发出 POST 请求到刷新令牌端点。
使用刷新令牌获取新的访问令牌
获取刷新令牌后,您可以使用它从服务器获取新的访问令牌。要获取新的访问令牌,请使用 Dio
对象发出 POST 请求到访问令牌端点。
使用新的访问令牌重试请求
一旦您有了新的访问令牌,您就可以使用它重试之前的请求。要重试请求,请将新的访问令牌添加到 Authorization
标头,然后使用 Dio
对象再次发出请求。
代码示例
以下代码示例演示了如何在 Flutter 中处理 401 未授权响应:
import 'dart:async';
import 'package:dio/dio.dart';
Future<void> main() async {
// 创建 Dio 对象
Dio dio = Dio();
// 添加拦截器
dio.interceptors.add(InterceptorsWrapper(
onError: (DioError error, ErrorInterceptorHandler handler) async {
if (error.response?.statusCode == 401) {
// 获取刷新令牌
String refreshToken = await getRefreshToken();
// 获取新的访问令牌
String accessToken = await getAccessToken(refreshToken);
// 使用新的访问令牌重试请求
RequestOptions options = error.requestOptions;
options.headers["Authorization"] = "Bearer $accessToken";
final response = await dio.request(options.path, options: options);
return response;
}
return error;
},
));
// 发出网络请求
try {
final response = await dio.get('https://example.com/api/v1/users');
print(response);
} catch (e) {
print(e);
}
}
最佳实践
处理 401 未授权响应时,请遵循以下最佳实践:
- 仅在需要时才存储刷新令牌。
- 将刷新令牌存储在安全的位置。
- 设置访问令牌的过期时间。
- 在使用访问令牌之前对其进行身份验证。
结论
处理 Flutter 中的 401 未授权响应至关重要,以确保您的应用程序能够可靠地与服务器通信。通过实施本文中概述的技术,您可以确保您的应用程序能够在收到 401 响应时无缝地恢复,从而提供更流畅的用户体验。