首先要在头文件中包含以下文件
#include<QNetworkRequest>
#include<QNetworkReply>
#include<QNetworkAccessManager>
post请求的写法
/**
* @brief Postt请求
* @param (不可为空)strUrl 输入参数,请求的Url地址,如:http://192.168.0.255/login 根据需要在后面拼接相应的内容,传递变量
* @param (可为空)strFiles json 格式字符串,用于上传文件,表单数据,json格式的表单值,
* {
"file1": 注意表示路径要用 '/',key中应含有"file",单个文件或多个文件都用数组格式
[
"C:/user/project/test1.txt",
"C:/user/project/test2.txt"
]
"form1":"f1",
"user":{
"id":1,
"loginName":"loginName1",
"userName","userName1"
}
} !记得转成QString类型传入
* @param (可为空)strPost 登陆时,用于传json格式body,"{\"loginName\":\"zhangsan\",\"password\":\"123456\",\"machineCode\":\"machineCodeX64\"}"
* 传值时,用于传json格式header,"{\"header1\":\"h1\",\"header2\":\"h2\"}"
* @param (建议传空变量)strResponse 输出参数,返回的内容
* @return 返回是否Post成功
*/
CHTTPCLIENT_EXPORT int doPost(QString& strUrl, const QString& strFiles, const QString& strPost, QString& strResponse);
int CHttpClient::doPost(QString& strUrl, const QString& strfiles, const QString& strPost, QString& strResponse)
{
std::tuple<QString, QString> FUrl = ^^^^^^^^;//通过读取本地配置文件获得端口号和主机号
QString Url = QString("http://%1:%2/%3").arg(std::get<0>(FUrl)).arg(std::get<1>(FUrl)).arg(strUrl);
QTimer timer; // 计时,一是不让程序在请求完成前就退出,另一方面是控制请求时间,判断超时就退出
timer.setInterval(1500); // 设置超时时间 1.5 秒
timer.setSingleShot(true); // 单次触发
QNetworkAccessManager* g_manager = new QNetworkAccessManager(); // 初始化
QNetworkRequest request;
request.setUrl(QUrl(Url)); // 设置请求地址
request.setRawHeader("Datagrid-Authorization:", Token.toUtf8());//token,是用户登陆时获得的,之后的请求都要先设置token
QNetworkReply* reply = nullptr; // 初始化请求的返回类
if (strfiles.isEmpty()) {
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");//设置请求头
QJsonDocument strPost_doc = QJsonDocument::fromJson(strPost.toUtf8());
QByteArray dataArray = strPost_doc.toJson(QJsonDocument::Compact);
reply = g_manager->post(request, dataArray); // 发出post请求
}
else {
QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QJsonParseError JSON_Error;
QJsonDocument doc = QJsonDocument::fromJson(strfiles.toUtf8(), &JSON_Error);
if (doc.isEmpty() || (JSON_Error.error != QJsonParseError::NoError)) {
return 0;
}
//JSON对象
QVariantMap jsonMap = doc.toVariant().toMap();
QMap<QString, QVariant> paths; // 存上传文件的路径
QMap<QString, QVariant> params{}; // 存其他要请求的数据
for (auto it = jsonMap.constBegin(); it != jsonMap.constEnd(); ++it) {
if (it.key().contains("file")) {
paths.insert(it.key(), it.value());
}
else if (it.key().contains("form")) {
params.insert(it.key(), it.value().toString().toUtf8());
}
else {
auto _valuetype = it.value().type();
if (!it.value().toJsonObject().isEmpty()) {
auto _value = it.value().toJsonObject();
QJsonDocument json_doc(_value);
params.insert(it.key(), QString(json_doc.toJson()).remove(QRegExp("\\s")).toUtf8());
}
else if (!it.value().toString().isEmpty()) {
auto _value = it.value().toString();
params.insert(it.key(), _value.toUtf8());
}
else if (it.value().toInt() != 0) {
auto _value = it.value().toInt();
params.insert(it.key(), QString(_value).toUtf8());
}
else if (!it.value().toStringList().isEmpty()) {
auto _value = it.value().toStringList().join(",").toUtf8();
params.insert(it.key(), _value);
}
}
}
QJsonDocument jsonDocument = QJsonDocument::fromJson(strPost.toUtf8().data());
if (!jsonDocument.isNull()) {//判断是否为空
QJsonObject* json_obj = new QJsonObject(jsonDocument.object());
for (auto it = json_obj->begin(); it != json_obj->end(); ++it) {
request.setRawHeader(it.key().toUtf8(), it.value().toString().toUtf8());
}
}
for (auto it = params.cbegin(); it != params.cend(); ++it) {
QString name = it.key();
auto value = it.value().toByteArray();
QHttpPart textPart;
if (name.contains("form")) {
textPart.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain");
textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QString("form-data; name=\"%1\"").arg(name));
}
else {
textPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=utf-8"));
textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QString("form-data; name=\"%1\"").arg(name));
}
textPart.setBody(value);
multiPart->append(textPart);
}
if (paths.size() > 0) {
for (auto it = paths.constBegin(); it != paths.constEnd(); ++it) {
QString inputName = it.key();
auto filelist = it.value().toList();
for (int i = 0; i < filelist.size(); ++i)
{
QString _file = filelist.at(i).toString();
QFile* file = new QFile(_file, multiPart);
QFileInfo file_info(_file);
if (!file->open(QIODevice::ReadOnly)) {
QString failMessage = QString("打开文件失败[%2]: %1").arg(_file).arg(file->errorString());
multiPart->deleteLater();
return 0;
}
auto x = file_info.fileName();
QString disposition = QString("form-data; name=\"%1\"; filename=\"%2\"").arg(inputName).arg(file_info.fileName());
QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(disposition));
filePart.setBodyDevice(file);
multiPart->append(filePart);
}
}
}
reply = g_manager->post(request, multiPart);
multiPart->setParent(reply);
}
if (nullptr == reply)return 0;
QEventLoop loop; // 开启循环等待
QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); // 超时则退出循环
QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); // 请求成功则退出循环
timer.start(); // 开始计时
loop.exec(); // 启动事件循环
if (timer.isActive()) { // 处理响应
timer.stop();
if (reply->error() != QNetworkReply::NoError) { // 错误处理
qDebug() << "Error String : " << reply->errorString();
}
else {
QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
int nStatusCode = variant.toInt();
QByteArray bytes = reply->readAll(); // 处理请求到的数据
QJsonParseError jsonError;
QJsonDocument jsDoc = QJsonDocument::fromJson(bytes, &jsonError);
if (jsonError.error != QJsonParseError::NoError) {
qDebug() << QStringLiteral("解析Json失败");
return 0;
}
strResponse = QString(jsDoc.toJson(QJsonDocument::Indented)); // 把请求结果回传
}
}
else { // 处理超时
QObject::disconnect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
reply->abort();
reply->deleteLater();
qDebug() << "Timeout";
}
return 1;
}
get请求示例
/**
* @brief Get请求
* @param (不可为空)strUrl 输入参数,请求的Url地址,如:http://192.168.0.3/security/manager/user/test/get/simplest
* @param (不下载文件时可以传空值)strSavePath 下载文件的保存地址,如:下载图片格式文件strSavePath = "C:/Users/Administrator/Pictures/pic.png",请求文件类型要和提供的保存格式一致,否则会导致乱码
* @param (建议传空变量)strResponse 输出参数,返回的内容
* @return 返回是否Get成功
*/
CHTTPCLIENT_EXPORT int doGet(QString& strUrl, const QString& strSavePath, QString& strResponse);
int CHttpClient::doGet(QString& strUrl, const QString& strSavePath, QString& strResponse)
{
std::tuple<QString, QString> FUrl = ^^^^^^^^;//获得端口号和主机号
QString Url = QString("http://%1:%2/%3").arg(std::get<0>(FUrl)).arg(std::get<1>(FUrl)).arg(strUrl);
qDebug() << Url;
QTimer timer;
timer.setInterval(15000); // 设置超时时间 1.5 秒
timer.setSingleShot(true); // 单次触发
QNetworkRequest request;
QNetworkReply* reply = nullptr;
request.setUrl(QUrl(Url));
request.setRawHeader("Datagrid-Authorization:", g_Token.toUtf8());
QNetworkAccessManager* g_manager = new QNetworkAccessManager();
if (strSavePath.isEmpty()) {
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
}
reply = g_manager->get(request);
QEventLoop loop; // 开启循环等待
QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); // 超时则退出循环
QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); // 请求成功则退出循环
timer.start(); // 开始计时
loop.exec(); // 启动事件循环
if (timer.isActive()) { // 处理响应
timer.stop();
if (reply->error() != QNetworkReply::NoError) { // 错误处理
qDebug() << "Error String : " << reply->errorString();
}
else {
QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
int nStatusCode = variant.toInt();
QByteArray bytes = reply->readAll(); // 处理请求到的数据
QJsonParseError jsonError;
QJsonDocument jsDoc = QJsonDocument::fromJson(bytes, &jsonError);
if (jsonError.error != QJsonParseError::NoError) {
qDebug() << QStringLiteral("解析Json失败");
if (!strSavePath.isEmpty()) {
QFile* file = new QFile(strSavePath);
// [1] 打开下载文件,如果打开文件出错,不进行下载
if (!file->open(QIODevice::WriteOnly | QIODevice::Truncate)) {
file->close();
file->deleteLater();
qDebug().noquote() << QString("[错误] 打开文件出错: %1").arg(strSavePath);
return 0;
}
file->write(bytes);
file->flush(); //不关闭文件,文件内容将为空
file->close();
file->deleteLater();
}
}
else {
strResponse = QString(jsDoc.toJson(QJsonDocument::Indented)); // 把请求结果回传
}
}
}
else { // 处理超时
QObject::disconnect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
reply->abort();
reply->deleteLater();
qDebug() << "getTimeout";
}
return 1;
}
使用get下载文件
bool doDownLoad(const QString& strUrl, const QString& strSavePath)
{
bool isSuccess = true;
QFile* tempFile;
QTimer timer;
QNetworkRequest request;
QNetworkReply* reply = nullptr;
request.setUrl(QUrl(strUrl));
request.setRawHeader("Datagrid-Authorization", g_Token.toUtf8());
QNetworkAccessManager* g_manager = new QNetworkAccessManager();
reply = g_manager->get(request);
QEventLoop loop; // 开启循环等待
QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); // 超时则退出循环
QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); // 请求成功则退出循环
QObject::connect(reply, &QNetworkReply::finished, [&]() {
if (reply->error() != QNetworkReply::NoError) { // 错误处理
qDebug() << "Error String : " << reply->errorString() << strUrl ;
emit errorBox("资源下载错误:"+ reply->errorString());
isSuccess = false;
}
});
QObject::connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(slotDownLoadSpeed(qint64, qint64))); // 请求成功则退出循环
QObject::connect(reply, &QNetworkReply::readyRead, [&]() {
QByteArray bytes = reply->readAll();
tempFile->write(bytes);
tempFile->flush();
});
if (!strSavePath.isEmpty()) {
tempFile = new QFile(strSavePath);
// [1] 打开下载文件,如果打开文件出错,不进行下载
if (!tempFile->open(QIODevice::WriteOnly | QIODevice::Truncate)) {
tempFile->close();
tempFile->deleteLater();
qDebug().noquote() << QString("[错误] 打开文件出错: %1").arg(strSavePath);
emit errorBox("资源下载路径错误:"+ strSavePath);
isSuccess = false;
}
}
loop.exec(); // 启动事件循环
tempFile->close();
tempFile->deleteLater();
return isSuccess;
}
剩余的put,和delete请求,套用上面两个请求即可