作者:Th川_546 | 来源:互联网 | 2023-09-01 18:42
项目中使用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(),"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{
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。