如何使用QT内建API实现post请求,记录一下

1、在工程的.pro文件中加入模块

QT += network
2、新建一个类,头文件代码如下:

#ifndef HTTP_POST_H
#define HTTP_POST_H
#include <QObject>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
class ALPostFile : public QObject
{Q_OBJECT
public:/*构造函数,参数为服务器的URL地址*/ALPostFile(QString addr);~ALPostFile();/*类实例化之后,可以调用这个函数重新设置服务器URL地址*/void setServerAddr(QString addr){m_strServerAddr = addr;}/*设置要发送的文件路径并调用start函数开始post*/void setPostFilePath(QString filePath){m_strFilePath = filePath;start();}/*开始发送post请求给服务器*/void start();signals:
//从服务器返回的数据,retCode=200 表示成功void sigReplyMessage(int retCode,QString msg);
private slots:/*服务器的回复信息将在这个回调函数中处理(用QT的话说是槽函数)*/void replyFinished(QNetworkReply *reply);/*post请求发生错误的话会进入这个回调函数*/void upLoadError(QNetworkReply::NetworkError errorcode);/*这个函数记录post发送进度*/void OnUploadProgress( qint64 bytesSent, qint64 bytesTotal );
private:QString m_strServerAddr;QString m_strFilePath;QNetworkAccessManager * m_pNetWorkManager = NULL;QNetworkReply * m_pReply=NULL;};
#endif // HTTP_POST_H

3、对应的源文件代码如下:

