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