一、简介

1.任务目标

使用Qt通过post发送Json格式数据,或者以表单形式发送数据到服务器

2.环境简介

系统:Windows 10
Qt版本:5.7

二、内容准备

1、关于Qt

1.使用Post向服务器发送数据,使用到网络编程,需要在Pro文件中加入如下语句

QT       += network

2.使用网络编程需要用到一下库文件,还有一些在本示例中用到的库文件如下

#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QHttpMultiPart>
#include <QHttpPart>
#include <QUrlQuery>

3.Qt中使用Json数据需要用到一下库文件

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

三、Json数据介绍

1.Json中的基础数据类型:数字 字符串 布尔值
数字:int,double,float
字符串:string
布尔值:true,false

2.Json中的常见格式如下
2.1Json对象
通常以**{}**形式存在,数据可以当成pair类型的数据,有key对应着value,每一组key-value用逗号隔开,为方便演示写成多行,也可在一行内写完,例子如下

{
"userid":"123456",
"username":"Tom",
"age":25,
"score":95,
"pass":true
}

或者一行写完

{
“userid”:“123456”,“username”:“Tom”,“age”:25,"score":95,"pass":true
}

2.2Json数组
与C++中数组类似,Json中通常数组格式为数组名:[数据1,数据2…]

"hobby":["足球","羽毛球"]

2.3Json对象与Json数组组合
一个Json对象能包含多个Json数组
一个Json数组可以包含多个Json对象

{
"userid":"123456",
"username":"Tom",
"age":25,
"hobby":[{"足球","羽毛球"},{"书法","绘画"},
]
"score":95,
"pass":true
}

3.Qt中的Json
在Qt中有专门对Json的处理库,在5.x版本之后支持,4.x版本不支持,头文件参看上面头文件部分
Json对象在Qt中使用QJsonObject
Json数组在Qt中使用QJsonArray
在Qt中还有QJsonDocment类,该类可以当作对QJsonObject和QJsonArray的翻译,主要用来读写Json文档

4.表单数据
在Qt中,也可上传表单格式的数据到服务器,不仅可以传数据,也可以传送文件,例如音乐文件(本例使用mp3格式,具体格式可以根据需求改变),图片文件(本例使用jpeg格式,具体格式可以根据需求改变),具体使用方式以及使用格式参考下文代码示例

四、使用方法

1.新建一个类,类名定义为PostSendData,该类主要为实现发送Json数据,表单方式发送文件与接收Json返回的数据的功能,头文件与CPP文件如下

1.PostSendData头文件

class PostSendData: public QObject
{Q_OBJECT
public:PostSendData(QObject * parent = nullptr);public:PostSendData(QNetworkAccessManager* net_acess_manager, QUrl url, int request_type);~PostSendData();public:void SendJsonData();//发送Json数据void SendMusic();//发送音乐文件void SendImage();//发送图片文件public://解析Json数据void getJson(QJsonObject &jsonObj);private slots:void finshedSlot(QNetworkReply* reply);//用来接收返回的Json数据private:QNetworkAccessManager* m_net_manager;QUrl m_url;int m_request_type;
}

2.PostSendData.cpp

