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”请求