web-dev-qa-db-fra.com

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

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!

55
sabbour

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.

17
Juha Palomäki

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.

120
alexisdm

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.

7
Jonaias

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.

5
Mason Zhang

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);
2
Mugunth