我在我的颤振应用程序中使用 Chopper,我需要做的是,当我从我的 API 获得 401 响应状态代码(未经授权)时,我必须调用另一个端点来刷新我的令牌并将其保存到安全存储中,当所有完成后,我需要立即重试请求(这样用户就不会注意到他的令牌已过期)。这仅适用于 Chopper,还是我必须使用其他包?
问问题
488 次
2 回答
2
有可能的。您需要在 Chopper 客户端上使用验证器字段,例如
final ChopperClient client = ChopperClient(
baseUrl: backendUrl,
interceptors: [HeaderInterceptor()],
services: <ChopperService>[
_$UserApiService(),
],
converter: converter,
authenticator: MyAuthenticator(),
);
您的身份验证器类应该如下所示:
class MyAuthenticator extends Authenticator {
@override
FutureOr<Request?> authenticate(
Request request, Response<dynamic> response) async {
if (response.statusCode == 401) {
String? newToken = await refreshToken();
final Map<String, String> updatedHeaders =
Map<String, String>.of(request.headers);
if (newToken != null) {
newToken = 'Bearer $newToken';
updatedHeaders.update('Authorization', (String _) => newToken!,
ifAbsent: () => newToken!);
return request.copyWith(headers: updatedHeaders);
}
}
return null;
}
诚然,找到/理解它并不容易(尽管它是他们文档中提到的 chopper 客户端的第一个属性),但这正是该属性的用途。我打算自己搬到 dio,但在重试时我仍然遇到类型转换的同样问题。
编辑:您可能希望在某处保留重试计数,这样您就不会陷入循环。
于 2021-09-26T12:59:35.650 回答
1
我搜索了几天的答案,我得出的结论是 Chopper 不可能做到这一点......同时我切换到 Dio 作为我的网络客户端,但我使用 Chopper 来生成函数/端点。
于 2021-04-12T21:01:14.280 回答