如何使用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,如果好用的话,还请爸爸们给个赞。