QNetworkAccessManager - 如何发送“PATCH”请求

Posted

技术标签:

【中文标题】QNetworkAccessManager - 如何发送“PATCH”请求【英文标题】:QNetworkAccessManager - How to send "PATCH" request 【发布时间】:2015-12-03 12:10:25 【问题描述】:

我正在尝试向我的 firebase 应用程序发送“PATCH”请求。据我所知,QNetworkManager 不支持“Patch”请求。

如何发送“PATCH”请求?

【问题讨论】:

【参考方案1】:

所以我们很清楚QNetworkAccessManager中没有名为“patch”的方法 因此我使用了“sendCustomRequest”,但使用了 QBuffer。因为 QNetworkManager 需要一个 QIODevice 对象。

QString destination="";
currentNode.replace(QString("/").append(latestNode),"");
destination
        .append(host)
        .append(currentNode)
        .append(".json");
QString jsonString=QString(QString("").append("\"").append(latestNode).append("\"").append(":").append("\"").append(str).append("\"").append(QString("")));
QNetworkRequest request(destination);
request.setHeader(QNetworkRequest::ContentTypeHeader,
    "application/x-www-form-urlencoded");
qDebug()<<jsonString;
QBuffer *buffer=new QBuffer();
buffer->open((QBuffer::ReadWrite));
buffer->write(jsonString.toUtf8());
buffer->seek(0);
manager->sendCustomRequest(request,"PATCH",buffer);
qDebug()<<"posted";

【讨论】:

旁白:使用运算符+ 代替所有appends 会导致代码更清晰、更易于维护。 请注意,QBuffer 需要创建为指针(正如 Aykut 正确所做的那样)而不是在堆栈上,否则它可能在请求有时间执行之前被垃圾收集,导致很难调试问题。 如果您想使用QBuffer,您可以简化代码(根据QNetworkAccessManager 的Qt 源代码)并将对writeseek 的调用替换为setData() .但是QNetworkAccessManager::sendCustomRequest() 有一个变体,它采用QByteArray,因此您可以绕过QBuffer 并简单地输入manager-&gt;sendCustomRequest(request,"PATCH",jsonString.toUtf8());【参考方案2】:

尝试:

QNetworkAccessManager* manager = new QNetworkAccessManager();
QNetworkRequest request("http://<domain>/<path>/");
QHttpMultiPart* multipart = new QHttpMultiPart();
//... Add your data in multipart
manager->sendCustomRequest(request, "PATCH", multipart);

【讨论】:

【参考方案3】:

由于QNetworkAccessManager 不隐式支持PATCH,我创建了以下类QNetworkAccessManagerWithPatch 支持。使用它代替QNetworkAccessManager,您将拥有与post()put() 等相同的patch() 的3 个变体。

在此处获取 Github 要点:https://gist.github.com/paulmasri/efafb8ee350a8ce84a6657a30eb4eb8a

或者直接从这里取代码:(另存为QNetworkAccessManagerWithPatch.h

#pragma once

#include <QNetworkAccessManager>

class QNetworkAccessManagerWithPatch : public QNetworkAccessManager

    Q_OBJECT

public:
    explicit QNetworkAccessManagerWithPatch(QObject *parent = Q_NULLPTR)
        : QNetworkAccessManager(parent) 

    QNetworkReply* patch(const QNetworkRequest &request, QIODevice *data)
     return sendCustomRequest(request, "PATCH", data); 
    QNetworkReply* patch(const QNetworkRequest &request, const QByteArray &data)
     return sendCustomRequest(request, "PATCH", data); 

#if QT_CONFIG(http)
    QNetworkReply *patch(const QNetworkRequest &request, QHttpMultiPart *multiPart)
     return sendCustomRequest(request, "PATCH", multiPart); 
#endif
;

【讨论】:

虽然堆栈溢出的目的不是为了获得免费代码,但我喜欢当您正在构建解决方案并且被框架(或其他)分散注意力的问题所阻止时,并且然后...突然,一位天赐的开发人员与您分享了一些代码,让您可以专注于您正在处理的实际解决方案....谢谢伙计。

以上是关于QNetworkAccessManager - 如何发送“PATCH”请求的主要内容,如果未能解决你的问题,请参考以下文章

QNetworkAccessManager::put - QIODevice::read: 将文件发送到 ftp 服务器后设备未打开

错误:没有用于调用“QNetworkAccessManager::QNetworkAccessManager(Networking* const)”的匹配函数

QNetworkAccessManager 问题

使用 QNetworkAccessManager 请求

如何恢复 QNetworkAccessManager

QNetworkAccessManager - 如何发送 MultiPart “PATCH” 请求