#include "postsenddata.h"
PostSendData::PostSendData(QNetworkAccessManager *net_acess_manager, QUrl url, int request_type):m_net_manager(net_acess_manager),m_url(url),m_request_type(request_type)
{connect(m_net_manager,&QNetworkAccessManager::finished,this,&PostSendData::finshedSlot);
}/** 示例要发送的Json数据 *
{
"userid":"123456",
"username":"Tom",
"age":25,
"hobby":["足球","羽毛球"]
"score":95,
"pass":true
}
*/void PostSendData::SendJsonData()
{QNetworkRequest netReq;netReq.setUrl(this->m_url);netReq.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));//post请求设置为json,才能发送josn格式文件//创建一个Json对象,这个Json对象就是要发送的内容,展开成Json数据如上所示QJsonObject jsonObj;jsonObj.insert("userid","123456");jsonObj.insert("username","Tom");jsonObj.insert("age",25);QJsonArray arryHobby;//hobby为一个Json数组,就创建一个QJsonArray对象,用来包含hobby的内容arryHobby.append("足球");arryHobby.append("羽毛球");jsonObj.insert("hobby",arryHobby);//将hobby这个JsonArray加入到hobby这个JsonObject中jsonObj.insert("score",95);jsonObj.insert("pass",true);//创建一个QJsonDocument类对象,jsonDoc可以将Json格式数据转换之后,使用post发送QJsonDocument jsonDoc = QJsonDocument(jsonObj);QByteArray post_data = jsonDoc.toJson(QJsonDocument::Compact);m_net_manager->post(netReq,post_data);
}void PostSendData::SendMusic()
{//打开要发送的音乐文件,这里使用了一首大小为3M的歌曲,也可以具体使用时在指定要发送的音乐文件,此处方便演示直接使用绝对路径下的音乐文件QString filePath = "H:/Code/QT/PostTest/bin/测试.mp3";QFile* file = new QFile(filePath);file->open(QIODevice::ReadOnly);//发送音乐文件时,有可能还有附加的数据内容,可以预先定义好,也可发送时再定义QString userid = "123456";QString username = "Tom";QNetworkRequest netReq;netReq.setUrl(this->m_url);/** 使用QHttpMultiPart创建一个multiPart对象,我们最后要发送的就是这multiPart对象* multiPart中的内容,添加使用QHttpPart创建的对象* QHttpPart类创建的对象,因为这里发送的有数据,也有音乐文件,所以使用from-data
*/QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);QHttpPart useridPart;useridPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"userid\""));useridPart.setBody(userid.toUtf8());QHttpPart usernamePart;usernamePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"username\""));usernamePart.setBody(username.toUtf8());QHttpPart projectidPart;projectidPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"projectid\""));projectidPart.setBody("9");//这里将要发送的文件放入mp3Part中QHttpPart mp3Part;mp3Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(QString("form-data; name=\"file\";filename=\"测试.mp3\";")));mp3Part.setBodyDevice(file);//将所有想发送的内容放入multiPart中multiPart->append(useridPart);multiPart->append(usernamePart);multiPart->append(projectidPart);multiPart->append(mp3Part);//发送m_net_manager->post(netReq,multiPart);
}void PostSendData::SendImage()
{//与发送音乐文件类似,不过是改成图片文件QString filePath = "H:/Code/QT/PostTest/bin/测试.jpeg";QFile* file = new QFile(filePath);file->open(QIODevice::ReadOnly);QString userid = "123456";QString username = "Tom";QNetworkRequest netReq;netReq.setUrl(this->m_url);QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);QHttpPart useridPart;useridPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"userid\""));useridPart.setBody(userid.toUtf8());QHttpPart usernamePart;usernamePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"username\""));usernamePart.setBody(username.toUtf8());QHttpPart projectidPart;projectidPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"projectid\""));projectidPart.setBody("9");QHttpPart imagePart;imagePart.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(QString("form-data; name=\"file\";filename=\"测试.jpeg\";")));imagePart.setBodyDevice(file);multiPart->append(useridPart);multiPart->append(usernamePart);multiPart->append(projectidPart);multiPart->append(imagePart);m_net_manager->post(netReq,multiPart);
}void PostSendData::getJson(QJsonObject &jsonObj)
{switch (this->m_request_type){case SENDDATA:{
/** 返回Json数据示例,code:1-成功,2-失败,3-用户识别失败* {"code":"1","msg":sucess,"result":true}
*/qDebug() << "------------------发送数据的返回---------------------";QString code = jsonObj.value("code").toString();qDebug() << "code = " << code;QString msg = jsonObj.value("msg").toString();qDebug() << "msg = " << msg;bool result = jsonObj.value("result").toBool();break;}case SENDMUSIC:{
/*
* 返回Json数据示例,code:1-成功,2-失败,3-用户识别失败
* {"code":"1","msg":sucess,"datas":[{"id":1,"music_name":"测试.mp3","music_id":456},]}
*/qDebug() << "------------------发送音乐的返回---------------------";QString code = jsonObj.value("code").toString();qDebug() << "code = " << code;QString msg = jsonObj.value("msg").toString();qDebug() << "msg = " << msg;//返回的Json数据中,datas是一个Json数组包含了Json对象,先把JsonObject转换成JsonValue//JsonValue转换成JsonArray,再去循环读出JsonArray的内容QJsonValue locationValue = jsonObj.value(QStringLiteral("datas"));QJsonArray locationValueArray = locationValue.toArray();for (int i = 0; i < locationValueArray.size(); i++){QJsonValue locationArray = locationValueArray.at(i);QJsonObject location = locationArray.toObject();qDebug()<< "id = " << location["id"].toString();qDebug()<< "music_name = "<< location["music_name"].toString();qDebug()<< "music_id = " << location["music_id"].toString();}break;}case SENDIMAGE:{
/*
*与发送音乐的返回类似
* 返回Json数据示例,code:1-成功,2-失败,3-用户识别失败
* {"code":"1","msg":sucess,"datas":[{"id":1,"image_name":"测试.jepg","image_id":456},]}
*/qDebug() << "------------------发送图片的返回---------------------";QString code = jsonObj.value("code").toString();qDebug() << "code = " << code;QString msg = jsonObj.value("msg").toString();qDebug() << "msg = " << msg;QJsonValue locationValue = jsonObj.value(QStringLiteral("datas"));QJsonArray locationValueArray = locationValue.toArray();for (int i = 0; i < locationValueArray.size(); i++){QJsonValue locationArray = locationValueArray.at(i);QJsonObject location = locationArray.toObject();qDebug()<< "id = " << location["id"].toString();qDebug()<< "music_name = "<< location["image_name"].toString();qDebug()<< "music_id = " << location["image_id"].toString();}break;}}
}void PostSendData::finshedSlot(QNetworkReply *reply)
{QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);if(reply->error() == QNetworkReply::NoError){QByteArray bytes = reply->readAll();QJsonDocument jsonDoc = QJsonDocument::fromJson(bytes);QJsonObject jsonObj = jsonDoc.object();getJson(jsonObj);}reply->deleteLater();
}

