2010-02-06 12 views
30

Come posso creare una richiesta HTTP POST con alcuni parametri codificati URL usando Qt 4.6.1?Come posso creare una richiesta HTTP POST con Qt 4.6.1?

Ho capito che posso creare un QNetworkRequest, impostare tutti i parametri e inviarlo tramite il metodo di post QNetworkAccessManagers. Ma come posso aggiungere alcuni parametri con codifica URL alla richiesta?

Alla fine voglio accedere allo Eve API usando Qt/C++. Un esempio di Python può essere trovato qui: http://www.eveonline.com/api/doc/example-python.asp


Sono riuscito utilizzando qualcosa di simile (ancora da refactoring e formato in qualcosa di utile):

QNetworkReply *requestApi(QNetworkAccessManager &nwam) 
{ 

    QNetworkRequest request(QUrl("http://api.eve-online.com/account/Characters.xml.aspx")); 
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); 

    QByteArray data; 
    QUrl params; 

    params.addQueryItem("userid","user"); 
    params.addQueryItem("apiKey","key"); 
    data.append(params.toString()); 
    data.remove(0,1); 

    QNetworkReply *reply = nwam.post(request,data); 
    return reply; 
} 
+0

[QUrl :: addEncodedQueryItem()] (http://doc.trolltech.com/4.6/qurl.html#addEncodedQueryItem)? Sto usando Qt da solo, ma non ho ancora usato le parti HTTP ... ancora. – Macke

+0

Per il tuo caso d'uso, QNetworkAccessManager sembra eccessivo. Perché non usare solo libcurl? – Paladin

risposta

6

Mi dispiace che ho solo trovato il tuo post così tardi. Tuttavia, cercherò comunque di aiutarti, nel caso in cui qualcun altro stia cercando la risposta.

Per errore, sto anche lavorando su un'applicazione API EVE, e ho anche provato allo stesso modo. Sfortunatamente, QNetworkManager non funziona in questo modo, perché invia la richiesta in modo asincrono. Devi collegare uno slot al suo segnale finished(QNetworkReply*).

lo faccio facendone richiesta con una classe separata chiamata EveConnector, l'elaborazione della risposta nella fessura collegato a finished segnale s' il QNetworkManager, e quindi richiamare l'oggetto richiedente tramite propri segnali della classe connettore.

Sarei felice di condividere il codice, se lo chiedi.

11

La soluzione è quasi giusta. Ma si dovrebbe usare:

data = params.encodedQuery(); 

invece di

data.append(params.toString()); 
data.remove(0,1); 

per gestire stringhe UTF8 correttamente.

Problemi correlati