• qt使用http get和post


    qt使用http get和post

    准备

    使用到网络编程,需要在Pro文件中加入如下语句

    QT       += network
    
    • 1

    get请求

    widge.h
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include 
    #include 
    #include 
    #include 
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
        void get(QString str);
        void getBack(QNetworkReply* reply);
    
    private slots:
        void on_pushButton_2_clicked();
    
    private:
        Ui::Widget *ui;
        QNetworkAccessManager * manager;
    };
    #endif // WIDGET_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    widget.cpp
    #include "widget.h"
    #include "ui_widget.h"
    #include 
    #include 
    #include 
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::on_pushButton_2_clicked()
    {
        QString str = ui->lineEdit_2->text();
    
        manager = new QNetworkAccessManager(this);
        connect(manager,&QNetworkAccessManager::finished,this,&Widget::getBack);//通信完成后,自动执行getBack
        get(str);
    }
    
    
    void Widget::get(QString str)
    {
        // 构造请求
        QNetworkRequest request;
        request.setUrl(QUrl(str));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
        // 发送请求
        manager->get(request);
    
    }
    
    
    void Widget::getBack(QNetworkReply* reply)
    {
        ui->textEdit_2->setText(reply->readAll().data());
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    post请求

    widge.h
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include 
    #include 
    #include 
    #include 
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
        void post(QString str);
        void postBack(QNetworkReply* reply);
    
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::Widget *ui;
        QNetworkAccessManager * manager;
    };
    #endif // WIDGET_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    widget.cpp
    #include "widget.h"
    #include "ui_widget.h"
    #include 
    #include 
    #include 
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    
    void Widget::on_pushButton_clicked()
    {
        QString str = ui->lineEdit->text();
    
        manager = new QNetworkAccessManager(this);
        connect(manager,&QNetworkAccessManager::finished,this,&Widget::postBack);//通信完成后,自动执行getBack
        post(str);
    
    }
    
    //具体实现代码参考下面的分类情况
    void Widget::post(QString str)
    {
        QByteArray dataArray;
        ...
        request.setUrl(QUrl(str));
        // 发送请求
        manager->post(request, dataArray);
    
    }
    
    
    void Widget::postBack(QNetworkReply* reply)
    {
        ui->textEdit->setText(reply->readAll().data());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    post请求的数据格式

    参数写在url后面

    跟get一样,dataArray为空即可

    http://127.0.0.1:18080/define/login?userId=1&password=123

    void Widget::post(QString str)
    {
        // 表单数据
        QByteArray dataArray;
        // 构造请求
        request.setUrl(QUrl(str));
        //可以不写,都能识别,默认为x-www-form-urlencoded
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
        // 发送请求
        manager->post(request, dataArray);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    content-type missing in HTTP POST, defaulting to application/x-www-form-urlencoded. Use QNetworkRequest::setHeader() to fix this problem.
    
    • 1

    对应的后端接口

    public ResponseEntity login(Integer userId, String password)
    
    public ResponseEntity login(@RequestParam Map params)
    
    • 1
    • 2
    • 3
    使用application/x-www-form-urlencoded

    form表单数据被编码为key1=value1&key2=value2格式发送到服务器

    http://127.0.0.1:18080/define/login

    使用QByteArray

    void Widget::post(QString str)
    {
        // 表单数据
        QByteArray dataArray;
        dataArray.append("userId=1&");
        dataArray.append("password=123");
        // 构造请求
        request.setUrl(QUrl(str));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
        // 发送请求
        manager->post(request, dataArray);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    或使用QString转utf8

    void Widget::post(QString str)
    {
        // 表单数据
        QString ss = "userId=1&password=123";
        // 构造请求
        request.setUrl(QUrl(str));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
        // 发送请求
        manager->post(request, ss.toUtf8());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    postman访问接口

    对应的后端接口

    public ResponseEntity login(Integer userId, String password)
    
    public ResponseEntity login(@RequestParam Map params)
    
    • 1
    • 2
    • 3
    使用application/json

    内容数据为Json对象

    http://127.0.0.1:18080/define/login

    void Widget::post(QString str)
    {
        // Json数据
        QJsonObject json;
        json.insert("userId", "1");
        json.insert("password", "123");
    
        QJsonDocument document;
        document.setObject(json);
        QByteArray dataArray = document.toJson(QJsonDocument::Compact);
    
        request.setUrl(QUrl(str));
    
        request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json;charset=utf-8"));
    
        // 发送请求
        manager->post(request, dataArray);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    postman访问接口

    对应的后端接口

    public ResponseEntity login(@RequestBody User user)
    
    public ResponseEntity login(@RequestBody Map params)
    
    • 1
    • 2
    • 3
    使用multipart/form-data传送文件

    http://127.0.0.1:18080/define/upload

    #include 
    #include 
    #include 
    #include 
    
    void Widget::post(QString str)
    {
        QString filePath = "/Users/xx/qthttp.jpg";
        QFile* file = new QFile(filePath);
        file->open(QIODevice::ReadOnly);
    
        QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    
        QHttpPart imagePart;
        imagePart.setHeader(QNetworkRequest::ContentDispositionHeader,
                          QVariant(QString("form-data; name=\"file\";filename=\"qthttp.jpg\";")));
        imagePart.setBodyDevice(file);
        multiPart->append(imagePart);
    
        // 构造请求
        QNetworkRequest request;
        request.setUrl(QUrl(str));
    
        // 发送请求
        manager->post(request, multiPart);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    对应的后端接口

    public ResponseEntity upload(@RequestParam("file") MultipartFile multipartFile)
    
    • 1
  • 相关阅读:
    笔记本电脑没有声音如何解决
    用AIGC做私活真的太赚了...
    数据仓库实验二:关联规则挖掘实验
    MySQL主从复制(基于binlog日志方式)
    和琪宝的深圳,香港之旅~
    【uniapp】将微信小程序代码转换为 uniapp 小程序
    devops-5:从0开始构建一条完成的CI CD流水线
    RockyLinux9.0系统在VMware虚拟机上【保姆级】安装步骤,并修改网络配置,使用固定IP进行SSH连接【47张过程图】
    【KAWAKO】从mac上定时将腾讯云的数据备份到本地
    关于Altera JTAG Sever服务的问题
  • 原文地址:https://blog.csdn.net/qq_23858785/article/details/128171269