web-dev-qa-db-ja.com

QNetworkAccessManagerを使用してURLにデータをPOST

POST Qtを使用するためのデータが必要です。WebサービスにPOSTするときにQByteArrayを使用できると考えました。

私の質問は、もう一方の端で正しく解析されるようにこの配列をフォーマットするにはどうすればよいですか?

これは私がこれまでに持っているコードです:

    // Setup the webservice url
    QUrl serviceUrl = QUrl("http://myserver/myservice.asmx");
    QByteArray postData;

   /* 
   Setup the post data somehow
   I want to transmit:
   param1=string,
   param2=string
   */

    // Call the webservice
    QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
    connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
    networkManager->post(QNetworkRequest(serviceUrl), postData);

ありがとう!

55
sabbour

私が使用した:

QByteArray postData;
postData.append("param1=string&");
postData.append("param2=string");

そのため、各パラメーターの後の改行の代わりに&。

17
Juha Palomäki

一部のパラメーターと値はutf-8およびパーセントエンコード(スペース、&、=、特殊文字...)が必要になる場合があるため、QUrl(Qt 4の場合)またはQUrlQuery( Qtの場合5)投稿された文字列を作成します。

Qt 4のコード例:

QUrl postData;
postData.addQueryItem("param1", "string");
postData.addQueryItem("param2", "string");
...
QNetworkRequest request(serviceUrl);    
request.setHeader(QNetworkRequest::ContentTypeHeader, 
    "application/x-www-form-urlencoded");
networkManager->post(request, postData.encodedQuery());

およびQt 5

QUrlQuery postData;
postData.addQueryItem("param1", "string");
postData.addQueryItem("param2", "string");
...
QNetworkRequest request(serviceUrl);
request.setHeader(QNetworkRequest::ContentTypeHeader, 
    "application/x-www-form-urlencoded");
networkManager->post(request, postData.toString(QUrl::FullyEncoded).toUtf8());

Qt 4.8以降では、ファイルをアップロードする必要がある場合は QHttpMultiPart を使用することもできます。

120
alexisdm

Qis5へのalexisdmの回答の更新:

// Setup the webservice url
QUrl serviceUrl = QUrl("http://your.url");
QByteArray postData;

QUrlQuery query;
query.addQueryItem("param1","string1");
query.addQueryItem("param2","string2");

postData = query.toString(QUrl::FullyEncoded).toUtf8();

// Call the webservice
QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
connect(networkManager, SIGNAL(finished(QNetworkReply*)),
        SLOT(onPostAnswer(QNetworkReply*)));

QNetworkRequest networkRequest(serviceUrl);
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");

networkManager->post(networkRequest,postData);

含めることを忘れないでください

QT += network

.proで.

7
Jonaias

実際の答えは

QByteArray postData;
postData.append("param1=string&");
postData.append("param2=string");

注:ここでは「&」を使用してください!!!

ここではJuhaの答えに気付かず、「、\ n」アプローチを使用してコードをテストするのに多くの時間を無駄にしています。

ジュハの正解を変更してください。

5
Mason Zhang

これを処理する別の方法があります。私はあなたのコードを使用して完全なコードを提供しています:

     // Setup the webservice url         
     QUrl serviceUrl = QUrl("http://myserver/myservice.asmx");
     QByteArray postData;

     QUrl params;
     params.addQueryItem("param1","string1");
     params.addQueryItem("param2","string2");

     postData = params.encodedQuery();

     // Call the webservice
     QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
     connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));

      networkManager->post(QNetworkRequest(serviceUrl), postData);
2
Mugunth