Qt-系统网络HTTP客户端(66)

目录

描述

相关函数

使用

准备工作

处理响应

测试

代码

补充


描述

进⾏ Qt 开发时, 和服务器之间的通信很多时候也会⽤到 HTTP 协议

Qt 中提供了客户端,但是并没有提供相应的服务器的库,所以这里我们只讨论 客户端

• 通过 HTTP 从服务器获取数据.

• 通过 HTTP 向服务器提交数据.

相关函数

关键类主要是三个. QNetworkAccessManager , QNetworkRequest , QNetworkReply

QNetworkAccessManager 提供了 HTTP 的核心操作.

|-----------------------------------------------------|-----------------------------------------|
| get(const QNetworkRequest& ) | 发起⼀个 HTTP GET 请求. 返回 QNetworkReply 对象. |
| post(const QNetworkRequest& , const QByteArray& ) | 发起⼀个 HTTP POST 请求. 返回 QNetworkReply 对象. |

QNetworkRequest 表⽰⼀个 HTTP 请求(不含 body).

PS:如果需要发送⼀个带有 body 的请求(⽐如 post), 会在 QNetworkAccessManager 的 post ⽅法中通过单独的参数来传⼊ body

|-------------------------------------------------------------------------|----------------------|
| QNetworkRequest(const QUrl& ) | 通过 URL 构造⼀个 HTTP 请求. |
| setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value) | 设置请求头. |

不包含 body

补充:其中的 QNetworkRequest::KnownHeaders 是⼀个枚举类型,常⽤取值如下

|---------------------|---------------------------------|
| ContentTypeHeader | 描述 body 的类型. |
| ContentLengthHeader | 描述 body 的⻓度. |
| LocationHeader | ⽤于重定向报⽂中指定重定向地址. (响应中使⽤, 请求⽤不到) |

|-----------------|---------------|
| CookieHeader | 设置 cookie |
| UserAgentHeader | 设置 User-Agent |

QNetworkReply 表⽰⼀个 HTTP 响应. 这个类同时也是 QIODevice 的⼦类.

|----------------------------------------------|------------------|
| error() | 获取出错状态. |
| errorString() | 获取出错原因的⽂本. |
| readAll() | 读取响应 body. |
| header(QNetworkRequest::KnownHeaders header) | 读取响应指定 header 的值 |

补充: QNetworkReply 还有⼀个重要的信号 finished 会在客⼾端收到完整的响应数据之后触发.

使用

网络编程一定要加上 network

准备工作

初始界面,这一点和之前的一样

我们使用 QPlainTextEdit 来显示读取到的响应

处理响应

不会阻塞,得使用 QNetworkReply 里面信号,来触发响应机制

测试

代码

代码书写和其他平台的网络编写流程是差不多的

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QNetworkReply>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setWindowTitle("客户端");

    manager = new QNetworkAccessManager(this);
}

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


void Widget::on_pushButton_clicked()
{
    // 1.获取到输入框中的 url
    QUrl url(ui->lineEdit->text());
    // 2.构建一个 HTTP 请求对象
    QNetworkRequest request(url);
    // 3.发送请求
    QNetworkReply* response = manager->get(request);
    // 4.通过信号槽,来处理响应
    connect(response, &QNetworkReply::finished, this, [=](){
        if(response->error() == QNetworkReply::NoError){
            // 响应正确获得了
            QString html = response->readAll();
            ui->plainTextEdit->setPlainText(html);
        }else {
            // 响应出错了
            ui->plainTextEdit->setPlainText(response->errorString());
        }
        // 注意释放 response 进行释放
        response->deleteLater();
    });
}

补充

相关推荐
Maiko Star1 分钟前
Python核心语法——函数
开发语言·python
AlfredZhao25 分钟前
Linux 主机防火墙如何同时开启 80 和 443?
http·https·firewall
tachibana228 分钟前
hot100 回文链表(234)
java·网络·数据结构·leetcode·链表
大气的小蜜蜂1 小时前
基于Python+Django的健身房管理系统实现:核心亮点全流程解析
开发语言·python·django
天空'之城1 小时前
Linux 系统编程 04:进程基础
linux·开发语言·进程基础
从零开始的代码生活_1 小时前
NAT、代理服务与内网穿透详解
linux·服务器·网络·c++·http·智能路由器
云栖梦泽在1 小时前
Claude Code / Codex 使用卡顿怎么办?AI 编程 Agent 连接失败与网络排查思路
网络·人工智能·网络协议·chatgpt·性能优化
2zcode1 小时前
免费开源项目文档:基于MATLAB图像处理的药片检测与计数系统设计与实现
开发语言·图像处理·matlab
Jeremy_WW1 小时前
QSFP-DD MSA Hardware协议解读(二)
网络·模块测试·智能硬件
深盾科技_Virbox1 小时前
加密狗授权能力选型:从授权模型到全生命周期管理
java·网络·数据库