我试图调用 dio 拦截器 class 但是当我收到 401 时什么也没有发生
Im trying to call dio interceptor class but when im gettin 401 nothing happens
class RefreshToken extends Interceptor {
Future<void> tryGetToken() async {
print("asd");
Dio dio = Dio();
SharedPreferences pref = await SharedPreferences.getInstance();
final token = pref.getString("access_token");
final refreshtoken = pref.getString("refresh_token");
dio.interceptors.add(
InterceptorsWrapper(
onRequest: (request, handler) {
if (token != null && token != '') {
request.headers['Authorization'] = 'Bearer $token';
}
return handler.next(request);
},
onError: (e, handler) async {
if (e.response?.statusCode == 401) {
try {
var headers = {
//my header
};
var bodyFields = {
//my body
};
await dio
.post(globals.apiUrl + "connect/token",
data: bodyFields,
options: Options(
headers: headers,
validateStatus: (status) {
return status! < 501;
},
))
.then((value) async {
if (value.statusCode! < 300) {
//get new tokens ...
print("access token" + token!);
print("refresh token" + refreshtoken!);
//set bearer
e.requestOptions.headers["Authorization"] = "Bearer " + token;
//create request with new access token
final opts = new Options(
method: e.requestOptions.method,
headers: e.requestOptions.headers);
final cloneReq = await dio.request(e.requestOptions.path,
options: opts,
data: e.requestOptions.data,
queryParameters: e.requestOptions.queryParameters);
return handler.resolve(cloneReq);
}
});
} catch (e, st) {
print(e);
}
}
},
),
);
}
}
这是我的代码。我不知道问题出在哪里。我从另一个请求中得到 401,但这个拦截器没有调用。我研究了很多网站,但我从未找到任何调用方法。有谁能够帮助我 ?我的拦截器是真的吗?如果它是真的,我该如何使用它?
我解决了这个问题。我添加 GetToken().yourInterceptor();在 main.dart 初始化状态。它可以帮助任何人。
status code 404不是dio错误,dio错误与连接状态和连接超时方式有关,这种拦截会在您请求失败时启动,您要做的是拦截响应。 .. 当你得到 404 时,意味着你得到了服务器的响应,现在你可以处理它了
class RefreshToken extends Interceptor {
Future<void> tryGetToken() async {
print("asd");
Dio dio = Dio();
SharedPreferences pref = await SharedPreferences.getInstance();
final token = pref.getString("access_token");
final refreshtoken = pref.getString("refresh_token");
dio.interceptors.add(
InterceptorsWrapper(
onRequest: (request, handler) {
if (token != null && token != '') {
request.headers['Authorization'] = 'Bearer $token';
}
return handler.next(request);
},
onError: (e, handler) async {
if (e.response?.statusCode == 401) {
try {
var headers = {
//my header
};
var bodyFields = {
//my body
};
await dio
.post(globals.apiUrl + "connect/token",
data: bodyFields,
options: Options(
headers: headers,
validateStatus: (status) {
return status! < 501;
},
))
.then((value) async {
if (value.statusCode! < 300) {
//get new tokens ...
print("access token" + token!);
print("refresh token" + refreshtoken!);
//set bearer
e.requestOptions.headers["Authorization"] = "Bearer " + token;
//create request with new access token
final opts = new Options(
method: e.requestOptions.method,
headers: e.requestOptions.headers);
final cloneReq = await dio.request(e.requestOptions.path,
options: opts,
data: e.requestOptions.data,
queryParameters: e.requestOptions.queryParameters);
return handler.resolve(cloneReq);
}
});
} catch (e, st) {
print(e);
}
}
},
),
);
}
}
这是我的代码。我不知道问题出在哪里。我从另一个请求中得到 401,但这个拦截器没有调用。我研究了很多网站,但我从未找到任何调用方法。有谁能够帮助我 ?我的拦截器是真的吗?如果它是真的,我该如何使用它?
我解决了这个问题。我添加 GetToken().yourInterceptor();在 main.dart 初始化状态。它可以帮助任何人。
status code 404不是dio错误,dio错误与连接状态和连接超时方式有关,这种拦截会在您请求失败时启动,您要做的是拦截响应。 .. 当你得到 404 时,意味着你得到了服务器的响应,现在你可以处理它了