qt 通过Http/https 模拟 get 和Post请求

简单点,说话的方式简单点.

 

模拟Get请求

.h中创建两个变量
QString m_strGetURL;                   //Get请求地址
QNetworkRequest m_netGetRequestHead;   //Get请求头

.cpp中

初始化函数中
/* 组装协议头 */
m_netGetRequestHead.setRawHeader("Accept", "application/json, text/plain, */*");
m_netGetRequestHead.setRawHeader("Accept-Language", "zh-CN,en-US;q=0.8");
//...

/* 如果是https请求,则需支持SSL验证 */
if(m_strGetURL.toLower().startsWith("https"))
{
    QSslConfiguration sslConfig;
    sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
    sslConfig.setProtocol(QSsl::TlsV1_0);   //具体以OpenSSL版本为准
    m_netGetRequestHead.setSslConfiguration(sslConfig);
}

具体逻辑中
/* 1.开始请求数据 */
    QNetworkAccessManager netManager;
    QNetworkReply *pReply = netManager.get(m_netGetRequestHead);

    /* 2.开启一个局部的事件循环,等待响应结束,退出 */
    QEventLoop loop;
    QTimer timer;

    QObject::connect(&netManager,SIGNAL(finished(QNetworkReply *)), &loop,SLOT(quit()));

    //请求结束并下载完成后,退出子事件循环
    QObject::connect(pReply, SIGNAL(finished()), &loop, SLOT(quit()));

    //超时退出
    QObject::connect(&timer,SIGNAL(timeout()),&loop, SLOT(quit()));

    //超时设置2秒钟
    timer.start(m_iTimeOut);

    //开启子事件循环
    loop.exec();

    if(pReply->error() != QNetworkReply::NoError)
    {
        m_strDebugInfo += "本次未能获取到数据\t";
        return ;
    }

    QVariant statusCodeV = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    int iReplyCode = statusCodeV.toInt();

    /* 3.处理应答报文 */
    QByteArray arRepData = pReply->readAll();
    QString    result    = QString::fromStdString(arRepData.toStdString()).toUtf8();

    QJsonParseError jsonError;
    QJsonDocument jsonDocument = QJsonDocument::fromJson(result.toUtf8(), &jsonError);
    if(jsonError.error == QJsonParseError::NoError)
    {
        QJsonObject object = jsonDocument.object();
        if(1 == object.take("code").toInt())
        {
            //...
        }
    }

拿来即用的代码.如果要使用https请求的话,记得要去下载openssl库,或者直接去下方的资源链接下载也行(包含能够在android上使用的.o库)

https://download.csdn.net/download/weixin_43935710/12134419

这里特别注意一点:如果发现应答的数据的应答码是301或者302的话,这是因为重定向

所以决绝办法就是:

重定向的问题看你用的是哪个版本的Qt
5.6以前版本:
先用reply->rawHeader("Location")获取跳转的url,然后重新请求此url。注意可能会重定向多次,重复执行前面步骤即可。
5.6之后的版本,包括5.6
在managerNetwork->get之前,调用req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);让Qt自动为你跳转

 

你可能感兴趣的:(Qt)