api - Flutter Chopper 401 更新和重试拦截器

标签 api flutter dart flutter-dependencies chopper

我在我的 flutter 应用程序中使用 Chopper,我需要做的是,当我从我的 API 获得 401 响应状态代码(未经授权)时,我必须调用另一个端点来刷新我的 token 并将其保存到安全存储中,当所有这些都完成后,我需要立即重试请求(这样用户就不会注意到他的 token 已过期)。这仅适用于 Chopper,还是我必须使用其他软件包?

最佳答案

这是可能的。您需要在 Chopper 客户端上使用 authenticator 字段,例如

 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,但在重试时我仍然遇到类型转换的同样问题。

编辑:您可能希望在某处保留重试计数,以免陷入循环。

关于api - Flutter Chopper 401 更新和重试拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67021327/

相关文章:

javascript - 矩形删除并放置错误 net::ERR_NAME_NOT_RESOLVED

flutter/Dart : Customize Bottom Navigation Bar height

firebase - Flutter Firebase Analytics 无数据

flutter - 为什么我无法在flutter中访问Firestore值?

firebase - 如何将它从userUid()获取到StreamBuilder Flutter

api - postman 如何将 body 数据值设置为数组中定义的随机元素

api - Paypal 自适应支付费用

java - 从哪里可以获得有关 Java OpenStreetMap API 的更多信息?

dart - 如何在 Dart 中发出网络请求并返回一个 json 对象

mobile - 是否可以在 Linux 虚拟机上使用 Flutter 开发 iOS 应用程序?