【QT】——QT中HTTP通信的使用流程

目录

基本概念

1.QNetworkAccessManager

常用的公共成员函数

信号 

2.QNetworkRequest ——HTTP请求

3.QNetworkReply——HTTP响应

HTTP通信流程

基本概念

Qt中的HTTP通信访问 API 是围绕 QNetworkAccessManager 对象构建的,该对象保存它发送的请求的通用配置和设置,一个 QNetworkAccessManager 实例应该足以满足整个 Qt 应用程序网络访问的需求。

QNetworkAccessManager 对象被创建时,那么 应用程序就可以使用它在网 络上发送请求。它提供了一组标准的函数,可以承载网络请求和一些可选的数据 并且每一个请求返回一个 QNetworkReply 对象。该返回的对象包含着返回的请求应 带的所有数据。

QNetworkAccessManager 将它收到的请求排入队列。 并行执行的请求数量取决于协议。 目前,对于桌面平台上的 HTTP 协议,一个主机/端口组合并行执行 6 个请求

目前,对于桌面平台的 HTTP 协议,对于一个主机/端口的组合,可 6 个请求并行执 行。

1.QNetworkAccessManager

常用的公共成员函数

//头文件
#include <QNetworkAccessManager>

//构造函数
QNetworkAccessManager(QObject *parent = nullptr)


//发布get请求以获取内容,
//返回一个新的 QNetworkReply 对象,该对象在新数据到达时发出 readyRead() 信号。
QNetworkReply * get(const QNetworkRequest &request)

//发送post请求
QNetworkReply* post(const QNetworkRequest &request, QIODevice *data)
QNetworkReply* post(const QNetworkRequest &request, const QByteArray &data)
QNetworkReply* post(const QNetworkRequest &request, QHttpMultiPart *multiPart)

//返回cookies
QNetworkCookieJar * cookieJar() const

//刷新网络连接的内部缓存。与 clearAccessCache() 相比,身份验证数据被保留。
void clearConnectionCache()

//与指定主机进行连接
void connectToHost(const QString &hostName, quint16 port = 80)

//设置传输超时时间。如果在超时到期之前没有传输字节,传输将被中止。
//零表示未设置计时器。如果未调用此函数,则超时将被禁用且值为 0。
void setTransferTimeout(int timeout = QNetworkRequest::DefaultTransferTimeoutConstant)

信号 

//信号 
//当有请求已经完成的时候,会发射该信号
void finished(QNetworkReply *reply)

//当 SSL/TLS 会话成功完成初始握手时,会发出此信号。此时,还没有传输用户数据。
[signal] void encrypted(QNetworkReply *reply)

//网络回复完成时会发出此信号。回复参数将包含一个指向刚刚完成的回复的指针。该信号与 //QNetworkReply::finished() 信号一起发出。
//注意:不要直接删除连接到该信号的槽中的回复对象。应使用 deleteLater()
[signal] void finished(QNetworkReply *reply)

注意:QNetworkAccessManager类对所接收的请求会一个一个的排序,如果要并行处理这些请求,同时间内处理的数量取决于协议。目前,对HTTP协议是6个请求并行处理的。

//创建个请求对象,设置好请求的内容
QNetworkRequest request;
request.setUrl(QUrl("http://qt-project.org")); 
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0"); 

//应答对象reply,不仅获得下载数据,还获得失败时的错误信息
QNetworkReply *reply = manager->get(request); 
connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); 
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError))); 
connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(slotSslErrors(QList<QSslError>)));

2.QNetworkRequest ——HTTP请求

QNetworkRequest是QT中的HTTP请求对象,它包含请求的url和请求报头,正文等信息。


//构造函数
QNetworkRequest(const QUrl &url = QUrl())
QNetworkRequest(const QNetworkRequest &other)

//设置QNetworkAccessManager 用于此请求及其底层 HTTP/2 连接的参数。
void setHttp2Configuration(const QHttp2Configuration &configuration)

//返回在此网络请求中设置的所有报头的列表。按照设置顺序排列
QList rawHeaderList()

//设置此网络请求所指的 URL 为 url。
void setUrl(const QUrl &url)

//设置表头的值。两次设置相同的标题会覆盖之前的设置
void setRawHeader(const QByteArray &headerName, const QByteArray &headerValue)

3.QNetworkReply——HTTP响应

