J'ai un webservice dont j'ai besoin POST quelques données pour utiliser Qt. J'ai pensé que je pouvais utiliser un QByteArray lors du POSTing sur le service web.
Ma question est, comment puis-je formater ce tableau afin d'être correctement analysé à l'autre extrémité?
Voici le code que j'ai jusqu'à présent:
// 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);
Merci!
J'ai utilisé:
QByteArray postData;
postData.append("param1=string&");
postData.append("param2=string");
Donc & au lieu de la nouvelle ligne après chaque paramètre.
Comme certains paramètres et valeurs peuvent avoir besoin d'être encodés en utf-8 et en pourcentage (espaces, &, =, caractères spéciaux ...), vous devriez plutôt utiliser QUrl
(pour Qt 4) ou QUrlQuery
(pour Qt 5) pour construire la chaîne publiée.
Exemple de code pour 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());
et pour 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());
À partir de Qt 4.8, vous pouvez également utiliser QHttpMultiPart si vous devez télécharger des fichiers.
Mise à jour de la réponse d'Alexisdm à Qt5:
// 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);
N'oubliez pas d'inclure
QT += network
dans .pro.
la réponse est
QByteArray postData;
postData.append("param1=string&");
postData.append("param2=string");
NOTE: utilisez "&" ici !!!.
Je n'ai pas remarqué la réponse de Juha ici, et je perds beaucoup de temps à tester mon code en utilisant l'approche ",\n".
Veuillez changer la bonne réponse à celle de Juha.
Voici une autre façon de gérer cela, j'utilise également votre code pour donner un code complet:
// 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);