返回

用 Flutter DIO 处理 401 未授权响应的终极指南

前端

引言

使用 Flutter Dio 进行网络调用时,您可能会遇到 401 未授权错误响应。这表明服务器已拒绝您的请求,因为您的访问令牌无效或已过期。本文将深入探讨如何使用刷新令牌和访问令牌在 Flutter 应用程序中处理 401 响应。

拦截 401 未授权响应

要在 Flutter 中处理 401 未授权响应,您需要设置一个拦截器。拦截器是一个回调函数,当 Dio 发出请求并接收到响应时,它会执行该函数。要拦截 401 响应,请执行以下步骤:

  1. 导入 dio/dio.dart 库。
  2. 创建 Dio 对象。
  3. 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 响应时无缝地恢复,从而提供更流畅的用户体验。