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
相关产品推荐
相关产品推荐

