如何在dart中将数据发布到https服务器?

时间:2018-04-15 07:59:33

标签: dart flutter

所以我正在构建一个应用程序,我遇到了一个问题。 我需要将JSON数据发布到https服务器。由于该应用程序目前正在开发中,因此我们使用自签名证书。

我怎样才能用dart语言实现这一目标?

以下是我用来通过 http 向网络服务器发送单一帖子请求的代码,但每当我用 https http 时>(自签名)我收到错误:

 HandshakeException:客户端中的握手错误(操作系统错误:  CERTIFICATE_VERIFY_FAILED:自签名证书(handshake.cc:355))

 var url = 'http://192.168.1.40/registration.php'; //or https
 var data = {"email":"yyyy@xx.com","name":"xyz"};

 http.post(url, body:data)
     .then((response) {
   print("Response status: ${response.statusCode}");
   print("Response body: ${response.body}");
 }).catchError((error) => print(error.toString()));

我对Flutter和Dart很新,请帮助我。建议将受到欢迎。

4 个答案:

答案 0 :(得分:5)

http.post是一个便利包装器,可以在引擎盖下创建一个IOClient。您可以将自己的io HttpClient传递给它,这样就可以禁用证书检查,所以你只需要自己构建它们就好了......

  bool trustSelfSigned = true;
  HttpClient httpClient = new HttpClient()
    ..badCertificateCallback =
        ((X509Certificate cert, String host, int port) => trustSelfSigned);
  IOClient ioClient = new IOClient(httpClient);
  ioClient.post(url, body:data);

  // don't forget to call ioClient.close() when done
  // note, this also closes the underlying HttpClient

bool trustSelfSigned控制您是否获得默认行为或允许不良证书。

答案 1 :(得分:2)

针对所有http请求的ssl认证问题的最佳方法

class MyHttpOverrides extends HttpOverrides{
  @override
  HttpClient createHttpClient(SecurityContext context){
    return super.createHttpClient(context)
      ..badCertificateCallback = (X509Certificate cert, String host, int port)=> true;
  }
}

void main(){
    HttpOverrides.global = new MyHttpOverrides();
    runApp(new MyApp());
}

答案 2 :(得分:0)

您可以尝试将自签名证书添加到您的设备。我知道IOS在证书方面非常挑剔。但对于开发环境,我会使用普通的HTTP调用。如果服务器拥有自己的域名(全局,非本地),则可以使用Certbot。所有项目的免费SSL证书。而且设置非常简单快捷。

答案 3 :(得分:0)

如果您想使用绕行证书(无论是针对Web还是移动设备),请查看以下答案:https://stackoverflow.com/a/57801629/4458708。总之,

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

var _httpClient = HttpClient();
_httpClient.badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
var _ioClient = ioclient.IOClient(_httpClient);

并在您的请求中使用_ioClient。