理论知识网上有,不多赘述,注意具体使用方法,使用不当会造成内存泄漏的问题。下面直接上代码,简单标注。
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();
}