【问题标题】:How to post data to https server in dart?如何将数据发布到 dart 中的 https 服务器?
【发布时间】:2018-09-25 03:43:46
【问题描述】:

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

我怎样才能在飞镖语言中实现这一点?

下面是我用来通过 http 向网络服务器发出单个 post 请求的代码,但是每当我用 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 还很陌生,请帮帮我。欢迎提出建议。

【问题讨论】:

  • 有两种不同的 HTTP 客户端:dart:io 和 package:http。你用的是哪个?你被困在哪里了? JSON 位、发布位或证书信任位?也许显示您的代码并分享不起作用的部分。
  • 我正在使用包:http。如何绕过验证使用自签名证书?已使用代码对问题进行了更改。

标签: dart flutter


【解决方案1】:

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 控制您是获得默认行为还是允许错误的证书。

【讨论】:

  • 忘了说:你需要导入 dart:io 来获取 HttpClient
  • http包有一些变化,需要导入'package:http/io_client.dart'才能访问IOClient。
【解决方案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());
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果您希望为 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。

      【讨论】:

        猜你喜欢
        • 2014-07-10
        • 2019-03-31
        • 2013-07-15
        • 2015-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多