3.在MainWindown中,我添加了三个按钮,用来发送不同的内容,MainWindown的头文件不在贴出,按钮使用界面直接转到槽clicked(),只贴出MainWindown.cpp供参考

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "postsenddata.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::on_pushButton_sendData_clicked()
{QNetworkAccessManager* m_netmanager_upwav = new QNetworkAccessManager(this);QUrl senddataUrl = QUrl("http://SendData");PostSendData* sendData= new PostSendData(m_netmanager_upwav,senddataUrl,0);//0对应PostSendData中枚举类型,用途是接受不同的返回,解析Json数据时能找到解析的case,下面的1和2类似sendData->SendJsonData();
}void MainWindow::on_pushButton_sendMusic_clicked()
{QNetworkAccessManager* m_netmanager_sendmusic = new QNetworkAccessManager(this);QUrl sendmusicUrl = QUrl("http://SendMusic");PostSendData* sendMusic= new PostSendData(m_netmanager_sendmusic,sendmusicUrl,1);sendMusic->SendMusic();
}void MainWindow::on_pushButton_sendImage_clicked()
{QNetworkAccessManager* m_netmanager_sendimage = new QNetworkAccessManager(this);QUrl sendimageUrl = QUrl("http://SendImage");PostSendData* sendImagec= new PostSendData(m_netmanager_sendimage,sendimageUrl,2);sendImagec->SendImage();
}

后记说明

参考了很多文档,基础使用文档很多,综合起来使用的还是比较少,要不就是需要收费,所以这算是一个在Qt中使用Post方式,向http发送Json数据,以及使用表单形式发送文件+数据的一个综合例程,仅供参考,如有问题请指出,一起探讨进步。关于Qt中对于Json以及网络接口的使用,参考Qt中的文档,还有许多使用方式,接口函数可以调用。

