2016-04-11 26 views
0

POSTデータをサーバーに送信すると、Qtアプリケーションからはすべてが良好に見えますが、HTTP部分のデータ部分は送信されませんでした。 POSTのWiresharkでは、パケットは正しい "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

あなたはこれが起こっているあなたの全体の機能やメインを投稿することができますか?マネージャーが範囲外になる可能性があります。 'データは読み込みのために開かれていなければならず、この返信のためにfinished()シグナルが出されるまで有効でなければなりません。' ...だから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リクエストのReassembled TCPアスペクトを確認してください。それは私のためにそれを探す方法です。サーバが192.168.2.1である:

wireshark capture screenshow

+0

ありがとうございました。あなたが正しいです、私はWiresharkで間違っていました - POSTリクエストだけをフィルタリングし、POSTデータは別のパケット[再構成されたPDUのTCPセグメント]で送信されたので、私はそれを見ませんでした。 (私のバージョンのコードも同様に動作します。) –

関連する問題