QNetworkAccessManager 未发送 POST 请求的数据部分

Posted

技术标签:

【中文标题】QNetworkAccessManager 未发送 POST 请求的数据部分【英文标题】:QNetworkAccessManager is not sending data part of POST request 【发布时间】:2016-04-11 13:11:42 【问题描述】:

当向服务器发送 POST 数据时,Qt 应用程序看起来一切正常,但 HTTP 部分的数据部分没有发送。在 POST 数据包中的 Wireshark 中可见正确的“Content-Length”值,但整个 HTTP 段的大小仅为 226 字节左右(与 POST 数据大小无关)。

我找不到未发送数据部分的原因。有什么想法吗?

应用程序正在控制台中运行。完整的源代码如下。

project.pro:

QT += widgets
QT -= gui
QT += network

CONFIG += c++11

TARGET = POSTrequest
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

main.cpp:

#include <QObject>
#include <QApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>

int main(int argc, char *argv[])

    QApplication a(argc, argv);

    QNetworkRequest request(QUrl("http://www.server.com/index.php"));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

    QNetworkAccessManager manager;
    QNetworkReply *reply = manager.post(request, "a=aaaaaa");

    QObject::connect(reply, SIGNAL(finished()), &a, SLOT(quit()));

    return a.exec();

【问题讨论】:

你能把你的整个功能或主要功能发布在发生这种情况的地方吗?经理可能超出范围或其他原因。以下是关于正在发送的数据的说明:data must be open for reading and must remain valid until the finished() signal is emitted for this reply.... 那么在 manager.post(...) 之后会发生什么? 【参考方案1】:

这对我在 OS X 和 Windows 上都有效:

#post-request-36549732.pro
QT = core network
CONFIG += console c++11
CONFIG -= app_bundle
TARGET = post-request-36549732
TEMPLATE = app
SOURCES += main.cpp
// main.cpp
#include <QtNetwork>

int main(int argc, char ** argv)

    QCoreApplication aargc, argv;
    QNetworkAccessManager manager;
    QByteArray post"a=";
    post.append(QByteArray512, 'b');
    QNetworkRequest req(QUrl("http://server/test.php"));
    req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

    // Must be a queued connection, or else the multi-threaded manager might
    // win the race and signal quit before `a.exec()` starts running. In such
    // case, the `quit()` is a NOP. We don't want that.
    QObject::connect(&manager, &QNetworkAccessManager::finished, &a, [](QNetworkReply * reply)
       qDebug() << reply->errorString();
       qApp->quit();
    , Qt::QueuedConnection);

    manager.post(req, post);
    return a.exec();

您可能错误地解释了 Wireshark 数据。确保您正在查看 HTTP 请求的重组 TCP 方面。这就是我的样子;服务器是 192.168.2.1:

【讨论】:

感谢您的帮助。你是对的,我错了 Wireshark - 仅过滤 POST 请求,并且 POST 数据在另一个数据包中发送[重新组装的 PDU 的 TCP 段],所以我没有看到。 (我的代码版本也可以。)

以上是关于QNetworkAccessManager 未发送 POST 请求的数据部分的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用 QNetworkAccessManager 发送 DELETE 请求?

如何从一个 QNetworkAccessManager 发送回复?

QNetworkAccessManager - 如何发送“PATCH”请求

Pyside:QNetworkAccessManager 不发送请求

Qt:在QNetworkAccessManager中发送请求后连接信号[重复]