使用Qt通过Post发送Json格式数据相关推荐

  1. php 如何发送json数据格式,Php如何使用curl发送json格式数据实例

    Php 如何使用curl发送json格式数据实例 Php 如何使用curl发送json格式数据实例 这篇文章主要介绍了php使用curl发送json格式数据的实例,大家参考使用吧 代码如下: $url ...

  2. Ajax 发送json格式数据以及发送文件(FormData)和自带的序列化组件: serializers

    前后端传输数据的编码格式(contentType) get请求数据就是直接放在url?后面的 url?usernmae=junjie&password=123... 可以向后端发送post请求 ...

  3. HTTP get请求发送JSON格式数据

    get请求一般不建议发送JSON格式的数据,单总有一些奇葩系统要求 分享下本人对接途牛 传递get请求 json数据的方法 第一步:平常的get请求不要想了 直接继承 import org.apach ...

  4. postman 发送json 格式数据

    postman 发送json 格式数据 hearder 设置 body 设置 {"id": "61252255","primary_content&q ...

  5. 【spring-boot】spring-boot通过浏览器发送json格式数据,controler的处理

    1.我们使用Postman软件工具向spring-boot发送post形式的数据,如下: 2.再来看一下我们的实体类的代码: RespCode.java package com.springboot. ...

  6. Qt 构建和解析Json格式数据

    文章目录 1.构建json 1.1.构建对象类型json 1.2.构建数组类型json 2.解析json文件 1.构建json 1.1.构建对象类型json #include <QCoreApp ...

  7. php 接收curl json数据格式,curl发送 JSON格式POST数据的接收,以及在yii2框架中的实现原理【精细剖析】...

    1.通过curl发送json格式的数据,譬如代码: function http_post_json($url, $jsonStr) { $ch = curl_init(); curl_setopt($ ...

  8. 使用jQuery发送POST,Ajax请求返回JSON格式数据

    问题: 使用jQuery POST提交数据到PHP文件, PHP返回的json_encode后的数组数据,但jQuery接收到的数据不能解析为JSON对象,而是字符串{"code" ...

  9. JS使用XMLHttpRequest对象POST收发JSON格式数据

    JavaScirpt中的XMLHttpRequest对象提供了对 HTTP 协议的完全访问,使用该对象可以在不刷新页面的情况与服务器交互数据.XMLHttpRequest是实现AJAX技术的关键对象, ...

最新文章

  1. ubuntu18.04.4 pip3 换清华、阿里、豆瓣 源
  2. canal应用二:mysql数据实时同步到redis
  3. Kotlin入门简介
  4. QML的import目录爬坑记录
  5. Window2003 IIS+MySQL+PHP+Zend环境配置
  6. shell脚本验证ssh连通性_ssh远程管理服务
  7. 如何安装Exchange2010上安装更新汇总(Update Rollup)
  8. (原创)使用tensorflow及anaconda(spyder)时遇到的问题
  9. 18 网络编程-TCP/IP各层介绍(5层模型讲解)
  10. python isnumberic用法_NETASST技术博客
  11. 微波遥感原理(武汉大学出版社2003年6月30号 舒宁《微波遥感原理》)
  12. android 生成bks_Android 生成bks证书
  13. python中shelf对象_11.4. shelve — Python 对象持久化 — Python 2.7.18 文档
  14. VR餐厅全新思路,可以为餐饮行业带来哪些好处?
  15. 国网智能电表视在功率kVA、有功功率Kw、无功功率kVar的概念含义及区别
  16. 北京开始整治互联网加班了!附 955 不加班公司名单(2022版)
  17. 基于verilog实现的VGA
  18. 初出茅庐 你好C语言
  19. Android开发中几种布局方式介绍
  20. Spring Security + SpringBoot + Mybatis-plus实现前后端分离的权限管理系统

热门文章

  1. 干货分享:小程序项目实践和经验总结
  2. android查看摄像头信息,获取Android设备上的详细的摄像头信息
  3. php prepare错误,php环境错误,Loader.php报错
  4. Motion planning for self-driving cars课程笔记1:应用雷达数据生成占用栅格地图(Occupancy Grid Map)
  5. c#断点续传下载文件
  6. 关于中部城市人才外流问题的思考
  7. VGL与中国海洋石油签署液化天然气购销协议;徐工汉云打造国内首个智能化剥片机组 | 能动...
  8. 5种数值评分标准总结 - 为预测模型找到正确的度量标准
  9. JAVA基础学习博客007
  10. 货拉拉2021岗位招聘内推计划开始啦