Mav*_*ick 5 dart flutter flutter-dependencies dio
我正在开发一个使用 JWT 访问后端端点的 Flutter 应用程序。当访问令牌过期时,我添加了一个拦截器以根据此处提供的解决方案刷新令牌: 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我也试过调试器,但它没有在 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;
}));
Run Code Online (Sandbox Code Playgroud)
您正在调用重试方法,但是:
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;
}));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2818 次 |
| 最近记录: |