700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 使用QT发送http/https的post请求并接收服务器reply

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

时间:2020-07-26 15:29:36

相关推荐

使用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_OBJECTpublic:/*构造函数,参数为服务器的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对应的库文件供你的应用程序使用,具体操作看[这个文章]。(/BlogPuppet/p/12790092.html)

有问题的地方可以留言问我,也可以加QQ1061721998,如果好用的话,还请爸爸们给个赞。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。