2016-04-11 47 views
0

當發送POST數據到服務器時,從Qt應用程序看起來一切正常,但HTTP部分的數據部分未發送。在Wireshark的POST數據包中可以看到正確的「Content-Length」值,但整個HTTP段的大小隻有大約226個字節(與POST數據大小無關)。QNetworkAccessManager不發送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(); 
} 
+0

你可以發佈你的整個功能或主要在那裏,這是怎麼回事?經理可能會超出範圍或某事。以下是關於要發送的數據的內容:'數據必須打開才能讀取,並且必須保持有效,直到完成()信號發出此答覆。「......因此,在manager.post(...) ? –

回答

0

這對我的作品在兩個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 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(); 
} 

您可能會錯誤地解釋您的Wireshark數據。確保你正在查看HTTP請求的重新組合的TCP方面。這是它爲我尋找的方式;服務器是192.168.2.1:

wireshark capture screenshow

+0

謝謝你的幫助。你是對的,我錯了Wireshark - 只過濾了POST請求,POST數據在另一個數據包[重新組裝的PDU的TCP段]中發送,所以我沒有看到。 (我的代碼版本也適用。) –