Wie erstelle ich einen HTTP Post

Alles rund um die Programmierung mit Qt
Antworten
iso8859-1
Beiträge: 25
Registriert: 8. März 2009 11:02

Wie erstelle ich einen HTTP Post

Beitrag 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?
iso8859-1
Beiträge: 25
Registriert: 8. März 2009 11:02

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und mal wieder C++ basics :(
Was denkst du wie lange qnetman lebt?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
iso8859-1
Beiträge: 25
Registriert: 8. März 2009 11:02

Beitrag 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?
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:

Beitrag 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??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
iso8859-1
Beiträge: 25
Registriert: 8. März 2009 11:02

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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 :D

/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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
iso8859-1
Beiträge: 25
Registriert: 8. März 2009 11:02

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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?
iso8859-1
Beiträge: 25
Registriert: 8. März 2009 11:02

Beitrag 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',
    } )
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was oben nicht alles erwähnt ist. Dann beschäftige dich mal mit QUrl::toPercentEncoding.
iso8859-1
Beiträge: 25
Registriert: 8. März 2009 11:02

Beitrag von iso8859-1 »

danke
Antworten