2016-04-11 4 views
0

Beim Senden von POST-Daten an den Server, von Qt-Anwendung sieht alles gut, aber Datenteil des HTTP-Teils wurden nicht gesendet. In Wireshark im POST-Paket ist der korrekte "Content-Length" -Wert sichtbar, aber die Größe des gesamten HTTP-Segments beträgt nur etwa 226 Bytes (ist unabhängig von der POST-Datengröße).QNetworkAccessManager sendet keine Daten Teil der POST-Anfrage

Ich kann den Grund nicht finden, warum Datenteil nicht gesendet wird. Irgendeine Idee?

Die Anwendung wird in der Konsole ausgeführt. Eine vollständige Quelle ist unten.

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(); 
} 
+0

Können Sie posten Sie Ihre gesamte Funktion oder Haupt wo dies geschieht? Es kann sein, dass der Manager den Bereich verlässt oder so. Hier ist, was es über die gesendeten Daten sagt: 'Daten müssen zum Lesen geöffnet sein und müssen gültig bleiben, bis das fertige() Signal für diese Antwort ausgegeben wird. ... Was passiert nach manager.post (...) ? –

Antwort

0

Das ist für mich funktioniert sowohl unter OS X und 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 a{argc, argv}; 
    QNetworkAccessManager manager; 
    QByteArray post{"a="}; 
    post.append(QByteArray{512, '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(); 
} 

Möglicherweise interpretieren Sie Ihre Wireshark-Daten falsch. Stellen Sie sicher, dass Sie sich den wieder zusammengesetzten TCP-Aspekt der HTTP-Anfrage ansehen. So sieht es für mich aus; Server ist 192.168.2.1:

wireshark capture screenshow

+0

Vielen Dank für Ihre Hilfe. Sie haben recht, ich lag falsch mit Wireshark - nur gefilterte POST-Anfragen und POST-Daten wurden in einem anderen Paket [TCP-Segment einer neu zusammengesetzten PDU] gesendet, also habe ich das nicht gesehen. (Meine Codeversion funktioniert auch.) –