Qt Http请求

1.请求body类型 Content-Type:multipart/form-data

void MainWindow::onPushButtonClick()
{
    QNetworkRequest request;
    QNetworkAccessManager* naManager = new QNetworkAccessManager(this);
    connect(naManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));

    request.setUrl(QUrl("http://www.taichangle.com/taichangle.php"));

    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

    QHttpPart textPart;
    textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"text\""));
    textPart.setBody("十大歌手豆腐干打手犯规使得法国打手犯规山东分公司的风格然后他柔荑花人工湖人生规划挺好当时腹背受敌复合弓人放个散热膏山东分公司的风格代发货人太阳能接听电话电风扇格式豆腐干使得法国打手犯规打手犯规山东分公司的风十大歌手豆腐干打手犯规使得法国打手犯规山东分公司的风格然后他柔荑花人工湖人生规划挺好当时腹背受敌复合弓人放个散热膏山东分公司的风格代发货人太阳能接听电话电风扇格式豆腐干使得法国打手犯规打手犯规山东分公司的风格十大歌手豆腐干打手犯规使得法国打手犯规山东分公司的风格然后他柔荑花人工湖人生规划挺好当时腹背受敌复合弓人放个散热膏山东分公司的风格代发货人太阳能接听电话电风扇格式豆腐干使得法国打手犯规打手犯规山东分公司的风格十大歌手豆腐干打手犯规使得法国打手犯规山东分公司的风格然后他柔荑花人工湖人生规划挺好当时腹背受敌复合弓人放个散热膏山东分公司的风格代发货人太阳能接听电话电风扇格式豆腐干使得法国打手犯规打手犯规山东分公司的风格十大歌手豆腐干打手犯规使得法国打手犯规山东分公司的风格然后他柔荑花人工湖人生规划挺好当时腹背受敌复合弓人放个散热膏山东分公司的风格代发货人太阳能接听电话电风扇格式豆腐干使得法国打手犯规打手犯规山东分公司的风格十大歌手豆腐干打手犯规使得法国打手犯规山东分公司的风格然后他柔荑花人工湖人生规划挺好当时腹背受敌复合弓人放个散热膏山东分公司的风格代发货人太阳能接听电话电风扇格式豆腐干使得法国打手犯规打手犯规山东分公司的风格格");

    multiPart->append(textPart);

    QNetworkReply* reply = naManager->post(request, multiPart);
}


QString UnicodeToUTF8(QString str)
{
    do {
        int idx = str.indexOf("\\u");
        QString strHex = str.mid(idx, 6);
        strHex = strHex.replace("\\u", QString());
        int nHex = strHex.toInt(nullptr, 16);
        str.replace(idx, 6, QChar(nHex));
    } while (str.indexOf("\\u") != -1);
    return str;
}

void MainWindow::requestFinished(QNetworkReply* reply)
{
    // 获取http状态码
    QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if(statusCode.isValid())
        qDebug() << "status code=" << statusCode.toInt();

    QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
    if(reason.isValid())
    {
        qDebug() << "reason=" << reason.toString();
    } 

    QNetworkReply::NetworkError err = reply->error();
    if(err != QNetworkReply::NoError) 
    {
        qDebug() << "Failed: " << reply->errorString();
    }
    else
    {
        qDebug() <<UnicodeToUTF8(reply->readAll()).toUtf8().data();
    }
}

2.HTTP请求阻塞方法

void MainWindow::sendGetRequest()
{
    QNetworkAccessManager *m_pHttpMgr = new QNetworkAccessManager();
    //设置url
    QString url = "http://10.0.0.20:8005/vending_machine/items/ac83f39ea268";//fae4b325e52c
    QNetworkRequest requestInfo;
    requestInfo.setUrl(QUrl(url));

    //添加事件循环机制,返回后再运行后面的
    QEventLoop eventLoop;
    QNetworkReply *reply =  m_pHttpMgr->get(requestInfo);
    connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
    eventLoop.exec();       //block until finish
    //错误处理
    if (reply->error() == QNetworkReply::NoError)
    {
        qDebug() << "request protobufHttp NoError";
    }
    else
    {
        qDebug()<<"request protobufHttp handle errors here";
        QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
        //statusCodeV是HTTP服务器的相应码,reply->error()是Qt定义的错误码,可以参考QT的文档
        qDebug( "request protobufHttp found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
        qDebug(qPrintable(reply->errorString()));
    }
    //请求返回的结果
    QByteArray responseByte = reply->readAll();
    qDebug() << responseByte;
}
发布了45 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ly1390811049/article/details/101642499