首页 > 解决方案 > 如何将 badCertificateCallback 添加到 http.BaseClient [Flutter,Dart]

问题描述

我正在使用 signalr_core 连接到信号器。我创建了如下代码,这个连接没有问题。

  SignalRNotification() {
    if (this._hubConnection == null) {
      var options =
          IOClient(HttpClient()..badCertificateCallback = (x, y, z) => true);
      this._hubConnection = HubConnectionBuilder()
          .withUrl(serverUrl, options)
          .withAutomaticReconnect()
          .build();
    }

    this._initHub();
  }

我想修改选项中的标题信息。

我添加了一个引用这篇文章的标题。但是,会出现 CERTIFICATE_VERIFY_FAILED 错误。

E/flutter ( 2902): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: HandshakeException: Handshake error in client (OS Error: 
E/flutter ( 2902):  CERTIFICATE_VERIFY_FAILED: unable to get local issuer certificate(handshake.cc:354))

这是我的代码。

import 'dart:io';
import 'package:http/io_client.dart';
import 'package:signalr_core/signalr_core.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/foundation.dart';
import '../resources/common.dart';

class _HttpClient extends http.BaseClient {
  final _httpClient = http.Client();

  final Map<String, String> defaultHeaders;

  _HttpClient({@required this.defaultHeaders});

  @override
  Future<http.StreamedResponse> send(http.BaseRequest request) {
    request.headers.addAll(defaultHeaders);
    return _httpClient.send(request);
  }
}

class SignalRNotification {
  static String serverUrl = SignalRURL;
  HubConnection _hubConnection;
  NotificationManager notificationManager = NotificationManager();
  final httpClient = _HttpClient(defaultHeaders: {
    "X-Api-Key": "key",
    "X-Client-Id": "id",
  });

  SignalRNotification() {
    if (this._hubConnection == null) {
      this._hubConnection = HubConnectionBuilder()
          .withUrl(serverUrl, HttpConnectionOptions(client: httpClient))
          .withAutomaticReconnect()
          .build();
    }

    this._initHub();
  }

我认为出现这个问题是因为 _HttpClient 中没有 badCertificateCallback

我也参考了这篇文章,但是没有用。我想知道解决方案。

标签: flutterdartsignalr

解决方案


HttpClientfrom dart:io(我将其称为io.HttpClient)提供了一个badCertificateCallbacksetter,但package:http'sBaseClient没有。

但是,为它的类package:http提供了几个实现。BaseClient其中之一是IOClient(我将其称为http.IOClient),它由io.HttpClient.

因此,您应该能够使用按您想要的方式配置的http.IOClientwith an ,例如:io.HttpClient

import 'dart:io' as io;
import 'package:http/http.dart' as http;
import 'package:http/io_client.dart' as http;

class _HttpClient extends http.BaseClient {
  final io.HttpClient _ioHttpClient;
  final http.IOClient _httpClient;

  final Map<String, String> defaultHeaders;

  _HttpClient({@required this.defaultHeaders})
     : _ioHttpClient = io.HttpClient() {
    _httpClient = http.IOClient(_ioHttpClient);
  }

  void set badCertificateCallback(BadCertificateCallback callback) =>
    _ioHttpClient.badCertificateCallback = callback;

  @override
  Future<http.StreamedResponse> send(http.BaseRequest request) {
    request.headers.addAll(defaultHeaders);
    return _httpClient.send(request);
  }
}

推荐阅读