【发布时间】:2022-01-01 13:34:55
【问题描述】:
我正在尝试从 Flutter 向 myapp 服务发送 GET/POST 请求。 现在我正在从 POSTMAN 执行此操作,我已经配置了 CA 证书,以及具有 3 个配置的 客户端证书:(主机、Crt 文件、密钥文件)。
现在在 POSTMAN 中效果很好,我收到了响应。 在颤振上,我不确定如何提取这 3 个文件并创建 Get 请求以获取响应。
对我如何在颤振中实现它有任何帮助吗?
我试过这个:
void getAPI() {
var url = "https://controller.test.io/v1/";
SecurityContext context = SecurityContext();
context.setTrustedCertificates("/Users/me/keys/crtfile");
context.usePrivateKey("/Users/me/keys/keyfile");
HttpClient client = new HttpClient(context: context);
client.getUrl(Uri.parse(url))
.then((HttpClientRequest request) => request.close())
.then((HttpClientResponse response) {
response.transform(utf8.decoder).listen((contents) {
print(contents);
});
});
}
但我明白了:
Cannot open file, path = '/Users/me/keys/crtfile' (OS Error: Operation not permitted, errno = 1)
#attempt 2:
class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}
Future<void> getdata() async {
var url = "https://controller.mine.try/api/v1";
WidgetsFlutterBinding.ensureInitialized();
HttpOverrides.global = MyHttpOverrides();
SecurityContext context = SecurityContext();
HttpClient client = HttpClient(context: context);
client.maxConnectionsPerHost=5;
try {
HttpClientRequest request = await client.getUrl(Uri.parse(url));
HttpClientResponse response = await request.close();
final stringData = await response.transform(utf8.decoder).join();
print(stringData);
} finally {
client.close();
}
结果:
Unhandled Exception: HttpException: Connection closed before full header was received, uri
【问题讨论】:
-
在一个普通的 Dart 项目中,从文件中读取字节并使用
usePrivateKeyBytes。测试有效。然后,在 Flutter 中,将文件添加为资产,加载它们(您最终会得到ByteData,因此使用.buffer.asUint8List()转换为字节)并继续如上。您很有可能不想将私钥放在生产应用程序的资产中 - 您可能需要考虑一种不同的方式来验证客户端而不是客户端证书。 -
我不确定如何执行您提到的所有步骤。你能告诉我代码吗? @RichardHeap 该应用程序将本地化。我不想把crt放到网上,只能从本地电脑上拉出来。
-
这个问题已经涵盖了它:stackoverflow.com/questions/56300017/…
-
@RichardHeap 我试过但它请求资产。我希望用户从他的电脑中选择路径。可以吗?用户已经可以选择路径,我可以使用该路径。但我如何使用它:rootBundle.load?
标签: flutter dart postman flutter-dependencies