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

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

如何发送“PATCH”请求?

【问题讨论】:

    标签: qt httprequest qnetworkaccessmanager qtnetwork qnetworkrequest


    【解决方案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 源代码)并将对write 和seek 的调用替换为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
      };
      

      【讨论】:

      • 虽然堆栈溢出的目的不是为了获得免费代码,但我喜欢当您正在构建解决方案并且被框架(或其他)分散注意力的问题所阻止时,并且然后...突然,一位天赐的开发人员与您分享了一些代码,让您可以专注于您正在处理的实际解决方案....谢谢伙计。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多