QT 给http服务器发送GET/POST请求并接收返回值

2023-05-16

目录

一、注意事项和重要代码

1、使用场景

2、发送请求的方式有两种

3、使用前提

4、get主要代码

5、post第一种主要代码

6、post第二种主要代码

二、详细代码

三、结果图


一、注意事项和重要代码

1、使用场景

qt,需要对服务器发送请求(包含报文),并接收服务器的返回值;服务器用的是mongoose模拟的服务器;

2、发送请求的方式有两种

GET和POST,两种方式的不同:Get将参数直接与网址整合为一个整体,而Post则将其拆为两个部分,一部分是网址,另一个部分才是参数,并且必须为其设置报文setHeader,否则服务器是无法找到参数的

本文主要介绍三种发送不同请求:

1)一种是GET方式请求,此时没有发送的报文,但是会有服务器返回值;

2)其余两种是POST请求,都有发送的报文,其中第一种发送的报文是一组json格式的数据(有返回信息);第二种是利用事件循环的方式发送一组json格式数据报文,因为在项目中都是有线程的,如果不利用事件循环进行阻塞,会导致请求无法发出。

三种具体方式见主要代码,最下方的详细代码实现的是get请求,如果想更改其他两种方式,更换startRequest函数即可,但是在使用post事件循环方式时,需要将.h中的startRequest定义更改为

    void startRequest(const QString &hostName,
                                 const QString &diskName,
                                 const QString &diskSize,
                                 const QString &mount,
                                 const QString &format,
                                 const QString &authStatus,
                                 const QString &keyfile);

在构造函数中调用时,改为

startRequest("2.3.4.5","dev/sda123","10G","/mnt","ext4","1","this is .key's content");

3、使用前提

一定要注意!!!!!,不然无法与服务器连接

在.pro文件中添加

QT += network

4、get主要代码

void MainWindow::startRequest(const QUrl &requestedUrl){
    url = requestedUrl;
    manager = new QNetworkAccessManager(this);
    req.setUrl(url);
    //由于请求发生重定向,所以要加上这行代码,设置自动跳转,否则会返回 302
    req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
    reply = manager->get(req);
    connect(reply,&QNetworkReply::finished,this,&MainWindow::replyFinished);

}

5、post第一种主要代码

void MainWindow::startRequest(const QUrl &requestedUrl){
    url = requestedUrl;
    //post
    QByteArray array;
    json.insert("table_operation","select");
    QJsonDocument document;
    document.setObject(json);
    array = document.toJson(QJsonDocument::Compact);
    qDebug()<<"array在转为json后为:"<<array;

    manager = new QNetworkAccessManager(this);
    req.setUrl(url);
    req.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
    req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
    reply = manager->post(req,array);
    connect(reply,&QNetworkReply::finished,this,&MainWindow::replyFinished);
}

6、post第二种主要代码

void MainWindow::sendRequest(const QString &hostName,
                             const QString &diskName,
                             const QString &diskSize,
                             const QString &mount,
                             const QString &format,
                             const QString &authStatus,
                             const QString &keyfile)
{
    //1.json格式传输报文
    QJsonObject json;
    QJsonDocument jsonDoc;

    //打包json数据
    json["host_name"] = hostName;
    json["disk_name"] = diskName;
    json["disk_size"] = diskSize;
    json["mount"] = mount;
    json["format"] = format;
    json["certification_status"] = authStatus;
    json["keyfile_path"] = keyfile;

    jsonDoc.setObject(json);
    QByteArray dataArray = jsonDoc.toJson(QJsonDocument::Compact);
    qDebug()<< "jsondata组为:"<<dataArray;

    //2.构造URL&&请求头
    QString urlStr = "http://127.0.0.1:8000/test";
    qDebug()<<"url地址为:"<<urlStr;
    url = urlStr;
    //构造请求头
    req.setUrl(url);
    req.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json;charset=UTF-8"));
//    req.setRawHeader("Connection", "Keep-Alive");

    //3.post数据
    manager = new QNetworkAccessManager(this);
    reply = manager->post(req,dataArray);
    QEventLoop eventLoop;
    connect(manager,SIGNAL(finished(QNetworkReply*)),&eventLoop,SLOT(quit()));
    connect(reply,&QNetworkReply::finished,this,&MainWindow::replyFinished);
    eventLoop.exec();
}

二、详细代码

QT创建一个继承QWidget的Qt Widgets Application就行

1、mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QtNetwork>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QTextCodec>
#include <QFile>
#include <QTextStream>
#include <QDateTime>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void startRequest(const QUrl &requestedUrl);

private:
    Ui::MainWindow *ui;

private:
    // [3] 添加对象
    QUrl url;
    QNetworkRequest req;
    QNetworkReply *reply;
    QNetworkAccessManager *manager;

