【Qt初入江湖】Qt QNetworkRequest 底层架构、原理详细描述

鱼弦:CSDN内容合伙人、CSDN新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

                ​​​​​​​        ​​​​​​​    

Qt QNetworkRequest是一个用于描述网络请求的类,它包含了请求的URL、请求方法、请求头、请求体等信息。QNetworkRequest的底层架构由以下几个部分组成:

  1. QUrl

QUrl是Qt中用于处理URL的类,它可以将URL字符串解析成各个部分,例如协议、主机名、端口号、路径、查询参数、片段等,并提供了一些方法来获取和设置这些部分。在QNetworkRequest中,我们可以使用QUrl来表示请求的URL,并通过QUrl的方法来设置和获取URL的各个部分。

  1. QNetworkRequestHeader

QNetworkRequestHeader是Qt中用于处理HTTP请求头的类,它可以添加、删除、获取和修改HTTP请求头的各个字段。在QNetworkRequest中,我们可以使用QNetworkRequestHeader来表示请求头,并通过QNetworkRequestHeader的方法来设置和获取请求头的各个字段。

  1. QByteArray

QByteArray是Qt中用于处理字节数组的类,它可以存储任意二进制数据,并提供了一些方法来访问和修改数据。在QNetworkRequest中,我们可以使用QByteArray来表示请求体,并通过QByteArray的方法来设置和获取请求体的数据。

下面是QNetworkRequest的底层架构图:

在QNetworkRequest中,我们可以使用以下方法来设置和获取请求的URL、请求头和请求体:

  1. setUrl()

setUrl()方法用于设置请求的URL,它接受一个QUrl类型的参数,用于表示请求的URL。例如:

扫描二维码关注公众号,回复: 16228642 查看本文章

QUrl url("http://www.example.com");
QNetworkRequest request;
request.setUrl(url);
  1. url()

url()方法用于获取请求的URL,它返回一个QUrl类型的值,表示请求的URL。例如:

QNetworkRequest request;
QUrl url = request.url();
  1. setHeader()

setHeader()方法用于设置请求头的字段,它接受两个参数,第一个参数是一个枚举值,表示请求头的字段类型,第二个参数是一个QVariant类型的值,表示请求头的字段值。例如:

QNetworkRequest request;
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
  1. header()

header()方法用于获取请求头的字段值,它接受一个枚举值作为参数,表示请求头的字段类型,返回一个QVariant类型的值,表示请求头的字段值。例如:

QNetworkRequest request;
QString content_type = request.header(QNetworkRequest::ContentTypeHeader).toString();
  1. setRawHeader()

setRawHeader()方法用于设置请求头的原始字节数据,它接受两个参数,第一个参数是一个字节数组,表示请求头的字段名,第二个参数是一个字节数组,表示请求头的字段值。例如:

QNetworkRequest request;
request.setRawHeader("Authorization", "Bearer xxxxxxxx");
  1. rawHeader()

rawHeader()方法用于获取请求头的原始字节数据,它接受一个字节数组作为参数,表示请求头的字段名,返回一个字节数组,表示请求头的字段值。例如:

QNetworkRequest request;
QByteArray auth_header = request.rawHeader("Authorization");
  1. setRawHeaderList()

setRawHeaderList()方法用于设置请求头的原始字节数据列表,它接受一个QList类型的参数,表示请求头的原始字节数据列表。例如:

QNetworkRequest request;
QList<QPair<QByteArray, QByteArray>> headers;
headers << qMakePair(QByteArray("Content-Type"), QByteArray("application/json"));
headers << qMakePair(QByteArray("Authorization"), QByteArray("Bearer xxxxxxxx"));
request.setRawHeaderList(headers);
  1. rawHeaderList()

rawHeaderList()方法用于获取请求头的原始字节数据列表,返回一个QList类型的值,表示请求头的原始字节数据列表。例如:

QNetworkRequest request;
QList<QPair<QByteArray, QByteArray>> headers = request.rawHeaderList();
  1. setAttribute()

setAttribute()方法用于设置QNetworkRequest的属性,它接受两个参数,第一个参数是一个枚举值,表示属性类型,第二个参数是一个QVariant类型的值,表示属性值。例如:

QNetworkRequest request;
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
  1. attribute()

attribute()方法用于获取QNetworkRequest的属性值,它接受一个枚举值作为参数,表示属性类型,返回一个QVariant类型的值,表示属性值。例如:

QNetworkRequest request;
bool follow_redirects = request.attribute(QNetworkRequest::FollowRedirectsAttribute).toBool();

下面是一个示例代码,展示了如何使用QNetworkRequest发送一个HTTP GET请求:

#include <QtNetwork>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QUrl url("http://www.example.com");

    QNetworkRequest request;
    request.setUrl(url);

    QNetworkAccessManager manager;
    QNetworkReply *reply = manager.get(request);

    QObject::connect(reply, &QNetworkReply::finished, [&]() {
        if (reply->error() == QNetworkReply::NoError) {
            QByteArray data = reply->readAll();
            qDebug() << data;
        } else {
            qDebug() << "Error: " << reply->errorString();
        }

        app.quit();
    });

    return app.exec();
}

在上面的代码中,我们首先创建了一个QUrl对象来表示请求的URL,然后创建了一个QNetworkRequest对象来表示请求,设置了请求的URL。接着,我们创建了一个QNetworkAccessManager对象来管理网络请求,并通过QNetworkAccessManager的get()方法发送了一个HTTP GET请求。最后,我们通过QObject::connect()方法连接了QNetworkReply的finished信号,等待HTTP响应完成,并在回调函数中处理HTTP响应数据。

猜你喜欢

转载自blog.csdn.net/feng1790291543/article/details/131806880