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