【问题标题】:Flutter Global Http InterceptorFlutter 全局 Http 拦截器
【发布时间】:2020-06-29 22:00:44
【问题描述】:

我想知道是否可以有一个全局 HTTP 拦截器在 Flutter 中的所有请求的标头中附加令牌?我进行了很多搜索,但找不到任何关于在何处以及如何将其设置为全局的信息。非常感谢!

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可以扩展 BaseClient 并覆盖 send(BaseRequest request):

    class CustomClient extends BaseClient {
    
      static Map<String, String> _getHeaders() {
        return {
          'Authentication': 'c7fabcDefG04075ec6ce0',
        };
      }
    
      @override
      Future<StreamedResponse> send(BaseRequest request) async {
        request.headers.addAll(_getHeaders());
    
        return request.send();
      }
    
    }
    

    在上面的例子中,'Authentication': 'c7fabcDefG04075ec6ce0' 是硬编码的,没有加密,你永远不应该这样做。

    【讨论】:

      【解决方案2】:

      使用dio 包你可以做到这一点:

      Dio dio = Dio(BaseOptions(
       connectTimeout: 30000,
       baseUrl: 'your api',
       responseType: ResponseType.json,
       contentType: ContentType.json.toString(),
      ))
      ..interceptors.addAll(
      [
        InterceptorsWrapper(onRequest: (RequestOptions requestOptions) {
          dio.interceptors.requestLock.lock();
          String token = ShareP.sharedPreferences.getString('token');
          if (token != null) {
            dio.options.headers[HttpHeaders.authorizationHeader] =
                'Bearer ' + token;
          }
          dio.interceptors.requestLock.unlock();
          return requestOptions;
        }),
        // other interceptor
       ],
      );
      

      【讨论】:

      • 谢谢。但是我该把代码放在哪里呢?在 main.dart 文件中还是在我的项目中的每个 HTTP 请求文件中?谢谢。
      • 放在可以访问此 dio 实例的地方,例如github.com/alibaba/flutter-go
      • 这不是一个全局的http拦截器,而只是这个客户端实例的http拦截器。
      • 所以你想在每次点击 api 时创建新的 dio 实例吗?关注阿里巴巴的flutter-go项目
      【解决方案3】:

      Flutter 提供http_interceptor.dart 包。

      样本

      class LoggingInterceptor implements InterceptorContract {
      @override
      Future<RequestData> interceptRequest({RequestData data}) async {
       print(data);
       return data;
      }
      
      @override
      Future<ResponseData> interceptResponse({ResponseData data}) async {
        print(data);
        return data;
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 2020-12-16
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多