当前位置: 首页 > article >正文

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 里面信号,来触发响应机制

 

测试

 

代码

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

#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();
    });
}

补充

 


http://www.kler.cn/news/358230.html

相关文章:

  • CAXA制造工程师2024软件下载
  • 一句话木马的多种变形方式
  • Java程序OutOfMemoryError分析与heap dump
  • SpringBoot高校学科竞赛平台:安全与维护指南
  • react函数组件和类组件
  • (五)若使用LQR控制小车倒立摆,该如何对小车和摆杆的动力学方程线性化?哪些变量是可以进行简化的,线性化后的状态空间方程应该怎么列写
  • CVE-2024-22120:Zabbix低权限SQL注入至RCE+权限绕过
  • Axure使用echarts详细教程
  • 优阅达携手 Theobald 亮相新加坡科技周,助力企业 SAP 数据集成与应用
  • 基于Python实现“科研通”自动签到
  • 点评项目-7-缓存击穿的两种解决方案、缓存工具类的编写
  • 计算机毕业设计选题推荐-动漫番剧推荐系统-Python项目实战
  • 看门狗(基于ESP-IDF)
  • JavaWeb 24.Vue3的简介和快速体验
  • QT实现校园导航
  • 每日OJ题_牛客_chika和蜜柑_TopK_C++_Java
  • 【Linux 从基础到进阶】AppArmor 安全模块应用指南
  • 【Next.js 项目实战系列】08-数据处理
  • Webpack一键打包多个环境
  • ajax嵌套ajax实现不刷新表单并向指定页面二次提交数据