我怎样才能使用QNetworkAccessManager POST数据到一个url

我有一个web服务,我需要发布一些数据使用Qt。 我想我可以使用一个QByteArray时,张贴到Web服务。

我的问题是,如何格式化这个数组,以便在另一端正确parsing?

这是迄今为止的代码:

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

谢谢!

我用了:

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

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

由于一些参数和值可能需要utf-8和编码百分比(空格,&,=,特殊字符…),您应该使用QUrl (对于Qt 4)或QUrlQuery (对于Qt 5)来构build发布串。

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 。

更新alexisdm答案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。

其实答案是

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

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

我没有注意到Juha的答案,并且用“\ n”方法浪费了很多时间来testing我的代码。

请把正确的答案改成Juha的。

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

  // 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); 
 QByteArray postData; postData.append("param1=string,\n"); postData.append("param2=string\n");