我有一个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);
谢谢!
答案 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");