2010-04-08 14 views
46

Ho un servizio web che ho bisogno di POST alcuni dati per usare Qt. Ho immaginato di poter utilizzare un QByteArray per il POST al servizio web.Come posso inviare i dati a un url usando QNetworkAccessManager

La mia domanda è, come posso formattare questo array per poter essere analizzato correttamente all'altra estremità?

Questo è il codice che ho finora:

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

Grazie!

risposta

14

ho usato:

QByteArray postData; 
postData.append("param1=string&"); 
postData.append("param2=string"); 

Così & invece di ritorno a capo dopo ogni parametro.

+7

Questo approccio non protegge contro i caratteri e l'input. Se 'string' è l'input dell'utente, potrebbero inserire parametri. – Halfgaar

-4
QByteArray postData; 
postData.append("param1=string,\n"); 
postData.append("param2=string\n"); 
+2

Questo non funziona nemmeno – relipse

5

la realtà risposta è

QByteArray postData; 
postData.append("param1=string&"); 
postData.append("param2=string"); 

NOTA: usare "&" qui !!!.

Non ho notato la risposta di Juha qui, e ho perso molto tempo a testare il mio codice usando l'approccio ", \ n".

Si prega di modificare la risposta corretta a Juha.

101

Poiché alcuni parametri e valori potrebbero aver bisogno di essere utf-8 e cento codificati (spazi, &, =, caratteri speciali ...), si dovrebbe invece usare QUrl (per Qt 4) o QUrlQuery (per Qt 5) per costruire la stringa pubblicata.

codice di esempio per 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()); 

e per 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()); 

partire con Qt 4.8 è possibile utilizzare anche QHttpMultiPart se è necessario caricare i file.

+7

Questo è sicuramente il modo più appropriato per eseguire l'attività in questione. +1. –

+2

A partire da Qt 5, QUrl non ha più addQueryItem(). – mjk99

+1

@ mjk99 'QURLQuery', ma non' .encodedQuery() ' – JVE999

2

Ecco un altro modo per gestire questa situazione, io sto usando il codice anche per dare un codice completo:

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

Aggiornamento alexisdm risposta a 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); 

Non dimenticare di includere

QT += network 

in .pro.

+1

Ciò che questo codice fa in modo diverso che la costruzione di un QByteArray come Juha, è che il postData è "" param1 = stringa1 & param2 = stringa2 "', che va storto. – Halfgaar

+1

Se si stanno facendo più richieste utilizzando lo stesso gestore di accesso di rete, è opportuno collegare lo slot al segnale 'finished()' di 'QNetworkReply' invece di' QNetworkAccessManager'. In questo modo, puoi ricevere segnali diversi per richiesta e gestirli separatamente, oppure gestire i dati parte per parte usando il segnale 'readyRead()'. – nurettin

Problemi correlati