QNetworkReply是HTTP响应类,QNetworkReply对象包含了响应的数据和响应头

注意:在一轮请求完成后,不要立即删除QNetworkReply对象,要用deleteLater()函数让Qt系统自己判断在适当的时候删除。

接口函数:

//QNetworkReply被处理完成则返回true
bool  isFinished() const

//如果请求还在进行,或者响应处理还没有完成,或者响应已经被终止,则返回true
bool  isRunning() const

//返回上传或者下载的url,该 URL 可能与原始请求的 URL 不同。
QUrl QNetworkReply::url() const

//返回该响应对应的请求
QNetworkRequest request() const

//返回读缓冲区的大小
qint64 readBufferSize() const

//关闭此设备。未读的数据会被丢弃,但网络资源直到读完才被释放。
//如果有任何上传正在进行,它将一直持续到完成。
//当所有操作结束并且网络资源被释放时,finished() 信号被发出。
void close();

//信号
//当x响应完成处理后发出此信号。发出此信号后,将不再更新回复的数据。
//除非调用 close() 或 abort() ,否则仍将打开回复以供读取.
//因此可以通过调用 read() 或 readAll() 来检索数
void finished()


//每当元数据发生更改时,都会发出此信号。
//元数据是任何不属于内容(数据)本身的信息,包括网络标头。
[signal] void metaDataChanged()

//发出此信号以指示此网络请求的下载部分的进度(如果有下载)
//如果没有与此请求关联的下载,则此信号将发出一次,bytesReceived 和 bytesTotal 的值都为0。
//bytesReceived 指示接收的字节数,bytesTotal 指示预期下载的总字节数
//如果要下载的字节数未知,bytesTotal 将为 -1
[signal] void downloadProgress(qint64 bytesReceived, qint64 bytesTotal)

//出现错误时发出此信号。代码参数包含检测到的错误代码。
//调用 errorString() 以获取错误条件的文本表示。
[signal] void errorOccurred(QNetworkReply::NetworkError code)

HTTP通信流程

  1. 创建QNetworkAccessManager 对象。
  2. 创建 QNetworkRequest 对象,调用setUrl函数 设置请求url,调用setHeader函数设置请求报头。
  3. 调用QNetworkAccessManager 调用post函数或者get函数发送HTTP请求
  4. 设置槽函数,并调用connect函数设置QNetworkReply的处理动作

模板:


//举例;
QNetworkAccessManager* manger=new QNetworkAccessManager(this);
QNetworkRequest request; 
request.setUrl(url);
//设置需要设置响应报头
request.setHeader(QNetworkRequest::ContentTypeHeader,
                   QVariant("application/json"));

//发送请求
QNetworkReply *reply = manager->post(request);
//或者
//data数据的处理流程
QNetworkReply *reply = manager->post(request, data);

//设置http响应的处理动作
connect(reply, &QNetworkReply::readyRead, this, [=](){
}

        

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
qt——服务器客户端进行tcp通信代码.rar是一个使用Qt框架编写的用于实现服务器和客户端之间进行TCP通信的程序。TCP是一种高可靠性的传输层协议,通过它可以实现数据的可靠传输,具有较高的传输速度和较低的错误率。在程序服务器端和客户端都可以进行TCP通信,它们之间通过网络连接进行数据的传输和接收。 在程序使用Qt提供的QTcpSocket和QTcpServer两个类来实现TCP通信QTcpServer类用于实现服务器端,它可以监听指定的端口,等待客户端的连接请求,并实现TCP通信QTcpSocket类用于实现客户端,它可以主动发起连接请求,并与服务器进行TCP通信。 在程序服务器端和客户端都实现了数据的发送和接收,通过使用Qt提供的信号和槽机制来实现。信号表示某个事件的发生,槽表示某个事件的响应。当服务器端或客户端有数据发送或接收时,发出相应的信号,程序响应相应的槽来实现数据的发送和接收。 此外,在程序使用了一些其他的Qt类和模块,如QDataStream、QByteArray和QHostAddress等,来实现数据的封装和解析,IP地址和端口号的管理等功能。 总之,这个qt——服务器客户端进行tcp通信代码.rar是一个优秀的实现TCP通信的程序,通过它可以学习到Qt框架的使用,以及实现TCP通信的方法和技巧,对于想要开发网络应用的开发者来说是一个非常有用的代码库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值