QRestAccessManager 类

QRestAccessManager 是 QNetworkAccessManager 的一种便利包装。 更多信息...

头文件 #include <QRestAccessManager>
CMakefind_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmakeQT += network
Qt 6.7
继承自 QObject
状态预览阶段

此类正在开发中,可能随时更改。

注意:本类中所有函数均 可重入

公有函数

QRestAccessManager(QNetworkAccessManager *manager, QObject *parent = nullptr)
virtual~QRestAccessManager() override
QNetworkReply *deleteResource(const QNetworkRequest &request, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *get(const QNetworkRequest &request, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *get(const QNetworkRequest &request, const QByteArray &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *get(const QNetworkRequest &request, const QJsonDocument &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *get(const QNetworkRequest &request, QIODevice *data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *head(const QNetworkRequest &request, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkAccessManager *networkAccessManager() const
QNetworkReply *patch(const QNetworkRequest &request, const QJsonDocument &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *patch(const QNetworkRequest &request, const QVariantMap &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *patch(const QNetworkRequest &request, const QByteArray &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *patch(const QNetworkRequest &request, QIODevice *data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *post(const QNetworkRequest &request, const QJsonDocument &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *post(const QNetworkRequest &request, const QVariantMap &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *post(const QNetworkRequest &request, QHttpMultiPart *data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *post(const QNetworkRequest &request, QIODevice *data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *put(const QNetworkRequest &request, const QJsonDocument &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *put(const QNetworkRequest &request, const QVariantMap &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *put(const QNetworkRequest &request, QHttpMultiPart *data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *put(const QNetworkRequest &request, QIODevice *data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &method, const QByteArray &data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &method, QIODevice *data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)
QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &method, QHttpMultiPart *data, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)

详细描述

QRestAccessManager 是基于 QNetworkAccessManager 之上的一个便利包装。它改进了在典型的 REST 客户端应用程序中有用的大型数据和 HTTP 方法。

可以通过直接配置包装的 QNetworkAccessManager 来访问常见的 Qt 网络功能。QRestAccessManager 不拥有包装的 QNetworkAccessManager

QRestAccessManager 及相关 QRestReply 类只能在它们所存在的线程中使用。有关更多信息,请参阅 QObject 线程亲和力

发布网络请求和处理响应

使用与所需 HTTP 方法相对应的函数调用启动网络请求,例如 get()post()

使用信号和槽

该函数返回一个 QNetworkReply* 对象,可以使用其信号以传统 Qt-signals-and-slots 的方式跟踪请求的完成。

以下是发送 GET 请求和处理响应的示例

QNetworkReply *reply = manager->get(request);
QObject::connect(reply, &QNetworkReply::finished, this, [reply]() {
    // The reply may be wrapped in the finish handler:
    QRestReply restReply(reply);
    if (restReply.isSuccess())
        // ...
});

使用回调和上下文对象

这些函数还接受一个QObject(子类)类型的上下文对象和一个回调函数作为参数。回调函数接受一个QRestReply&&作为参数。回调可以是任何可调用的,包括成员函数指针。

这些回调在回复处理完成时被调用(如果在错误导致的处理完成时也会调用)。

上下文对象可以是nullptr,尽管一般来说,这并不可取。使用有效的上下文对象能确保如果上下文对象在请求处理期间被销毁,那么回调不会被调用。访问已销毁上下文的漏网回调是应用行为错误的一个来源。

以下是一个发送GET请求并检查响应的例子

// With lambda
manager->get(request, this, [this](QRestReply &reply) {
    if (reply.isSuccess()) {
        // ...
    }
});
// With member function
manager->get(request, this, &MyClass::handleFinished);

许多函数接收要发送到服务器的数据。数据作为请求之后的第二个参数提供。

以下是一个发送POST请求并检查响应的例子

QJsonDocument myJson;
// ...
manager->post(request, myJson, this, [this](QRestReply &reply) {
    if (!reply.isSuccess()) {
        // ...
    }
    if (std::optional json = reply.readJson()) {
        // use *json
    }
});

提供的QRestReply&&在回调执行期间是有效的。如果你需要更长时间,你可以将其移动到另一个QRestReply,或者构造一个新的,并用QNetworkReply初始化它(参见QRestReply::networkReply)。

支持的数据类型

以下表格总结了方法和支持的数据类型。《X》表示支持。

数据类型get()post()put()head()patch()deleteResource()sendCustomRequest()
无数据X--X-X-
QByteArrayXXX-X-X
QJsonDocument *)XXX-X--
QVariantMap **)-XX-X--
QHttpMultiPart-XX---X
QIODeviceXXX-X-X

*) QJsonDocumentQJsonDocument::Compact格式发送,如果未设置Content-Type标题,则将其设置为application/json

**) QVariantMap将被转换为并作为QJsonObject处理

另请参阅 QRestReplyQNetworkRequestFactoryQNetworkAccessManager

成员函数文档

[explicit] QRestAccessManager::QRestAccessManager(QNetworkAccessManager *manager, QObject *parent = nullptr)

构建一个QRestAccessManager对象,并将parent设置为父对象,并将manager设置为底层的QNetworkAccessManager,用于通信。

另请参阅 networkAccessManager

[override virtual noexcept] QRestAccessManager::~QRestAccessManager()

销毁QRestAccessManager对象。

模板 <typename Functor, QRestAccessManager::if_compatible_callback<Functor> > QNetworkReply *QRestAccessManager::deleteResource(const QNetworkRequest &request, const QRestAccessManager::ContextTypeForFunctor<Functor> *context, Functor &&callback)

根据request发出HTTP DELETE

可以为处理请求完成提供可选的callbackcontext对象,如下所示

manager->deleteResource(request, this, [this](QRestReply &reply) {
    if (reply.isSuccess())
        // ...
});

还可以使用返回的 QNetworkReply* 对象的信号。更多详细信息,请参阅 发送网络请求和处理回复

删除资源(deleteResource())请求不支持提供数据。

另请参阅 QRestReply