【问题标题】:Flutter Chopper 401 renew & retry interceptorFlutter Chopper 401 更新和重试拦截器
【发布时间】:2021-07-05 08:19:36
【问题描述】:

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

【问题讨论】:

    标签: api flutter dart flutter-dependencies chopper


    【解决方案1】:

    我搜索了几天的答案,我得出的结论是 Chopper 无法做到这一点......同时我切换到 Dio 作为我的网络客户端,但我使用 Chopper 来生成函数/端点。

    【讨论】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-16
        • 2022-01-25
        • 2018-04-25
        • 2018-05-05
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        相关资源
        最近更新 更多