private slots:
//    void startRequest(const QUrl &requestedUrl);
    void replyFinished();

};
#endif // MAINWINDOW_H

2、mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //调用函数发送请求,参数是请求的服务器地址
    startRequest( QUrl("http://127.0.0.1:8000/test"));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::startRequest(const QUrl &requestedUrl){
    url = requestedUrl;
    manager = new QNetworkAccessManager(this);
    req.setUrl(url);
    //由于请求发生重定向,所以一定要加上这行代码,设置自动跳转,否则会返回 302
    req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
//    req.setRawHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
//    req.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36");
    //get方式发送请求
    reply = manager->get(req);
    //将服务器的返回信号与replyFinished槽连接起来,当服务器返回消息时,会在槽里做相应操作
    connect(reply,&QNetworkReply::finished,this,&MainWindow::replyFinished);

}

void MainWindow::replyFinished(){

    // <1>判断有没有错误
    if (reply->error()){
        qDebug()<<reply->errorString();
        reply->deleteLater();
        return;
    }

    // <2>检测网页返回状态码,常见是200,404等,200为成功
    int statusCode  = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    qDebug() << "statusCode:" << statusCode;

    // <3>判断是否需要重定向
    if (statusCode >= 200 && statusCode <300){
        // ok

        // 准备读数据
        QTextCodec *codec = QTextCodec::codecForName("utf8");
        QString all = codec->toUnicode(reply->readAll());
        qDebug() << "接收到的数据" <<all;

        //显示在mainwindow 测试,将服务器返回值打印至label上,服务器用的是mongoose模拟
        QLabel *label = new QLabel(this);
        label->setText(all);
        label->move(200,200);
        label->setVisible(true);

        // 数据读取完成之后,清除reply
        reply->deleteLater();
        reply = nullptr;

    } else if (statusCode >=300 && statusCode <400){
        // redirect

        // 获取重定向信息
        const QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
        // 检测是否需要重定向,如果不需要则读数据
        if (!redirectionTarget.isNull()) {
            const QUrl redirectedUrl = url.resolved(redirectionTarget.toUrl());

            reply->deleteLater();
            reply = nullptr;

            startRequest(redirectedUrl);
            qDebug()<< "http redirect to " << redirectedUrl.toString();
            return;
        }
    }
}

3、main.cpp

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

这个项目的代码是get请求方式,如果要换成post,只需要将startRequest函数换成博客开头提到的【post主要代码】即可;

replyFinished函数是接收服务器返回的状态值和返回值的,可以自己做需要的操作。

三、结果图

1、服务器接收到的POST请求信息:

2、GET请求没有发送报文,但是能收到mongoose模拟服务器的返回值:

四、参考

Qt实现HTTP的Get/Post请求_china_jeffery的博客-CSDN博客_qt http

QT中使用QEventLoop来实现事件循环_「已注销」的博客-CSDN博客_qeventloop

https://www.cnblogs.com/cjdty/p/10659685.html

