我怎样才能使用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); 

谢谢!

    6 Solutions collect form web for “我怎样才能使用QNetworkAccessManager POST数据到一个url”

    我用了:

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