Windows Qt http 与后台通信获取tokens 并传输zip文件

理论知识网上有,不多赘述,注意具体使用方法,使用不当会造成内存泄漏的问题。下面直接上代码,简单标注。

QT       += network

h文件
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QHttpMultiPart>
#include <QHttpPart>
#include <QVariant>
#include <QJsonParseError>
#include <QMap>
#include <QFile>
#include <QFileInfo>
#include <QEventLoop>

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    ///
    /// \brief getTokens 获取tokens数据
    ///
    void getTokens();

    ///
    /// \brief getKindergartenList 获取列表
    /// \param tokens
    ///
    void getKindergartenList(QString tokens);

    ///
    /// \brief setStudentImage 发送zip文件
    /// \param tokens
    /// \param kindergartenID
    /// \param filePath
    ///
    void setStudentImage(QString tokens, QString kindergartenID, QString filePath);

private slots:
    void tokens_slots(QNetworkReply *reply);

    void getKindergartenList_slots(QNetworkReply *reply);

    void setStudentImage_slots(QNetworkReply *reply);

private:
    Ui::Widget *ui;
    //获取tokens
    QNetworkAccessManager *manager_tokens;
    QNetworkRequest request_tokens;
    QEventLoop loop_tokens;
    QString m_tokens;

    //获取幼儿园 名称 ID
    QNetworkAccessManager *manager_kindergartenList;
    QNetworkRequest request_kindergartenList;
    QEventLoop loop_kindergartenList;
    QMap<QString, QString> m_kindergartenMap;  // 名称 id
    QString m_kindergartenID;

    //传输学生照片信息
    QNetworkAccessManager *manager_studentImage;
    QNetworkRequest request_studentImage;
    QHttpMultiPart *part_studentImageMulti;   //传输文件

};
#endif // WIDGET_H

cpp文件
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    getTokens();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::getTokens()
{
    //用户名密码
    QByteArray content;
    content.append("username=Test&");
    content.append("password=123456");

    request_tokens.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded; charset=UTF-8");
    request_tokens.setHeader(QNetworkRequest::ContentLengthHeader, content.length());
    request_tokens.setUrl(QUrl("http://localhost/test/rest/tokens"));

    //新建对象
    manager_tokens = new QNetworkAccessManager();
    connect(manager_tokens, SIGNAL(finished(QNetworkReply *)), this, SLOT(tokens_slots(QNetworkReply *)));
    QNetworkReply *reply = manager_tokens->post(request_tokens, content);
    connect(reply, SIGNAL(finished()), &loop_tokens, SLOT(quit()));
    loop_tokens.exec();
    reply->deleteLater();
    manager_tokens->deleteLater();
}

