我有一个网络服务,我需要使用 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);
谢谢!
由于某些参数和值可能需要采用 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());
QHttpMultiPart
。
我用过:
QByteArray postData;
postData.append("param1=string&");
postData.append("param2=string");
所以每个参数后面用&代替换行符。
更新 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中。
实际答案是
QByteArray postData;
postData.append("param1=string&");
postData.append("param2=string");
注意:这里使用“&”!!!.
我没有注意到Juha在这里的回答,并且浪费了很多时间使用“, “接近。
请将正确答案改为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");