J’ai un webservice que je dois POST certaines données à l’aide de Qt. J’ai pensé que je pouvais utiliser un QByteArray lors de la POST sur le service Web.
Ma question est, comment puis-je formater ce tableau pour être analysé correctement à l’autre bout?
C’est 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=ssortingng, param2=ssortingng */ // 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=ssortingng&"); postData.append("param2=ssortingng");
Donc, au lieu de newline après chaque paramètre.
Comme certains parameters et valeurs doivent être codés en utf-8 et en pourcentage (espaces, &, =, caractères spéciaux …), vous devez plutôt utiliser QUrl
(pour Qt 4) ou QUrlQuery
(pour Qt 5) pour générer chaîne.
Exemple de code pour Qt 4 :
QUrl postData; postData.addQueryItem("param1", "ssortingng"); postData.addQueryItem("param2", "ssortingng"); ... 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", "ssortingng"); postData.addQueryItem("param2", "ssortingng"); ... QNetworkRequest request(serviceUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); networkManager->post(request, postData.toSsortingng(QUrl::FullyEncoded).toUtf8());
À partir de Qt 4.8, vous pouvez également utiliser QHttpMultiPart si vous avez besoin de télécharger des fichiers.
Mise à jour de la réponse alexisdm à Qt5:
// Setup the webservice url QUrl serviceUrl = QUrl("http://your.url"); QByteArray postData; QUrl params; QUrlQuery query; query.addQueryItem("param1","ssortingng1"); query.addQueryItem("param2","ssortingng2"); 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);
N’oubliez pas d’inclure
QT += network
en .pro.
la réponse est effectivement
QByteArray postData; postData.append("param1=ssortingng&"); postData.append("param2=ssortingng");
NOTE: utilisez “&” ici !!! .
Je n’ai pas remarqué la réponse de Juha ici et j’ai perdu 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 aussi 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","ssortingng1"); params.addQueryItem("param2","ssortingng2"); 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=ssortingng,\n"); postData.append("param2=ssortingng\n");