void Widget::getKindergartenList(QString tokens)
{
    QByteArray content;
    content.append("");
    //--header 
    request_kindergartenList.setRawHeader("Content-Type", "application/json");
    request_kindergartenList.setRawHeader("Accept", "text/html");
    request_kindergartenList.setRawHeader("X-AUTH-TOKEN", tokens.toLatin1());
    request_kindergartenList.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded; charset=UTF-8");
    request_kindergartenList.setHeader(QNetworkRequest::ContentLengthHeader, content.length());
    request_kindergartenList.setUrl(QUrl("http://localhost/test/rest/faceImport/getKindergartenList"));

    //新建对象
    manager_kindergartenList = new QNetworkAccessManager();
    connect(manager_kindergartenList, SIGNAL(finished(QNetworkReply *)), this, SLOT(getKindergartenList_slots(QNetworkReply *)));
    QNetworkReply *reply = manager_kindergartenList->post(request_kindergartenList, content);
    connect(reply, SIGNAL(finished()), &loop_kindergartenList, SLOT(quit()));
    loop_kindergartenList.exec();
    reply->deleteLater();
    manager_kindergartenList ->deleteLater();
}
//传输zip文件
void Widget::setStudentImage(QString tokens, QString kindergartenID, QString filePath)
{
    QUrl url = "http://localhost/test/rest/faceImport/importFaces?departId=" + kindergartenID;
    QByteArray content;
    QEventLoop loop;

    //--header
    //发送multi part内容时,不能设置下面一句,否则服务端无法解析边界
//    request_studentImage.setRawHeader("Content-Type", "multipart/form-data");
    request_studentImage.setRawHeader("Accept", "text/html");
    request_studentImage.setRawHeader("X-AUTH-TOKEN", tokens.toLatin1());
    //传输文件
    QFile file(filePath);
    file.open(QIODevice::ReadOnly);
    QByteArray readFile = file.readAll();
    QFileInfo fileInfo(file);
    QString fileName = fileInfo.fileName();
    file.close();

    QString boundary = "-------------------------acebdf13572468";
    QString startBoundary = "--" + boundary;
    QString endBoundary = "\r\n--" + boundary + "--\r\n";
    QString m_ContentType = "multipart/form-data; boundary=" + boundary;
    QString tempStr = startBoundary;
    tempStr += "\r\nContent-Disposition: form-data; name=\"file\"; filename=\""+fileName+"\"\r\n";
    tempStr += "Content-Type: application/zip \r\n\r\n";
    content.append(tempStr.toLatin1());
    content.append(readFile);
    content.append(endBoundary);

    request_studentImage.setHeader(QNetworkRequest::ContentTypeHeader, m_ContentType);
    request_studentImage.setHeader(QNetworkRequest::ContentLengthHeader, content.length());
    request_studentImage.setUrl(url);

    //新建对象
    manager_studentImage = new QNetworkAccessManager();
    
    QNetworkReply *reply = manager_studentImage->post(request_studentImage, content);
    connect(reply , SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();

    manager_studentImage->deleteLater();

    QByteArray setData;
    if (reply->error() == QNetworkReply::NoError)
    {
        setData = reply->readAll();
        ui->textBrowser->append("send student image = " + setData);
    } else {
        qDebug()<<reply->error();
    }
    reply->deleteLater();
}

void Widget::tokens_slots(QNetworkReply *reply)
{
    if (reply->error() == QNetworkReply::NoError)
    {
        m_tokens = reply->readAll();
        ui->textBrowser->setText("tokens = " + m_tokens);

        getKindergartenList(m_tokens);
        loop_tokens.exit();
    } else {
        qDebug()<<reply->error();
    }
    reply->deleteLater();
}

void Widget::getKindergartenList_slots(QNetworkReply *reply)
{
    QByteArray getData;
    m_kindergartenMap.clear();

    if (reply->error() == QNetworkReply::NoError)
    {
        getData = reply->readAll();
        ui->textBrowser->append("kindergartenlist = " + getData);
    } else {
        qDebug()<<reply->error();
    }

    //由于传输的json中含有汉字,所以采用以下方法进行转换
    QString result = QString::fromUtf8(getData.data());          //Windows
//    QString result = QString::fromLocal8Bit(getData.data());   //Linux
    QJsonParseError parseError;
    QJsonDocument jsonDocument;
    jsonDocument = QJsonDocument::fromJson(result.toStdString().data(), &parseError);
    if(parseError.error != QJsonParseError::NoError) {
        qDebug()<<"json error code "<<parseError.errorString();
    }

    QJsonObject rootObject = jsonDocument.object();
    if(!rootObject.isEmpty()) {
        if(rootObject.contains("dataMap")){
            QJsonObject subObject = rootObject.value("dataMap").toObject();
            if(subObject.contains("EbrBsList")) {
                QJsonArray subArray = subObject.value("EbrBsList").toArray();
                for(int i=0;i<subArray.size();i++) {
                    QJsonObject jsonObject = subArray.at(i).toObject();
                    QString id = jsonObject.value("id").toString();
                    QString name = QString::fromUtf8(jsonObject.value("departname").toString().toUtf8().data());
                    m_kindergartenMap.insert(name, id);
                }
            }
        }
        loop_kindergartenList.exit();
    }

    ui->textBrowser->append("\n\n\t\t  学校名字                  学校id");
    QMap<QString, QString>::iterator it;
    for(it=m_kindergartenMap.begin();it!=m_kindergartenMap.end();it++){
        ui->textBrowser->append("\t\t"+it.key() +"                  "+it.value());
    }

    //QMap<QString, QMap<QString, QString> >的使用
//    QMap<QString, QMap<QString, QString> > m_studentMap; //姓名 性别 id
//    QMap<QString, QMap<QString, QString> >::iterator it;
//    for(it=m_studentMap.begin();it!=m_studentMap.end();it++){
//        QMap<QString, QString>::iterator temp_it;
//        for(temp_it=it.value().begin();temp_it!= it.value().end(); temp_it++) {
//            ui->textBrowser->append("\t\t"+it.key() +" "+temp_it.key()+" " +temp_it.value());
//        }
//    }

    QString findId = m_kindergartenMap.value("智障学校");
    m_kindergartenID = findId;
    ui->textBrowser->append("查找的幼儿园为:智障学校   ID : " + findId);

    setStudentImage(m_tokens, m_kindergartenID, "zip文件的绝对路径");

    reply->deleteLater();
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值