Wie erstelle ich einen HTTP Post
Wie erstelle ich einen HTTP Post
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?
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?
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:
allerdings ist beim ausführen dieses Codes keine Traffic auf Wireshark zu erkennen.
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;
}
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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?
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?
Zuletzt geändert von iso8859-1 am 7. Februar 2010 12:32, insgesamt 1-mal geändert.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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.
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.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Naja - dann würde das ding wohl ReplyManager heißeniso8859-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).
/edit:
und das sagt ja eigentlich auch alles.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.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
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?
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?
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:
"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',
} )