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

9 篇文章 0 订阅

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

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过Qt的网络模块QNetworkAccessManager和QNetworkRequest来向C服务器发送HTTP请求。 具体步骤如下: 1. 创建QNetworkAccessManager对象,用于发送请求接收响应。 2. 创建QNetworkRequest对象,设置请求的URL地址和其他相关信息(如请求头信息)。 3. 调用QNetworkAccessManager的get()、post()等函数发送请求,并将请求结果保存在QNetworkReply对象中。 4. 通过QNetworkReply对象获取响应数据,如状态码、HTTP头信息和响应正文等。 以下是一个示例代码: ``` #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建QNetworkAccessManager对象 QNetworkAccessManager manager; // 创建QNetworkRequest对象,设置请求URL和其他信息 QUrl url("http://localhost:80/api"); QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); // 发送GET请求 QNetworkReply *reply = manager.get(request); // 处理响应 QObject::connect(reply, &QNetworkReply::finished, [&]() { if (reply->error() == QNetworkReply::NoError) { qDebug() << "Status code:" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); qDebug() << "Response headers:" << reply->rawHeaderPairs(); qDebug() << "Response body:" << reply->readAll(); } else { qDebug() << "Error:" << reply->errorString(); } reply->deleteLater(); a.quit(); }); return a.exec(); } ``` 在上面的示例中,我们向URL为http://localhost:80/api的C服务器发送了一个GET请求,并将请求的Content-Type设置为application/json。在响应中,我们输出了状态码、HTTP头信息和响应正文。最后,我们通过reply->deleteLater()释放了QNetworkReply对象的内存,并通过a.quit()停止Qt事件循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值