diff options
author | Juha Vuolle <[email protected]> | 2023-11-20 12:56:10 +0200 |
---|---|---|
committer | Juha Vuolle <[email protected]> | 2023-12-08 15:53:36 +0200 |
commit | 8da4156da7ed2eff7b44bdda51eb92870bdfbc57 (patch) | |
tree | e98d8d196f8b9b5003794b1de33ed24f35a6b0bb /src | |
parent | a80ed49b1049478957edca1cfbcd90f9f4b83cb3 (diff) |
Add PATCH support for QRestAccessManager
It is somewhat common HTTP method with RESTful use cases
(partial updates on resources)
Task-number: QTBUG-114637
Change-Id: Id252d3f4b54c3ebb8df5c93259e64a4af2d0ca2f
Reviewed-by: Marc Mutz <[email protected]>
Reviewed-by: Ivan Solovev <[email protected]>
Reviewed-by: MÃ¥rten Nordheim <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/network/access/qrestaccessmanager.cpp | 125 | ||||
-rw-r--r-- | src/network/access/qrestaccessmanager.h | 5 | ||||
-rw-r--r-- | src/network/doc/snippets/code/src_network_access_qrestaccessmanager.cpp | 8 |
3 files changed, 138 insertions, 0 deletions
diff --git a/src/network/access/qrestaccessmanager.cpp b/src/network/access/qrestaccessmanager.cpp index 2a2c1247d88..146d8b24b93 100644 --- a/src/network/access/qrestaccessmanager.cpp +++ b/src/network/access/qrestaccessmanager.cpp @@ -108,6 +108,7 @@ Q_LOGGING_CATEGORY(lcQrest, "qt.network.access.rest") \li \c post() \li \c put() \li \c head() + \li \c patch() \li \c deleteResource() \li \c sendCustomRequest() \row @@ -116,6 +117,7 @@ Q_LOGGING_CATEGORY(lcQrest, "qt.network.access.rest") \li - \li - \li X + \li - \li X \li - \row @@ -124,6 +126,7 @@ Q_LOGGING_CATEGORY(lcQrest, "qt.network.access.rest") \li X \li X \li - + \li X \li - \li X \row @@ -132,6 +135,7 @@ Q_LOGGING_CATEGORY(lcQrest, "qt.network.access.rest") \li X \li X \li - + \li X \li - \li - \row @@ -140,6 +144,7 @@ Q_LOGGING_CATEGORY(lcQrest, "qt.network.access.rest") \li X \li X \li - + \li X \li - \li - \row @@ -148,6 +153,7 @@ Q_LOGGING_CATEGORY(lcQrest, "qt.network.access.rest") \li X \li X \li - + \li X \li - \li - \row @@ -157,6 +163,7 @@ Q_LOGGING_CATEGORY(lcQrest, "qt.network.access.rest") \li X \li - \li - + \li - \li X \row \li QIODevice @@ -164,6 +171,7 @@ Q_LOGGING_CATEGORY(lcQrest, "qt.network.access.rest") \li X \li X \li - + \li X \li - \li X \endtable @@ -439,6 +447,77 @@ Q_LOGGING_CATEGORY(lcQrest, "qt.network.access.rest") */ /*! + \fn template<typename Functor, if_compatible_callback<Functor>> QRestReply *QRestAccessManager::patch( + const QNetworkRequest &request, const QJsonObject &data, + const ContextTypeForFunctor<Functor> *context, + Functor &&callback) + + Issues an \c {HTTP PATCH} based on \a request. + + The optional \a callback and \a context object can be provided for + handling the request completion as illustrated below: + + \snippet code/src_network_access_qrestaccessmanager.cpp 10 + + Alternatively the signals of the returned QRestReply* object can be + used. For further information see + \l {Issuing Network Requests and Handling Replies}. + + The \c patch() method always requires \a data parameter. The following + data types are supported: + \list + \li QByteArray + \li QJsonObject *) + \li QJsonArray *) + \li QVariantMap **) + \li QIODevice* + \endlist + + *) Sent in \l QJsonDocument::Compact format, and the + \c Content-Type header is set to \c {application/json} if the + \c Content-Type header was not set + **) QVariantMap is converted to and treated as a QJsonObject + + \sa QRestReply, QRestReply::finished(), QRestAccessManager::requestFinished() +*/ + +/*! + \fn template<typename Functor, if_compatible_callback<Functor>> QRestReply *QRestAccessManager::patch( + const QNetworkRequest &request, const QJsonArray &data, + const ContextTypeForFunctor<Functor> *context, + Functor &&callback) + + \overload +*/ + +/*! + \fn template<typename Functor, if_compatible_callback<Functor>> QRestReply *QRestAccessManager::patch( + const QNetworkRequest &request, const QVariantMap &data, + const ContextTypeForFunctor<Functor> *context, + Functor &&callback) + + \overload +*/ + +/*! + \fn template<typename Functor, if_compatible_callback<Functor>> QRestReply *QRestAccessManager::patch( + const QNetworkRequest &request, const QByteArray &data, + const ContextTypeForFunctor<Functor> *context, + Functor &&callback) + + \overload +*/ + +/*! + \fn template<typename Functor, if_compatible_callback<Functor>> QRestReply *QRestAccessManager::patch( + const QNetworkRequest &request, QIODevice *data, + const ContextTypeForFunctor<Functor> *context, + Functor &&callback) + + \overload +*/ + +/*! \fn template<typename Functor, if_compatible_callback<Functor>> QRestReply *QRestAccessManager::head( const QNetworkRequest &request, const ContextTypeForFunctor<Functor> *context, @@ -800,6 +879,52 @@ QRestReply *QRestAccessManager::putWithDataImpl(const QNetworkRequest &request, return d->executeRequest([&]() { return d->qnam->put(request, data); }, context, slot); } +static const auto PATCH = "PATCH"_ba; + +QRestReply *QRestAccessManager::patchWithDataImpl(const QNetworkRequest &request, + const QJsonObject &data, const QObject *context, + QtPrivate::QSlotObjectBase *slot) +{ + Q_D(QRestAccessManager); + return d->executeRequest( + [&](auto req, auto json){ return d->qnam->sendCustomRequest(req, PATCH, json); }, + data, request, context, slot); +} + +QRestReply *QRestAccessManager::patchWithDataImpl(const QNetworkRequest &request, + const QJsonArray &data, const QObject *context, + QtPrivate::QSlotObjectBase *slot) +{ + Q_D(QRestAccessManager); + return d->executeRequest( + [&](auto req, auto json){ return d->qnam->sendCustomRequest(req, PATCH, json); }, + data, request, context, slot); +} + +QRestReply *QRestAccessManager::patchWithDataImpl(const QNetworkRequest &request, + const QVariantMap &data, const QObject *context, + QtPrivate::QSlotObjectBase *slot) +{ + return patchWithDataImpl(request, QJsonObject::fromVariantMap(data), context, slot); +} + +QRestReply *QRestAccessManager::patchWithDataImpl(const QNetworkRequest &request, + const QByteArray &data, const QObject *context, + QtPrivate::QSlotObjectBase *slot) +{ + Q_D(QRestAccessManager); + return d->executeRequest([&]() { return d->qnam->sendCustomRequest(request, PATCH, data); }, + context, slot); +} + +QRestReply *QRestAccessManager::patchWithDataImpl(const QNetworkRequest &request, QIODevice *data, + const QObject *context, QtPrivate::QSlotObjectBase *slot) +{ + Q_D(QRestAccessManager); + return d->executeRequest([&]() { return d->qnam->sendCustomRequest(request, PATCH, data); }, + context, slot); +} + QRestReply *QRestAccessManager::customWithDataImpl(const QNetworkRequest &request, const QByteArray& method, const QByteArray &data, const QObject *context, diff --git a/src/network/access/qrestaccessmanager.h b/src/network/access/qrestaccessmanager.h index 3ff23bee905..9656853f43d 100644 --- a/src/network/access/qrestaccessmanager.h +++ b/src/network/access/qrestaccessmanager.h @@ -114,6 +114,11 @@ public: QREST_METHOD_WITH_DATA(put, const QByteArray &) QREST_METHOD_WITH_DATA(put, QHttpMultiPart *) QREST_METHOD_WITH_DATA(put, QIODevice *) + QREST_METHOD_WITH_DATA(patch, const QJsonObject &) + QREST_METHOD_WITH_DATA(patch, const QJsonArray &) + QREST_METHOD_WITH_DATA(patch, const QVariantMap &) + QREST_METHOD_WITH_DATA(patch, const QByteArray &) + QREST_METHOD_WITH_DATA(patch, QIODevice *) QREST_METHOD_CUSTOM_WITH_DATA(const QByteArray &) QREST_METHOD_CUSTOM_WITH_DATA(QIODevice *) QREST_METHOD_CUSTOM_WITH_DATA(QHttpMultiPart *) diff --git a/src/network/doc/snippets/code/src_network_access_qrestaccessmanager.cpp b/src/network/doc/snippets/code/src_network_access_qrestaccessmanager.cpp index 20bb5d521d0..fcc8dbaef52 100644 --- a/src/network/doc/snippets/code/src_network_access_qrestaccessmanager.cpp +++ b/src/network/doc/snippets/code/src_network_access_qrestaccessmanager.cpp @@ -89,3 +89,11 @@ manager->sendCustomRequest(request, "MYMETHOD", myData, this, [this](QRestRepl // ... }); //! [9] + + +//! [10] +manager->patch(request, myData, this, [this](QRestReply *reply) { + if (reply->isSuccess()) + // ... +}); +//! [10] |