【QT】HTTP

目录

核心API

使用示例:http请求客户端 

第一步:初始化一个QNetworkAccessManager对象实例

第二步: 获取输入框中的url

第三步:构造一个http请求 

第四步:发送请求

第五步: 处理响应

效果如下:

多媒体

播放音频

核心API 

 使用示例:点击按钮播放音频

可能遇到的问题:


         HTTP协议本质上也就是基于TCP协议实现的, 实现一个HTTP客户端/服务器,本质上也就是基于TCP socket进行封装。Qt只是提供了HTTP客户端,而没有提供HTTP服务器的库。

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

  • 通过HTTP从服务器获取数据
  • 通过HTTP向服务器提交数据

核心API

关键类主要是三个:QNetworkAccessManager、QNetworkRequest、QNetworkReply

QNetworkAccessManager提供了HTTP 的核心操作

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

QNetworkRequest表示一个HTTP请求(不含body)

/* 如果需要发送一个带有body的请求(比如post),会在QNetworkAccessManager的post方法中通过单独的参数来传入body */

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

QVariant表示一个“类型可变”的值,类似于C语言中的void*

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

取值说明
ContentTypeHeader
描述 body 的类型.
ContentLengthHeader
描述 body 的⻓度.
LocationHeader
⽤于重定向报⽂中指定重定向地址. (响应中使⽤, 请求
⽤不到)
CookieHeader
设置 cookie
UserAgentHeader
设置 User-Ag
设置 User-Agent
QNetworkReply 表示⼀个 HTTP 响应. 这个类同时也是 QIODevice 的子类
方法说明
error()
获取出错状态
errorString()
获取出错原因的⽂本
readAll()
读取响应 body
header(QNetworkRequest::KnownHeaders
header)
读取响应指定 header 的值
此外, QNetworkReply 还有⼀个重要的信号 finished 会在客⼾端收到完整的响应数据之后触
发.

使用示例:http请求客户端 

第一步:初始化一个QNetworkAccessManager对象实例

manager =  new  QNetworkAccessManager(this);

第二步: 获取输入框中的url

QUrl url(ui->lineEdit->text());

第三步:构造一个http请求 

QNetworkRequest request(url);

第四步:发送请求

 QNetworkReply* response = manager->get(request);

第五步: 处理响应

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

    });

效果如下:

多媒体

播放音频

        在 Qt 中,⾳频主要是通过 QSound 类来实现。但是需要注意的是 QSound 类只⽀持播放 wav 格式的⾳频⽂件。也就是说如果想要添加⾳频效果,那么⾸先需要将 ⾮wav格式 的⾳频⽂件转换为 wav格 式。

        在使用QSound前,需要先引入multimedia模块。

QT += core gui multimedia

核心API 

play()

开始或继续播放当前源

setLoops(int)

设置循环次数
stop()停止播放

 使用示例:点击按钮播放音频

首先我们先将准备好的.wav音频文件导入qrc中

可能遇到的问题:

点击了按钮,音频并未播放,如下是出问题的代码

void Widget::on_pushButton_clicked()
{
    QSound* sound = new QSound(":/Whales.wav");
    sound->play();

    delete sound;
}

 这里的问题在于音频还没来得及播放,我们就已经释放了sound实例。因此我们需要改进一下写法,将sound挂到对象树上。如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSound>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    QSound* sound;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

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

    sound = new QSound(":/Whales.wav",this);
}

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


void Widget::on_pushButton_clicked()
{
    sound->play();

}

