综合了各路网友的心得而成:
QJsonObject httpOperation::postHttpRequestSync(QString jsonData, QString url, qint32 itimeOut)//发起post请求,并同步返回结果
{
QJsonObject resultObj
{
{"success", 1},//0成功 1失败。这里的成功,仅仅是是指网络通信成功,不是业务操作正常成功
{"failreason", "未知原因"},
{"normalresult", ""}//正确的结果
};
QT_TRY{
QNetworkRequest request;
//QNetworkAccessManager* naManager = new QNetworkAccessManager(this);
QNetworkAccessManager naManager;
QEventLoop eventLoop;//局部事件循环,不卡界面
//设置超时 5.15开始自带了超时时间函数 默认30秒
#if (QT_VERSION >= QT_VERSION_CHECK(5,15,0))
naManager.setTransferTimeout(itimeOut*1000);//这个函数的意思是,timeout时间内没有字节传输,就回超时返回。只要有字节在传输,无论多久都会等待传输结束。
#else
QTimer timer;
QObject::connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
timer.setSingleShot(true);
timer.start(itimeOut*1000);
#endif
request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
request.setUrl(QUrl::fromUserInput(url));
if(url.toLower().startsWith("https"))//https请求,需ssl支持(下载openssl拷贝libeay32.dll和ssleay32.dll文件至Qt bin目录或程序运行目录)
{
QSslConfiguration sslConfig;
sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
sslConfig.setProtocol(QSsl::TlsV1_1);
request.setSslConfiguration(sslConfig);
}
QByteArray byte_array = jsonData.toUtf8();
QNetworkReply* reply = naManager.post(request,byte_array);//发起post请求
QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec();
if(!reply->isOpen())
{
reply->deleteLater();
resultObj["failreason"] = "访问远程地址失败,可能是网络不通或远程服务器不存在";
return resultObj;
}
QByteArray bytes = reply->readAll();
// 获取http状态码
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if(statusCode.isValid())
{
//qDebug() << "status code=" << statusCode.toInt();
}
QNetworkReply::NetworkError err = reply->error();
if(err != QNetworkReply::NoError)
{
qDebug() << "Failed: " << reply->errorString();
reply->deleteLater();
resultObj["failreason"] = reply->errorString() + "http状态码:" + statusCode.toString();
return resultObj;
}
else
{
// 获取返回内容
//qDebug() << "loginResultJson is " << QString::fromStdString(bytes.toStdString());
//处理返回数据
resultObj["success"] = 0;
resultObj["failreason"] = "";
resultObj["normalresult"] = QString::fromStdString(bytes.toStdString());
reply->deleteLater();
return resultObj;
}
}
QT_CATCH(...)
{
return resultObj;
}
}