Seite 1 von 1
Wie erstelle ich einen HTTP Post
Verfasst: 7. Februar 2010 10:21
von iso8859-1
Hallo,
wie erstelle ich einen HTTP Post mit url-codierten Parametern. Ich möchte mit QT die Eve-API ansprechen (hier ein Pyhton Beispiel dazu
http://www.eveonline.com/api/doc/example-python.asp). Dazu möchte ich NICHT die deprecated Klasse QHTTP verwenden sondern QNetworkRequest und QNetworkAccessManagers.
Ich vermute ich muss einen QNetworkRequest parametrieren mit der passenden URL usw. und ich dann an die post-Methode des QNetworkAccessManagers übergeben. Aber wie bekomme ich die POST-Parameter in den Body des requests?
Kann mir jemand bitte ein Beispiel geben?
Verfasst: 7. Februar 2010 11:42
von upsala
Verfasst: 7. Februar 2010 11:54
von iso8859-1
entschuldige bitte, aber das ist nicht hilfreich. Aus meinem Anfangs-Post hast du sicher schon gesehen, dass ich die Referenz auf die post-methode gefunden hatte. Auch den Wikipedia-Artikel habe ich schon gelesen. Trotzdem komme ich nicht weiter.
aktuell teste ich mit folgendem Code:
Code: Alles auswählen
void requestApi()
{
std::cout<<"Teststring"<<std::endl;
QNetworkAccessManager qnetman;
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","0");
params.addQueryItem("apiKey","key");
data.append(params.toString());
data.remove(0,1);
QNetworkReply *reply = qnetman.post(request,data);
std::cout<<"Request postet"<<std::endl;
}
allerdings ist beim ausführen dieses Codes keine Traffic auf Wireshark zu erkennen.
Verfasst: 7. Februar 2010 12:10
von Christian81
Und mal wieder C++ basics

Was denkst du wie lange qnetman lebt?
Verfasst: 7. Februar 2010 12:27
von iso8859-1
bis zum Ende der Methode. Leider steht in der Doku nicht, wie lange er leben muß für seine Aufgabe. Deshalb frage ich ja. Das einzige Objekt, das länger lebt ist die reply die ich von der post-Methode bekomme.
Sehr schön und Danke - jetzt kommt der request raus. Eine Frage noch zum URL-Encoden und zur data. Gibt es da auch einen einfacheren Weg als eine "falsche" URL zu erzeugen und das ? am anfang dann mittels remove zu entfernen?
Verfasst: 7. Februar 2010 12:29
von Christian81
Ich habs doch schon benatwortet, oder?
Auch prinzipiell ist es doch total unlogisch - der manager ist für das ganze zuständig - wie sollte es also funktionieren wenn er sofort wider zerstört wird??
Verfasst: 7. Februar 2010 12:39
von iso8859-1
Wie das funktionieren soll - ich kann mir mehrere Theorien vorstellen. Theoretisch könnte die ganze Bearbeitung im Reply-Objekt liegen. Das sollte alle nötigen Informationen bekommen können (bei dessen Erstellung liegt ja alles vor, von Ihm kommen auch die Signale).
Wenn man weis wie es geht ist es immer einfach. Aber in der Doku steht nichts über die Lifetime von dem QNetworkAccessManager. Mit viel goodwill könnte man es in "...and receive replies" interpetieren. Ich persöhnlich hätte ein: "The QNetworkManagerObject has to be kept alive during until the replyFinished slot of the QNetworkReply is called" oder so was gewünscht. Dann wäre alles klar. Aber nochmal danke für die Antwort.
Verfasst: 7. Februar 2010 12:43
von Christian81
iso8859-1 hat geschrieben:Wie das funktionieren soll - ich kann mir mehrere Theorien vorstellen. Theoretisch könnte die ganze Bearbeitung im Reply-Objekt liegen. Das sollte alle nötigen Informationen bekommen können (bei dessen Erstellung liegt ja alles vor, von Ihm kommen auch die Signale).
Naja - dann würde das ding wohl ReplyManager heißen
/edit:
Qt Docu hat geschrieben:
The Network Access API is constructed around one QNetworkAccessManager object, which holds the common configuration and settings for the requests it sends. It contains the proxy and cache configuration, as well as the signals related to such issues, and reply signals that can be used to monitor the progress of a network operation.
und das sagt ja eigentlich auch alles.
Verfasst: 7. Februar 2010 13:08
von iso8859-1
Finde ich nicht, aber das ist Geschmackssache. Es bleibt - ich habe das Objekt falsch verwendet, deshalb hat es nicht funktioniert. Ich wusste wie lange das Objekt lebt und hatte dies bewußt gemacht. Zumindest für mich war die Doku unklar. Wenn es noch anderen so geht sollte Nokia nachbessern. Und ich sollte genauer lesen.
Eine Frage noch zum URL-Encoden und zur data. Gibt es da auch einen einfacheren Weg als eine "falsche" URL zu erzeugen und das ? am anfang dann mittels remove zu entfernen?
Verfasst: 7. Februar 2010 13:21
von upsala
Die Frage ist doch nicht ob es einen einfacheren Weg gibt, sondern ob es einen 'richtigeren' Weg gibt. Wie müssen denn die Daten kodiert sein, damit sie richtig übertragen werden?
Verfasst: 7. Februar 2010 13:29
von iso8859-1
Wie oben erwähnt - URL-codiert
"All parameters needed by the API are sent over HTTP, either by POST or GET. Parameters should be URL Encoded."
der dazugehörige python Beispielcode sieht so aus:
Code: Alles auswählen
params = urllib.urlencode( {
'characterID': 150209812,
'userid': 256833,
'apikey': 'DVPtgNgmyEGk9L9RxDTJn8dCjIraiaa7efNK4VlGKAoI6Hm8uB514zy6CbFCuScC',
} )
Verfasst: 7. Februar 2010 13:57
von upsala
Was oben nicht alles erwähnt ist. Dann beschäftige dich mal mit QUrl::toPercentEncoding.
Verfasst: 7. Februar 2010 15:15
von iso8859-1
danke