我正在尝试使用以下函数从flutter发送https
请求:
Future<void> sendOTP(PhoneNumber phoneNumber) async {
try {
final String url = 'https://127.0.0.1:5432/api/send_otp';
final response = await _dio.post(
url,
data: {'number': 1234567890},
options: Options(
headers: {
'Content-Type': 'application/json',
},
),
);
if (response.statusCode != 200) {
throw Exception("Failed to send OTP: ${response.statusCode}");
}
} on DioError catch (e) {
throw Exception("Failed to send OTP: ${e.error.toString()}");
}
}
为了启用ssl certificate
,我在main方法中添加了以下代码:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
ByteData data = await PlatformAssetBundle().load('asset/certificate/certificate.pem');
SecurityContext.defaultContext
.setTrustedCertificatesBytes(data.buffer.asUint8List());
runApp(const MyApp());
}
我已经从https://letsencrypt.org/certs/lets-encrypt-r3.pem下载了certificate.pem
文件。
当我使用thunderclient
或postman
与证书发送请求时,它可以工作,但从flutter应用程序中,它会抛出以下错误:
Error: HandshakeException: Handshake error in client (OS Error:
TLSV1_ALERT_DECODE_ERROR(tls_record.cc:594))
对于服务器,我使用actix-web
和rustls
-如果相关的话。请建议我如何修复相同的?
1条答案
按热度按时间cyvaqqii1#
我也有类似的问题,经过几个小时的研究,我发现:
正如你所看到的,我的API是由android模拟器访问的,但是如果我使用Dio Http(版本5.1.1)运行我的flutter代码,它会抛出一个Handshake异常。我尝试了与您使用的完全相同的代码,添加了一个证书,但没有任何变化。我真的不知道从现在开始该怎么办。这真的很令人沮丧,也许我将不得不使用浏览器而不是模拟器来开发我的应用程序。
这是我的dio基本选项配置,这是确定的:
这是Dio Http抛出的异常:
我还试图在android清单中添加互联网权限,但没有任何变化,我还试图指向我的API的http版本,但发生了同样的错误。这可能是Dio Http的一个bug。