如何使用 QNetworkAccessManager 将数据发布到 url

问题描述 投票:0回答:6

我有一个网络服务,我需要使用 Qt 将一些数据发布到其中。 我认为在发布到 Web 服务时可以使用 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);

谢谢!

web-services qt post symbian
6个回答
137
投票

由于某些参数和值可能需要采用 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


20
投票

我用过:

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

所以每个参数后面用&代替换行符。


9
投票

更新 Qt5 的 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中。


6
投票

实际答案是

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

注意:这里使用“&”!!!.

我没有注意到Juha在这里的回答,并且浪费了很多时间使用“, “接近。

请将正确答案改为Juha的。


3
投票

这是另一种处理此问题的方法,我也使用您的代码来给出完整的代码:

     // 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);

-4
投票
QByteArray postData;
postData.append("param1=string,\n");
postData.append("param2=string\n");
© www.soinside.com 2019 - 2024. All rights reserved.