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

时间:2010-04-08 11:32:32

标签: web-services qt post symbian

我有一个web服务,我需要使用Qt发布一些数据。 我认为在POST到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);

谢谢!

6 个答案:

答案 0 :(得分:120)

由于某些参数和值可能需要为utf-8和百分比编码(空格,&,=,特殊字符......),您应该使用QUrl(对于Qt 4)或{{ 1}}(对于Qt 5)构建发布的字符串。

Qt 4 的示例代码:

QUrlQuery

Qt 5

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 4.8开始,如果您需要上传文件,也可以使用QHttpMultiPart

答案 1 :(得分:17)

我用过:

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

所以&而不是每个参数后的换行符。

答案 2 :(得分:7)

更新alextdm回答Qt5:

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

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

params.setQuery(query);

postData = params.toEncoded(QUrl::RemoveFragment);

// 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。

答案 3 :(得分:5)

实际答案是

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

注意:使用“&amp;”这里!!!

我没有注意到Juha的答案,并且花了很多时间使用“,\ n”方法测试我的代码。

请更改Juha的正确答案。

答案 4 :(得分:2)

以下是处理此问题的另一种方法,我也使用您的代码提供完整的代码:

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

答案 5 :(得分:-4)

QByteArray postData;
postData.append("param1=string,\n");
postData.append("param2=string\n");