flutter - 如何将 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
我也参考了这篇文章,但是没有用。我想知道解决方案。
解决方案
HttpClient
from dart:io
(我将其称为io.HttpClient
)提供了一个badCertificateCallback
setter,但package:http
'sBaseClient
没有。
但是,为它的类package:http
提供了几个实现。BaseClient
其中之一是IOClient
(我将其称为http.IOClient
),它由io.HttpClient
.
因此,您应该能够使用按您想要的方式配置的http.IOClient
with 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);
}
}
推荐阅读
- node.js - 发送客户端文件下载链接
- arrays - 获取 MongoDB 对象数组中每个元素的总数
- javascript - MomentJS:如何将特定时区和特定格式的时间转换为毫秒
- windows - 将昨天的日期以 yyyymmdd 格式存储到变量中
- mrtk - 如何使用 MRTK 为跨平台部署设置单个应用程序?
- asp.net-core - ASP.NET Core 2.2 ERR_CONNECTION_REFUSED 用于 http
- laravel - 我应该将文档文件存储在 Web 服务器还是 API 服务器上?
- c - 将自定义长度的 0 位与 uint8_t 数组连接起来
- python - 为什么只有在我加载我的 keras 模型而不是在我第一次拟合它时才会收到“ValueError:检查输入时出错:...”?
- angular - HTTP 响应作为 Angular 7 中的错误被接收