IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> QT的http封装类 -> 正文阅读

[网络协议]QT的http封装类

头文件如下

#pragma once

#ifndef _HTTP_H_
#define _HTTP_H_

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QHttpPart>
#include <QHttpMultiPart>
#include <QUrl>
#include <QJsonParseError>
#include <QJsonValue>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonArray>
#include <QEventLoop>
#include <QDebug>
#include <QFile>
#include <QUrlQuery>

typedef struct _HTPPError
{
	int dataerrorcode;
	int fileerrorcode;
}HTPPError;

class Http : public QObject
{
	Q_OBJECT

	public:
		Q_INVOKABLE void SendData(const QString& url, QJsonObject jsonObj);
		//Q_INVOKABLE void SendFile(const QString& url, QFile *file, QString FileName);
		Q_INVOKABLE void SendFile(const QString& url, const QString strFilePath);

		HTPPError GetHTPPError() { return Error; }

	public:
		const QString urldata = "http://192.168.1.110:82/prod-api/dafen/cableAuto/upload/dafen-data";
		const QString urlpic = "http://192.168.1.110:82/prod-api/dafen/cableAuto/upload/cable-picture?cableId=1&desc=";
		const QString urlpdf = "http://192.168.1.110:82/prod-api/dafen/cablePdf/upload/cable-pdf?cableId=1";
		
	private:
		HTPPError Error;
};


#endif

源文件如下:

#include "http.h"
#include <QTimer>
#include <QFileInfo>

void Http::SendData(const QString& url, QJsonObject jsonObj)
{
	QJsonDocument document;
	document.setObject(jsonObj);

	QByteArray content = document.toJson(QJsonDocument::Compact);
	
	QNetworkRequest request;
	request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
	request.setUrl(url);

	QNetworkAccessManager *manager = new QNetworkAccessManager();
	QNetworkReply* reply = manager->post(request, content);

	QEventLoop _loop;
	QTimer timer;
	connect(reply, SIGNAL(finished()), &_loop, SLOT(quit()));
	connect(&timer, SIGNAL(timeout()), &_loop, SLOT(quit()));
	// eventloop用于阻塞等待消息,并结合timer进行超时处理
	timer.start(1000);
	_loop.exec();
	// 这里的eventloop只是阻塞此段,并不会阻塞其他块的代码,比如我不加定时器,让这个eventloop一直exec,还是可以出发相关的槽函数

	int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
	Error.dataerrorcode = status_code;

	if (timer.isActive())
	{
		timer.stop();
	}

	_loop.deleteLater();
	timer.deleteLater();
	// 释放资源
	reply->abort();
}
void Http::SendFile(const QString& url,const QString strFilePath)
{
	QEventLoop loop;
	QFile *file = new QFile(strFilePath);
	file->open(QIODevice::ReadOnly);
	QHttpMultiPart  *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
	QHttpPart filePart;
	QFileInfo upload_file_info(strFilePath);
	filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));//这里一般这样写
	filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"" + upload_file_info.fileName() + "\""));
	filePart.setBodyDevice(file);
	file->setParent(multiPart);//delte file with the multiPart
	multiPart->append(filePart);
	QNetworkAccessManager* pNetManager = new QNetworkAccessManager;
	QUrl _url(url);
	QNetworkRequest request(_url);
	QNetworkReply* reply = pNetManager->post(request, multiPart);
	multiPart->setParent(reply);//delte multiPart with the reply
	QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
	loop.exec();
	pNetManager->deleteLater();
}

调用方法如下:
先定义一个QJsonObject,然后插入QString(项目代码里面粘贴复制的);

QJsonObject jsonObj;
	jsonObj.insert("cableId", QString::number(cabelid));
	jsonObj.insert("1", result.conductor_size);
	jsonObj.insert("2", result.core_pencil_head_size);
	jsonObj.insert("3", result.outside_pencil_head_size);
	jsonObj.insert("4", result.inner_semiconducting_size);
	jsonObj.insert("5", result.main_insulation_deviation);
	jsonObj.insert("6", result.core_outside_semiconducting_end);
	jsonObj.insert("7", result.core_top_2_outside_pencil_head_distance);
	jsonObj.insert("8", result.conductor_deformation);
	jsonObj.insert("9", result.core_top_uneven);
	jsonObj.insert("10", result.conductor_section_inclination);
	jsonObj.insert("11", result.outside_semiconducting_size);
	jsonObj.insert("12", result.outer_diameter_difference_200_265);
	jsonObj.insert("13", result.insulation_core_size_18);
	jsonObj.insert("14", result.max_con1);
	jsonObj.insert("15", result.max_con2);
	jsonObj.insert("16", result.max_con3);
void Collection::Send()
{
	http->SendData(http->urldata, getJson());//传输数据
	QMessageBox::about(this, tr("Error"), "http数据编码为:"+QString::number(http->GetHTPPError().dataerrorcode));
	
	SendPic(GetVTKQPixmap(ui.qvtkWidget2));
	SendPic(GetVTKQPixmap(ui.qvtkWidget3));
	SendPic(GetVTKQPixmap(ui.qvtkWidget4));
	SendPic(GetVTKQPixmap(ui.qvtkWidget5));
}
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:30:49  更:2022-03-21 21:33:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:20:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码