qt同样还可以播放视频,这里便不介绍了。

  • 35
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt提供了Qt Network模块,可以用于创建HTTP服务端。下面是一个简单的示例代码: ```cpp #include <QtNetwork> #include <QtCore> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); // 创建QTcpServer对象 QTcpServer server; // 监听本地主机上的8080端口 server.listen(QHostAddress::LocalHost, 8080); // 当有新的连接请求时触发newConnection信号,并进行处理 QObject::connect(&server, &QTcpServer::newConnection, [&server]() { // 获取与客户端的连接 QTcpSocket *socket = server.nextPendingConnection(); // 当有数据可读时触发readyRead信号,并进行处理 QObject::connect(socket, &QTcpSocket::readyRead, [socket]() { // 读取客户端发送的数据 QByteArray requestData = socket->readAll(); // 构造HTTP响应数据 QByteArray responseData = "HTTP/1.1 200 OK\r\n" "Content-Type: text/html\r\n" "Content-Length: 19\r\n" "\r\n" "<h1>Hello, Qt!</h1>"; // 发送HTTP响应数据给客户端 socket->write(responseData); // 关闭连接 socket->close(); }); }); return app.exec(); } ``` 这段代码创建了一个TCP服务器对象`server`,并在本地地址的8080端口上监听连接请求。当有新的连接请求时,会触发`newConnection`信号,然后通过`nextPendingConnection`函数获取与客户端的连接对象`socket`。之后,当有数据可读时,会触发`readyRead`信号,通过`readAll`函数读取客户端发送的数据。在这个示例中,我们构造一个简单的HTML页面作为HTTP响应数据,并通过`write`函数发送给客户端。最后,我们使用`close`函数关闭与客户端的连接。整个程序使用`app.exec()`函数进入事件循环,以便保持服务端一直运行。 这只是一个简单的示例,实际使用中可能需要更多的处理逻辑,比如解析HTTP请求头、处理POST请求、错误处理等。 ### 回答2: Qt是一个跨平台的C++应用程序框架,其中包含了丰富的功能模块。在Qt中,可以使用Qt网络模块来实现HTTP服务端功能。 使用Qt网络模块可以轻松地创建一个HTTP服务器。首先,需要创建一个QTcpServer对象,用于监听客户端的连接。然后,将QTcpServer的新连接信号与槽函数连接起来,以便在有新的连接时进行处理。 在槽函数中,可以创建一个QTcpSocket对象,用于与客户端进行通信。通过该对象,可以接收来自客户端的HTTP请求信息,例如请求方法、路径和请求头等。同时,也可以发送HTTP响应给客户端,包括响应码、响应头和响应正文等。 可以使用Qt提供的QUrl类来解析客户端发送的HTTP请求中的URL。通过解析URL,可以获取到请求的路径以及可能的查询参数。根据请求路径和查询参数,可以执行相应的业务逻辑,并生成对应的响应内容。 在处理HTTP请求时,还可以使用Qt提供的QByteArray类来对请求和响应的数据进行处理。例如,可以使用QByteArray类的函数来解析和生成HTTP请求和响应的头部信息,以及读取或写入请求和响应的正文内容。 在处理完客户端的HTTP请求后,记得关闭与客户端的连接,以便节省系统资源。可以使用QTcpSocket的disconnectFromHost方法来断开与客户端的连接。 总的来说,使用Qt网络模块可以方便地实现HTTP服务端功能。通过监听新连接信号,创建新的连接,读取和解析客户端的请求,并生成相应的响应,最后关闭与客户端的连接,可以实现一个简单的HTTP服务器。 ### 回答3: Qt是一个跨平台的C++应用程序开发框架,包含了丰富的功能库和工具,可以用于开发各种类型的应用程序,包括服务端应用。 在Qt中,可以使用Qt网络模块来实现HTTP服务器。Qt网络模块提供了一套强大的网络通信功能,可以方便地处理HTTP请求和响应。 在编写Qt HTTP服务端时,我们首先需要创建一个QTcpServer对象,用于监听HTTP请求的到来。然后,使用QTcpServer的listen()函数开始监听指定的IP地址和端口号。 当有HTTP请求到达时,QTcpServer会自动调用其接受连接的槽函数。我们可以在这个槽函数中创建一个QTcpSocket对象,用于和客户端进行通信。 接下来,我们可以使用QTcpSocket的read()函数读取客户端发送的HTTP请求报文。在接收到完整的HTTP请求后,我们可以解析请求报文中的信息,如请求的URL、请求方法等。 根据HTTP请求的内容,我们可以根据需要进行相应的处理,例如返回静态网页、处理动态网页请求或者进行其他业务逻辑处理。处理完成后,我们使用QTcpSocket的write()函数将响应报文发送给客户端。 最后,我们可以使用QTcpSocket的close()函数关闭与客户端的连接,以便进行下一次请求的处理。 Qt提供了大量的网络编程类和函数,可以方便地实现HTTP服务器的开发。使用Qt进行HTTP服务端开发,可以快速地构建高性能、稳定可靠的网络应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值