美文网首页
Grpc-dart 不能处理 401

Grpc-dart 不能处理 401

作者: gruan | 来源:发表于2021-01-30 18:25 被阅读0次

JWT 如果判断 Token 失效, 会直接返回 401 . 但是在 Flutter 中, 无法处理...
catch 到的 GrpcError 一直是 unimplemented, 而不是期待的unauthenticated

先用拦截器打印出 401 时响应的 headers.

{:status: 401, date: Sat, 30 Jan 2021 09:58:42 GMT, server: Kestrel, www-authenticate: Bearer, content-length: 0}

401 时, 返回 content-length: 0.

在看看 Flutter 中 ResponseFuture (\pub.flutter-io.cn\grpc-2.8.0\lib\src\client\common.dart) 的定义:

class ResponseFuture<R> extends DelegatingFuture<R>
    with _ResponseMixin<dynamic, R> {
  final ClientCall<dynamic, R> _call;

  static R _ensureOnlyOneResponse<R>(R previous, R element) {
    if (previous != null) {
      throw GrpcError.unimplemented('More than one response received');
    }
    return element;
  }

  static R _ensureOneResponse<R>(R value) {
    if (value == null) throw GrpcError.unimplemented('No responses received');
    return value;
  }

  ResponseFuture(this._call)
      : super(_call.response
            .fold(null, _ensureOnlyOneResponse)
            .then(_ensureOneResponse));
}

在父构造函数中, 首先判断的 _call.respnose 是不是收到多次, 其次判断它是不是为 null.

这个地方如果先判断 _call.headers[":status"] 是不是 401 就可以了. 但是 _call.headers 又是一个 Future<Map<String,String>>, 需要用到 async/await , 但是在构造函数中, 使用异步???脑壳有点大...蛋疼...

我也尝试用拦截器:

import 'dart:developer';

import 'package:grpc/grpc.dart';

class AA extends ClientInterceptor {
  ///
  @override
  ResponseFuture<R> interceptUnary<Q, R>(ClientMethod<Q, R> method, Q request,
      CallOptions options, ClientUnaryInvoker<Q, R> invoker) {
    ///

    final call = super.interceptUnary(
      method,
      request,
      options,
      invoker,
    );

    call.then((v) {
      log('aaaaaaaaaaaaaaaaaaaaaaa');
    }).catchError((dynamic e) async {
      var headers = await call.headers;
      log(headers.toString());
      if (headers.containsKey(":status") && headers[":status"] == "401") {
        // throw GrpcError.unauthenticated();
        //return null; //Future.error(GrpcError.unauthenticated());
      }
    }, test: (e) => e is GrpcError);

    return call;
  }
}
...
...
final client = ReportClient(
  channel,
  interceptors: List.filled(1, AA()),
);

但是 get 不到关键点, 无法用GrpcError.unauthenticated() 替换原有异常...

相关文章

  • Grpc-dart 不能处理 401

    JWT 如果判断 Token 失效, 会直接返回 401 . 但是在 Flutter 中, 无法处理...catc...

  • RestTemplate 401 处理

    我们的项目属于微服务架构,两个基础的服务分别是网关和认证鉴权服务。在前端访问后台服务的时候,都经过网关转发,转发之...

  • Spring boot全局异常处理405,415,500

    首先把SpringBoot默认的异常处理屏蔽掉: 如下代码, 其中401,403处理是配合shiro使用的, 当没...

  • 【axios】请求401之后的校验弹窗

    之前做过的项目在处理请求的401状态码的时候,没有特殊要求的话,大部分处理是给用户一个提示“登录已超时”,然后跳转...

  • 情商高手黄金法则!

    今天是日更第250+120+21天,公开文章第401篇。2021.2.20 周六 ️ 【情商高手黄金法则——先处理...

  • 如何通过Feign实现微服务之间带token访问

    问题描述 有做权限处理的服务接口直接调用会造成调用时出现http 401未授权的错误,继而导致最终服务的http ...

  • Mac下用命令行来升级Safari

    最近发现Safari里打开iTunesConnect不能显示登录界面,查看源码发现有提示401授权错误,猜想可能是...

  • 401

    依依不舍地离开whitby就继续向伦敦出发了,虽然离伦敦还有一段距离,但也没有办法了,我们需要连夜赶回去,因为第二...

  • 401

    昨天在跟一个香港的朋友在聊教育的问题,才发现其实我们大陆人眼中的香港教育也没有想像的那么好。因为朋友的小孩还在读幼...

  • 401

    2019.8.8 天气:晴 双方站在原地不跑不跳的打羽毛球是没有灵魂的羽毛球。 竟然与老姐吵了一早上,啧啧。 老爸...

网友评论

      本文标题:Grpc-dart 不能处理 401

      本文链接:https://www.haomeiwen.com/subject/sgjktltx.html