##END

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 给http服务器发送GET/POST请求并接收返回值 的相关文章

  • 服务器响应中的“连接:保持活动状态”

    我正在尝试建立从 Silverlight 应用程序到 Apache 服务器托管的 PHP 页面的 HTTP 持久连接 即无需为每个 HTTP 请求创建新的 TCP 连接 为此 我需要网络服务器发送其 HTTP 响应 并将 Connectio
  • 使用 flash 或 java servlet 将麦克风数据从浏览器上传到服务器的教程? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 There was a question on how to get data from a microphone on a client
  • Angular 2 - Http - 正确忽略空结果

    我有很多处理请求并简单返回 200 的 REST 端点 我注意到将结果映射为错误json 如果我尝试不进行任何类型的映射 我会看到浏览器警告它无法解析 XML 由于不返回任何内容是很常见的 我很好奇我应该如何处理响应 这是一个基本的代码示例
  • 使用python将json和文件发送到flask

    我遇到这个问题 我试图在单个函数中向 Flask API 发送 接收一些文件和 JSON 在我的客户端 发件人 上我有 my json to be sent datas var1 var1 var2 var2 my file to be s
  • 自定义 HTTP 标头:命名约定

    我们的一些用户要求我们将与其帐户相关的数据包含在HTTP 标头我们向他们发送的请求 甚至是他们从我们的 API 获得的响应 添加自定义 HTTP 标头的一般约定是什么 naming format etc 另外 请随意发布您在网络上偶然发现的
  • Spark Java框架中如何使用get获取请求参数?

    我是 Sparkjava 的新手 我想使用 Spark java 读取我的请求参数 但我无法找到正确的语法 请帮帮我 下面是我的路由方法和客户端对其的调用 我的客户请求网址 smartapp getDataViewModelConfig c
  • 尝试使用 php 发送 POST 请求,无论我做什么,我都会收到“HTTP ERROR 500”

    为了发出 HTTP 请求 有人建议我尝试使用 PHP 并给了我一段代码 url https example com dashboard api data array to gt PHONE NUMBER from gt SENDER ID
  • 在 PHP 中从 URL 斜杠后获取两个单词

    我需要从 URL 中获取两个单词 例如我有以下 URL http mydomain com alrajhi invoice 108678645541 http mydomain com alrajhi invoice 10867864554
  • ASP.NET HTTP 请求是否会转换为 1 个线程?

    可以安全地假设当用户通过 HTTP 请求 aspx 页面时 ASP NET 至少为其创建 1 个线程吗 如果是这样 持续多久 如果 1000 人向同一个 aspx 页面发出 HTTP 请求 是否会涉及一些线程回收 因此不会产生不同的 100
  • 如何在 WordPress 中获取帖子中的类别标题?

    假设我在 WordPress 中有一篇名为 Hello World 的帖子 并且我直接查看此页面 我将如何找到 Hello World 类别并显示它 Use get the category http codex wordpress org
  • 如何将所有GET请求查询参数放入Go中的结构体中?

    你好 我想将 get 查询参数转换为 Go 中的结构 例如我有这样的结构 type Filter struct Offset int64 json offset Limit int64 json limit SortBy string js
  • 如何设置响应文件名而不强制“另存为”对话框

    我在某些响应中返回一个流 设置适当的content type标头 我正在寻找的行为是这样的 如果浏览器能够呈现给定内容类型的内容 那么它应该将其显示在浏览器窗口中 如果浏览器不知道如何呈现内容 那么它应该显示 另存为 对话框 其中文件名应该
  • 在express js中禁用http方法

    我正在我的 Express 应用程序上进行 nessus 测试 这是我得到的 基于每种方法的测试 HTTP 方法 ACL CHECKOUT COPY DELETE GET HEAD LOCK MERGE MKACTIVITY MKCOL 移
  • 使用 JSON 的 Pentaho HTTP Post

    我是 Pentaho 的新手 我正在尝试执行以下工作流程 从数据库中读取一堆行 做一些转换 将它们以 JSON 格式发布到 REST Web 服务 我已经使用输入步骤和 Json 输出步骤解决了前两个问题 但是 我在执行最后一步时遇到两个问
  • 以 REST 方式更新整个资源集合

    我有一个资源列表的 REST URI 例如 http foo com group users 这些用户中的每一个都有一个序列号 我想公开一种方法来为集合中的所有用户重新编号这些值 并使访问该列表的每个人都可以使用此更改 由于这是对整个集合的
  • cookie 在会话结束时或在特定时间过期?

    cookie 是否可以在会话结束时或在特定时间过期 是的 这很简单 HttpCookie newCookie new HttpCookie myCookie newCookie Expires DateTime Today AddDays
  • 如何 POST 从 PHP 创建的 HTML 表数据

    while row mysql fetch array res echo tr echo td td tr
  • ASP.NET - 将所有 https 请求重写为 http

    我的问题正是所提出的问题here https stackoverflow com questions 16276860 iis 7 adding ssl to one site all other sites responds to htt
  • 使用 C++ REST SDK 的 Http_client post 请求(卡萨布兰卡)

    我正在尝试使用 C REST SDK Casablanca 库执行 POST HTTP 请求 但我没有成功 我也找不到任何最近 工作片段 有谁能够帮助我 通过以下代码 我获得了运行时网络 json json exception说 不是字符串
  • 防止表单重新提交

    第一页包含一个 HTML 表单 第二页 处理提交的数据的代码 第一页中的表格已提交 浏览器被重定向到第二页 第二页处理提交的数据 此时 如果刷新第二页 则会弹出 确认表单重新提交 警报 这可以预防吗 人们过去常采取两种方法 方法一 使用 A

