You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Dio请求拦截器未生效:请求头缺失Authorization致401错误

问题描述

我尝试通过拦截请求,为使用Api类发起的每个请求的请求头添加Authorization令牌,但出现了401错误,检查请求头后发现该令牌缺失。请问需要修改哪些代码才能让令牌成功加入请求头?

相关代码如下:

Api api = Api();

class Api extends InterceptorsWrapper {

  static BaseOptions opts = BaseOptions(
    baseUrl: SERVER_IP,
    responseType: ResponseType.json,
    connectTimeout: 5000,
    receiveTimeout: 3000,
  );

  static final dio = Dio(opts);

  @override
  void onRequest(
      RequestOptions options, RequestInterceptorHandler handler) async {
    if (!options.headers.containsKey("Authorization")) {
      var token = secureStorage.getAccessToken();
      options.headers['authorization'] = 'Bearer $token';
    }
    handler.next(options);
    return super.onRequest(options, handler);
  }

  @override
  void onError(DioError err, ErrorInterceptorHandler handler) {
    print('ERROR[${err.response?.statusCode}] => PATH: ${err.requestOptions.path}');
    return super.onError(err, handler);
  }

  Future<Response?> get(String url) async {
    try {
      var response = await dio.get(url);
      return response;
    } on DioError catch (e) {
      return null;
    }
  }
...

调用方式:

api.get(url);

解决方案

你的代码核心问题是拦截器未注册到Dio实例,同时还有几处细节问题需要调整,具体修改点如下:

1. 注册拦截器到Dio实例

你定义了继承自InterceptorsWrapper的Api类,但没有将这个拦截器实例添加到dio对象中,导致拦截逻辑完全不会执行。需要在Api的构造函数中完成注册:

Api() {
  dio.interceptors.add(this);
}

2. 修正异步令牌获取逻辑

secureStorage.getAccessToken()是异步方法,直接赋值会导致token是Future对象而非实际令牌字符串,必须用await等待结果:

@override
void onRequest(
    RequestOptions options, RequestInterceptorHandler handler) async {
  if (!options.headers.containsKey("Authorization")) {
    var token = await secureStorage.getAccessToken(); // 添加await
    options.headers['Authorization'] = 'Bearer $token';
  }
  handler.next(options);
}

3. 统一请求头键名大小写

HTTP头键名虽不区分大小写,但为了规范和避免潜在兼容问题,统一使用Authorization(首字母大写),不要混用小写的authorization。

4. 移除冗余的super调用

onRequest和onError中调用super方法会重复执行默认逻辑,可能干扰拦截流程,直接调用handler.next()即可传递请求或错误。


修改后的完整代码示例
Api api = Api();

class Api extends InterceptorsWrapper {

  static BaseOptions opts = BaseOptions(
    baseUrl: SERVER_IP,
    responseType: ResponseType.json,
    connectTimeout: 5000,
    receiveTimeout: 3000,
  );

  static final dio = Dio(opts);

  // 构造函数中注册拦截器
  Api() {
    dio.interceptors.add(this);
  }

  @override
  void onRequest(
      RequestOptions options, RequestInterceptorHandler handler) async {
    if (!options.headers.containsKey("Authorization")) {
      var token = await secureStorage.getAccessToken();
      options.headers['Authorization'] = 'Bearer $token';
    }
    handler.next(options);
  }

  @override
  void onError(DioError err, ErrorInterceptorHandler handler) {
    print('ERROR[${err.response?.statusCode}] => PATH: ${err.requestOptions.path}');
    handler.next(err);
  }

  Future<Response?> get(String url) async {
    try {
      var response = await dio.get(url);
      return response;
    } on DioError catch (e) {
      return null;
    }
  }
...

内容的提问来源于stack exchange,提问作者user16591216

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:36:20