QT 客户机上https get请求JSON解析无数据

项目中使用https抓天气数据,在测试环境使用正常,客户机部分电脑无法使用,部分电脑正常。

开始以为JSON解析出错,于是:

QJsonParseError err; //判断是否为cjson数据

WriteFile( err.errorString(),"C:/error.txt");

在客户机上运行后返回:illegal value

根据错误回去检查JSON数据

QJsonDocument doc = QJsonDocument::fromJson(buf.toUtf8(),&err);
    
WriteFile( QString(doc.toJson()),"C:/error.txt");

惊讶的发现数据为空,抱着怀疑去查看了 QNetworkReply 的回复值

QString buf = reply->readAll(); //cJSON数据放入缓冲区,定义为字符串

WriteFile( buf,"C:/error.txt");

WriteFile( reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).value<QString>(),"C:/error.txt");

果然发现应答为空,立即打印错误信息

WriteFile( reply->errorString(),"C:/error.txt");

提示 error creating ssl context()

考虑到在测试环境使用正常,客户机部分电脑无法使用,部分电脑正常等原因,可能是windows系统缺少openssl的原因。Qt支持https请求需要配置openssl环境,Qt默认是不支持SSl认证的,
检测Qt支持的协议

for (int i=0;i< manager.supportedSchemes().count();i++)
{
    WriteFile( manager.supportedSchemes().at(i),"C:/error.txt");
}

经在客户环境下测试确认了是这个原因。

配置文件:库文件 libeay32.dll和ssleay32.dll。下载libeay32.dll 和 ssleay32.dll两个库文件,将其拷贝到程序生成目录下(即生成exe的同级目录)或者拷贝到QtNetwork模块的库文件目录中。

代码配置:

    QNetworkRequest request(url);
    QSslConfiguration conf = request.sslConfiguration();
    conf.setPeerVerifyMode(QSslSocket::VerifyNone);
    conf.setProtocol(QSsl::TlsV1SslV3);
    request.setSslConfiguration(conf);
//    request.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
    manager.get(request);

Win32/Win64 OpenSSL Screenshot下载地址    Win32 OpenSSL进行安装后,将bin目录下面的 libeay32.dll和ssleay32.dll库拷贝出来放到生成程序exe同级目录下即可。

或者搜索本机.\Qt\Qt5.11.0\Tools\QtCreator\bin目录下,有的话直接拷贝一份即可,省安装这么麻烦了。

 

如果还是不能正常运行,请检查运行环境,需要安装Microsoft Visual C++ 2013。


版权声明:本文为qq_40843129原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。