qt随手记:同步收发https的方法

综合了各路网友的心得而成:

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;
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值