gpt4 book ai didi

flutter - 为什么flutter dio拦截器不调用该方法?

转载 作者:行者123 更新时间:2023-12-03 17:09:16 39 4
gpt4 key购买 nike

我正在开发一个使用 JWT 访问后端端点的 Flutter 应用程序。
当访问 token 过期时,我添加了一个拦截器来根据此处提供的解决方案刷新 token :
Using Interceptor in Dio for Flutter to Refresh Token
我可以看到显示 401 的服务器日志。
这是我的代码:

import 'dart:convert';

import 'package:dio/dio.dart';
import 'package:dummy/utils/config.dart';

Future<Response> uploadVideo(filePath, fileName, title, jwt) async {
Dio dio = new Dio();
var token = json.decode(jwt);
dio.interceptors.clear();

dio.options.headers["Authorization"] = "Bearer ${token['access']}";
dio.interceptors.add(InterceptorsWrapper(onError: (error) async {
print(error.response);
if (error.response?.statusCode == 403 ||
error.response?.statusCode == 401) {
await refreshToken(jwt);
_retry(error.request, dio);
}
return error.response;
}));
Response response;
try {
FormData formData = FormData.fromMap({
"file_name": fileName,
"content": await MultipartFile.fromFile(filePath),
'title': title,
});
response = await dio.post("$BASE_URL/video/create/", data: formData);
return response;
} on DioError catch (e) {
if (e.response) {
print(e.response.data);
print(e.response.headers);
print(e.response.request);
} else {
// Something happened in setting up or sending the request that triggered an Error
print(e.request);
print(e.message);
}
return e.response;
}
}

Future<Response<dynamic>> _retry(RequestOptions requestOptions, Dio dio) async {
final options = new Options(
method: requestOptions.method,
headers: requestOptions.headers,
);
return dio.request<dynamic>(requestOptions.path,
data: requestOptions.data,
queryParameters: requestOptions.queryParameters,
options: options);
}

Future<Response> refreshToken(jwt) async {
print("COMING INSIDE");
Dio dio = new Dio();
var token = json.decode(jwt);
var refreshToken = token['refresh'];
Response response;
try {
FormData formData = FormData.fromMap({
"refresh": refreshToken,
});
response = await dio.post("$BASE_URL/auth/login/refresh/", data: formData);
return response;
} catch (e) {
return e.response;
}
}
我也试过调试器,但它没有在 if 语句之后执行代码,它检查 401 和 403。服务器清楚地给出了 401,因为我在本地运行它,所以我可以看到日志。
我在这里做错了什么?
提前致谢。

最佳答案

我认为问题出在你的拦截器上:

dio.interceptors.add(InterceptorsWrapper(onError: (error) async {
print(error.response);
if (error.response?.statusCode == 403 ||
error.response?.statusCode == 401) {
await refreshToken(jwt);
_retry(error.request, dio);
}
return error.response;
}));
您正在调用重试方法,但是:
  • 你不等待结果;
  • 无论如何你都会返回一个错误。

  • 尝试添加 return之前 _retry反而:
    dio.interceptors.add(InterceptorsWrapper(onError: (error) async {
    print(error.response);
    if (error.response?.statusCode == 403 ||
    error.response?.statusCode == 401) {
    await refreshToken(jwt);
    return _retry(error.request, dio);
    }
    return error.response;
    }));

    关于flutter - 为什么flutter dio拦截器不调用该方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66765833/

    39 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com