29 votes

Comment puis-je créer une requête HTTP POST avec Qt 4.6.1 ?

Comment puis-je créer une requête HTTP POST avec certains paramètres codés en URL en utilisant Qt 4.6.1 ?

J'ai découvert que je peux créer une QNetworkRequest, y définir tous les paramètres et l'envoyer via la méthode post de QNetworkAccessManagers. Mais comment puis-je ajouter des paramètres codés en URL à la requête ?

Au final, je veux accéder au Eve API en utilisant Qt/C++. Un exemple en Python peut être trouvé ici : http://www.eveonline.com/api/doc/example-python.asp


Je l'ai géré en utilisant quelque chose comme (qui doit encore être refactorisé et transformé en quelque chose d'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;
}

11voto

stach Points 793

Votre solution est presque correcte. Mais il faut utiliser :

data = params.encodedQuery();

au lieu de

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

pour gérer correctement les chaînes UTF8.

6voto

Venemo Points 7213

Je suis désolé de ne trouver votre message que si tard. Cependant, je vais quand même essayer de vous aider, au cas où quelqu'un d'autre chercherait la réponse.

Par hasard, je travaille également sur une application EVE API, et j'ai essayé de la même manière. Malheureusement, QNetworkManager ne fonctionne pas de cette façon, car il envoie la requête de manière asynchrone. Vous devez connecter un slot à son finished(QNetworkReply*) signal.

Je le fais en faisant une requête avec une classe séparée appelée EveConnector le traitement de la réponse dans le créneau connecté à l'adresse de l'utilisateur. QNetworkManager 's finished puis de rappeler l'objet demandeur par le biais des signaux propres à la classe de connecteur.

Je serais heureux de partager le code, si vous le demandez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X