使用QT发送http/https的post请求并接收服务器reply
如何使用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相关推荐
- c#向服务器发送消息,C#模拟httpwebrequest请求_向服务器模拟cookie发送
public classMyRequest {#region 辅助方法 static string HttpGet(stringurl) {var request =(HttpWebRequest)W ...
- 解决 QT 发送 HTTP 请求时遇到 qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed 问题
解决 QT 发送 HTTP 请求时遇到 qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initilization failed 问题 ...
- httpf发送 json_Java用HttpClient3发送http/https协议get/post请求,发送map,json,xml,txt数据...
使用的是httpclient 3.1, 使用"httpclient"4的写法相对简单点,百度:httpclient https post 当不需要使用任何证书访问https网页时, ...
- C++|Java混合实验-java搭建get方法靶场,Qt发送请求获取数据
目录 背景 演示 java web源码 Qt端源码 背景 因为最近想进一步学习http协议,想从QNetworkAccessManager中,但访问其他网站获取的数据,太过于复杂,不便于个人的实验,在 ...
- httpf发送 json_Java用HttpClient4发送http/https协议get/post请求,发送map,json,xml,txt数据...
刚写出来的,还未经测试, HttpUtil.java import java.io.IOException; import java.io.UnsupportedEncodingException; ...
- vert.x web client发送http https请求
vert.x web client是一个异步的http客户端,可以很容易的发送异步请求,什么是异步呢?简单举例,同步的http请求,如果服务器没有响应就要一直等着.....异步就是还可以干别的.web ...
- 如何在客户端发送ajax请求,ajax - 从服务器(nodejs)发送数据到客户端(ajax请求)
如何使用nodejs将数据从服务器发送到客户端? 所以基本上我通过点击一个按钮来调用这个函数 javascriptfunction createStuff(tid) { $.ajax({ type: ...
- python post请求 415_接收错误415:使用REST API发送GET请求时不支持媒体类型
我已经创建了一些python代码来与Exact在线通信,并希望通过使用python和urllib2来发送GET和POST请求.在 现在,当我尝试发送一个简单的GET请求时,它包含诸如"Acc ...
- 深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求(上)
2019独角兽企业重金招聘Python工程师标准>>> 深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求 一.引言 本篇博客主要讨论如何在客户端与服务端之间进行HTTPS ...
最新文章
- Java 关于File使用
- hdb interface驱动是什么_Linux USB 鼠标驱动程序详解
- rust里面的awm叫什么_铅笔里面有铅吗?为什么叫铅笔呢?
- 渗透小助手——几个密码收集工具
- IIS故障问题(Connections_Refused)分析及处理
- Kali Linux零基础入门到精通
- 魔兽世界模型浏览器WowModelExplorer演示
- 模拟器安装magisk
- 关于大麦网接口抢票构造的一些思路
- 微信公众号(服务号、订阅号、企业号)的区别
- SpringBoot整合WebSocket实现聊天室系统
- recyclerview简单使用
- 蒲公英音乐种子计划海选招募正式启动
- OCR--苹果ios安卓android身份证拍照扫描识别sdk
- 【Hackintosh】暗影精灵2pro完美EFI分享
- 制造业大量招程序员,是拧螺丝吗?
- JAVA使用JCO实现调用SAP接口方法
- 信息化项目验收确认测试的内容和流程有哪些?
- 凡人修仙传之百炼冥门java_修仙缘:细说我与《凡人修仙传》的过往
- 西门子plc支持什么时间服务器,怎样设置PLC时间