Comment puis-je POST des données sur une URL en utilisant QNetworkAccessManager

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");