随机推荐

  • Ubuntu进入文件夹路径及查看文件夹目录

    在Ubuntu中 xff0c 我们进入了一个文件夹 xff0c 如何看这个文件夹此时的路径呢 xff1f 通过Ctrl 43 L 可以看到路径 xff0c 然后Ctrl 43 C复制路径 再通过命令行中cd 路径 进入刚刚的文件夹 如何查看
  • WebService实例

    一 发布webservice服务 1 编写服务接口 package com nari test webservice import javax jws WebMethod import javax jws WebParam import j
  • C#使用selenium写爬虫提高速度的关键

    这段时间一直在搞爬虫 xff0c 学了一段时间之后 xff0c 最后还是使用的selenium模拟浏览器来进行爬取 就来记录一下自己踩的坑 一开始在网上找提升selenium爬虫速度的方法 xff0c 都是说什么多线程 xff0c 关闭图片
  • coreldraw2022直装版下载 永久免费使用 附安装教程( 仅限 win 10 用户 )

    CorelDRAW2022又被大家伙简称为cdr2022 xff0c 这是由加拿大Corel公司制作推出的一款老牌图形平面设计软件 xff0c 当然虽然该软件是好早之前就有了 xff0c 但是本次小编要介绍的是该系列最新的2022版本 在该
  • win10/11下WSL 图形界面安装配置指南

    win10 11下WSL 图形界面安装配置指南 一 首先安装WSL xff08 这里安装的是Ubuntu 20 04 LTS xff09 二 MobaXterm安装 xff1a 神器MobaXterm xff0c 能同时支持XShell和X
  • WSL安装迁移以及可能会遇到的问题

    可能需要的命令 xff1a 查看ubuntu版本 xff1a lsb release a 修改文件参数 xff1a G WSL grant 34 rx OI CI F 34 查看一下wsl的版本 xff0c PowerShell 命令行并输
  • namespace “std“没有成员“function“

    添加头文件 include lt functional gt 确保C 43 43 版本为C 43 43 11或更高
  • Verilog 有限状态机

    状态机基本概念 状态机 xff0c 全称是有限状态机 xff08 Finite State Machine xff0c 缩写为FSM xff09 xff0c 是一种在有限个状态之间按一定规律转换的时序电路 xff0c 可以认为是组合逻辑和时
  • 深度学习之神经网络(二)

    文章目录 深度学习之神经网络 xff08 二 xff09 一 神经网络起源 xff1a 线性回归 xff08 一 xff09 概念 xff08 二 xff09 一个线性回归问题 xff08 三 xff09 优化方法 xff1a 梯度下降 二
  • 怎样将github上的代码下载到本地并运行?

    一 直接下载 点击右下角的Download Zip xff0c 可以直接下载项目的压缩包到你的电脑上 xff08 比如我先在github上搜索了一个vue 的项目 xff09 二 通过git clone下载 PS 使用git clone下载
  • kali搭建php环境

    service apache2 start service mysql start 然后再 var wwwxi下面直接写就好了 做个小demo吧 lt php servername 61 34 localhost 34 username 6
  • linux忽略依赖强制安装软件

    1 强制安装 deb文件 dpkg i force overwrite xxx deb 强制安装软件 dpkg i force all xxx deb 不顾一切的强制安装软件 2 强制安装 rpm文件 span class token fu
  • 深入理解equals和hashCode关系和区别

    深入理解equals和hashCode关系和区别 直入主题 xff1a 区别 xff1a 1 他们判断对象相同的方式不一样 xff1a 2 他们判断对象是否相等的准确率不一样 xff1a 改写equals时总是要改写hashcode分享一波
  • 休眠失败排查

    1 休眠唤醒测试时休眠失败 大体情况 xff1a 内核 xff1a Linux 4 19 硬件 xff1a 32bit ARM SOC 问题 xff1a 某板子在休眠唤醒流程验证的过程中 xff0c 休眠失败 xff1b 复现 xff1a
  • Microsoft 365账号激活步骤及office账号能用几台电脑?

    Microsoft 365账号能用几台电脑 xff1f 个人版账号可同时登入5台设备 xff0c 家庭版账号每人可同时登入5台设备 Microsoft 365账号激活步骤 xff0c 可通过点击激活按钮 xff0c 登陆账号后输入产品密钥来
  • source的作用详细讲解

    source etc profile 文件的作用 linux下使用source etc profile保存配置后 xff0c 新的环境变量只能在一个终端里面有效 问题描述 xff1a 在 etc profile中添加环境变量后 xff0c
  • C++ 编译错误 error: ‘cout‘ was not declared in this scope (摄氏度与华氏度的转换)

    练习c 43 43 的输入输出时 xff0c 编译遇到错误 xff1a error 39 cout 39 was not declared in this scope error 39 cin 39 was not declared in
  • apt安装 出现问题 E:无法定位软件包 yum

    目录 1 问题现象 2 解决方法及步骤 1 问题现象 利用 apt install yum 命令安装yum时出现 无法定位软件包yum 错误 2 解决方法及步骤 1 xff09 更新软件列表 apt get update 2 xff09 然
  • 解决脚本实现:sed -i 替换变量,变量中含有特殊转义字符的问题

    目录 1 问题描述 2 错误原因及解决办法一 xff1a 简单的查找替换 3 解决办法二 xff1a 利用脚本和中间变量进行替换 1 问题描述 写脚本时遇到的一个问题 xff0c 在此分享一下 首先我利用awk命令取出某文件中的一个字段 x
  • QT 给http服务器发送GET/POST请求并接收返回值

    目录 一 注意事项和重要代码 1 使用场景 2 发送请求的方式有两种 3 使用前提 4 get主要代码 5 post第一种主要代码 6 post第二种主要代码 二 详细代码 三 结果图 一 注意事项和重要代码 1 使用场景 qt xff0c