#include "http_post.h"
#include <QUrlQuery>
#include <QFile>
#include <QDebug>
#include <QMessageBox>
#include <QDialog>
#include <QNetworkConfigurationManager>
#include <json/cJSON.h>
using namespace std;
ALPostFile::ALPostFile(QString addr){m_pNetWorkManager = new QNetworkAccessManager();m_strServerAddr = addr;connect(m_pNetWorkManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply *)));
}
ALPostFile::~ALPostFile(){delete m_pNetWorkManager;
}
void ALPostFile::start(){//如果未设置url和文件路径直接返回if(m_strFilePath.isEmpty() || m_strServerAddr.isEmpty()){return;}QFile file(m_strFilePath);if (!file.open(QIODevice::ReadOnly)||file.size()==0){qDebug() << "file open failed" <<endl;file.close();return ;}/*读取文件内容*/QByteArray fdata = file.readAll();qDebug()<<"file contant = "<<QString::fromStdString(fdata.toStdString())<<endl;/*如果文件内容为空,直接返回*/if(fdata.isEmpty()){qDebug() << "file is empty" <<endl;return;}file.close();QNetworkRequest request;/*设置服务器地址*/request.setUrl(m_strServerAddr);/*设置通用信息头*/request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");//request.setHeader(QNetworkRequest::ContentLengthHeader, data.size());/*发送post请求*/m_pReply=m_pNetWorkManager->post(request,fdata);/*设置回调函数*/connect(m_pReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(upLoadError(QNetworkReply::NetworkError)));connect(m_pReply, SIGNAL(uploadProgress ( qint64 ,qint64 )), this, SLOT( OnUploadProgress(qint64 ,qint64 )));
}
void ALPostFile::replyFinished(QNetworkReply *reply){QByteArray ba = reply->readAll();QString infor=QString::fromStdString(ba.toStdString());qDebug()<<"information from server= "<<infor<<endl;const char* server_json_buf=ba.toStdString().data();cJSON* server_json=cJSON_Parse(server_json_buf);if(server_json!=NULL){cJSON* status_json=cJSON_GetObjectItem(server_json,"status");if(status_json->valueint==200){QMessageBox::information(main_window,(QString)"上传结果",(QString)"上传成功");}else{QMessageBox::information(main_window,(QString)"上传结果",(QString)"上传失败");}cJSON_Delete(server_json);}
}
void ALPostFile::upLoadError(QNetworkReply::NetworkError errorcode){}
void ALPostFile::OnUploadProgress( qint64 bytesSent, qint64 bytesTotal ){//qDebug() <<"OnUploadProgress func" <<bytesSent<< "/"<<bytesTotal<<endl;}

使用方法很简单,类实例化之后,先后调用setServerAddr、setPostFilePath两个方法设置URL和要上传的文件路径(相对路径绝对路径都可以),由于在setPostFilePath方法中已经调用了start方法,因此没有必要再调用start方法。
经过测试,可以成功上传一个内容为json格式的文件,但是只可以用http上传,https的话会报错,因为我的电脑没有SSL安全证书的库文件,如果一定要使用https的话,需要下载SSL对应的库文件供你的应用程序使用,具体操作看[这个文章]。(https://www.cnblogs.com/BlogPuppet/p/12790092.html)
有问题的地方可以留言问我,也可以加QQ1061721998,如果好用的话,还请爸爸们给个赞。

使用QT发送http/https的post请求并接收服务器reply相关推荐

  1. c#向服务器发送消息,C#模拟httpwebrequest请求_向服务器模拟cookie发送

    public classMyRequest {#region 辅助方法 static string HttpGet(stringurl) {var request =(HttpWebRequest)W ...

  2. 解决 QT 发送 HTTP 请求时遇到 qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed 问题

    解决 QT 发送 HTTP 请求时遇到 qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initilization failed 问题 ...

  3. httpf发送 json_Java用HttpClient3发送http/https协议get/post请求,发送map,json,xml,txt数据...

    使用的是httpclient 3.1, 使用"httpclient"4的写法相对简单点,百度:httpclient https post 当不需要使用任何证书访问https网页时, ...

  4. C++|Java混合实验-java搭建get方法靶场,Qt发送请求获取数据

    目录 背景 演示 java web源码 Qt端源码 背景 因为最近想进一步学习http协议,想从QNetworkAccessManager中,但访问其他网站获取的数据,太过于复杂,不便于个人的实验,在 ...

  5. httpf发送 json_Java用HttpClient4发送http/https协议get/post请求,发送map,json,xml,txt数据...

    刚写出来的,还未经测试, HttpUtil.java import java.io.IOException; import java.io.UnsupportedEncodingException; ...

  6. vert.x web client发送http https请求

    vert.x web client是一个异步的http客户端,可以很容易的发送异步请求,什么是异步呢?简单举例,同步的http请求,如果服务器没有响应就要一直等着.....异步就是还可以干别的.web ...

  7. 如何在客户端发送ajax请求,ajax - 从服务器(nodejs)发送数据到客户端(ajax请求)

    如何使用nodejs将数据从服务器发送到客户端? 所以基本上我通过点击一个按钮来调用这个函数 javascriptfunction createStuff(tid) { $.ajax({ type: ...

  8. python post请求 415_接收错误415:使用REST API发送GET请求时不支持媒体类型

    我已经创建了一些python代码来与Exact在线通信,并希望通过使用python和urllib2来发送GET和POST请求.在 现在,当我尝试发送一个简单的GET请求时,它包含诸如"Acc ...

  9. 深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求(上)

    2019独角兽企业重金招聘Python工程师标准>>> 深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求 一.引言 本篇博客主要讨论如何在客户端与服务端之间进行HTTPS ...

最新文章

  1. Java 关于File使用
  2. hdb interface驱动是什么_Linux USB 鼠标驱动程序详解
  3. rust里面的awm叫什么_铅笔里面有铅吗?为什么叫铅笔呢?
  4. 渗透小助手——几个密码收集工具
  5. IIS故障问题(Connections_Refused)分析及处理
  6. Kali Linux零基础入门到精通
  7. 魔兽世界模型浏览器WowModelExplorer演示
  8. 模拟器安装magisk
  9. 关于大麦网接口抢票构造的一些思路
  10. 微信公众号(服务号、订阅号、企业号)的区别
  11. SpringBoot整合WebSocket实现聊天室系统
  12. recyclerview简单使用
  13. 蒲公英音乐种子计划海选招募正式启动
  14. OCR--苹果ios安卓android身份证拍照扫描识别sdk
  15. 【Hackintosh】暗影精灵2pro完美EFI分享
  16. 制造业大量招程序员,是拧螺丝吗?
  17. JAVA使用JCO实现调用SAP接口方法
  18. 信息化项目验收确认测试的内容和流程有哪些?
  19. 凡人修仙传之百炼冥门java_修仙缘:细说我与《凡人修仙传》的过往
  20. 西门子plc支持什么时间服务器,怎样设置PLC时间

热门文章

  1. 基于php鲜花花卉销售商城网站(源码+系统+mysql数据库+Lw文档)
  2. 西工大机考《房地产法》大作业网考
  3. cod单页系统 wordpress 来搭建 外贸 单面系统
  4. 多态 在游戏程序实例
  5. 输入框只允许输入数字字母下划线
  6. python关掉警告信息(warning)
  7. 计算机操作系统学习之FCFS、SJF和HRRN调度算法
  8. lower_bound和upper_bound的实现
  9. 在php中 var什么意思,php关键字”var”的作用是什么?
  10. PADS新建多门元器件