2010-02-06 15 views
30

¿Cómo puedo crear una solicitud HTTP POST con algunos parámetros codificados en la URL utilizando Qt 4.6.1?¿Cómo puedo crear una solicitud HTTP POST con Qt 4.6.1?

Descubrí que puedo crear una QNetworkRequest, establecer todos los parámetros y enviarlos a través del método de publicación de QNetworkAccessManagers. Pero, ¿cómo puedo agregar algunos parámetros codificados por URL a la solicitud?

Al final quiero acceder al Eve API usando Qt/C++. Un ejemplo de Python se puede encontrar aquí: http://www.eveonline.com/api/doc/example-python.asp


lo logré usar algo como (aún no se ha rediseñado y se conforma en algo útil):

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)? Estoy usando Qt, pero no he usado tanto las partes de HTTP ... todavía. – Macke

+0

Para su caso de uso, el QNetworkAccessManager parece excesivo. ¿Por qué no usar libcurl? – Paladin

Respuesta

6

lo siento que sólo encuentro tu publicación esta tarde. Sin embargo, aún intentaré ayudar, en caso de que alguien más esté buscando la respuesta.

Por accidente, también estoy trabajando en una aplicación EVE API, y también lo intenté de la misma manera. Desafortunadamente, QNetworkManager no funciona de esa manera, porque publica la solicitud de forma asincrónica. Debe conectar una ranura a su señal finished(QNetworkReply*).

lo hago al hacer una solicitud con una clase separada llamada EveConnector, el procesamiento de la respuesta en la ranura de la señal conectada a la QNetworkManager 's finished, y luego volver a llamar al objeto solicitar a través de señales propias de la clase conector.

Estaría encantado de compartir el código, si lo solicita.

11

Su solución es casi correcta. Pero uno debe utilizar:

data = params.encodedQuery(); 

en lugar de

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

para manejar adecuadamente cadenas UTF8.

Cuestiones relacionadas