Frage zu/Problem mit QNetworkAccessManager
Verfasst: 25. Oktober 2009 20:34
Ich habe hier ein seltsames Problem mit dem QNetworkAccessManager. Ich bin dabei ein Widget zu entwickeln, dass das Google Calendar Protokoll implementiert. Momentan ist das Einloggen sowie Abrufen von Kalendern und Ereignissen fertig, basieren auf einer Reihe von POST und GET Requests.
Der richtige Ablauf ist in etwa so (pseudo):
Das Problem ist nun, dass ich an zufälligen Stellen einen HTTP400/Bad Request bekomme. Dabei ist die Stelle Zufall und bei jedem Programmstart anders, manchmal läufts auch fehlerfrei durch.
Prinzipiell hab ichs so gecoded:
Request vorbereiten:
Einloggen:
Die restlichen Methoden sind eigentlich simple GETs auf die entsprechende Feed-URL:
Kalenderliste:
Eventliste analog.
Im onFinished() Slot werte ich die Antworten aus. Bei Erfolg wird am Ende des Slots die jeweils nächste Anfrage abgeschickt. D.h. nach erfoglreichem Login folgt ein GET auf die CalenderFeeds URL, nachdem die Kalenderliste empfangen wurde ein GET auf die EventsFeed URL.
Ist das Vorgehen so falsch, oder sieht jemand wo ich nach dem Fehler suchen müsste?
Der richtige Ablauf ist in etwa so (pseudo):
Code: Alles auswählen
manager->post(loginURL, loginData);
-> HTTP 200 (OK)
manager->get(calenderFeedURL);
-> HTTP 302 (redirect) -> neue calenderFeedURL mit session parameter
manager->get(neueCalenderFeedURL);
-> HTTP 200 (OK)
*reply auswerten und kalenderliste speichern*
manager->get(eventsFeedURL);
-> HTTP 302 (redirect) -> neue calenderFeedURL mit session parameter
manager->get(neueEventsFeedURL);
*reply auswerten und kalenderliste speichern*
Prinzipiell hab ichs so gecoded:
Code: Alles auswählen
MainClass::MainClass()
{
lastRequest = 0;
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), this, SLOT(onAuthenticationRequired(QNetworkReply*,QAuthenticator*)));
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onFinished(QNetworkReply*)));
connect(manager, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)), this, SLOT(onProxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
connect(manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, SLOT(onSslErrors(QNetworkReply*,QList<QSslError>)));
...
Code: Alles auswählen
int MainClass::prepare(const QString& url)
{
delete lastRequest;
lastRequest = new QNetworkRequest(QUrl(url));
if (!authToken.isEmpty())
{
lastRequest->setRawHeader("Authorization", authToken);
lastRequest->setRawHeader("GData-Version", "2");
}
return success;
}
Code: Alles auswählen
int MainClass::login(const QString& aEmail, const QString& aPassword)
{
DataPacket data; // request body
prepare(urls[urlLogin]); // s.o.
/* body vorbereiten */
manager->post(*lastRequest, data.getData());
return success;
}
Kalenderliste:
Code: Alles auswählen
int MainClass::getCalendarList()
{
...
/* some error checks */
prepare(urls[urlCalendarListFull]);
manager->get(*lastRequest);
return success;
}
Im onFinished() Slot werte ich die Antworten aus. Bei Erfolg wird am Ende des Slots die jeweils nächste Anfrage abgeschickt. D.h. nach erfoglreichem Login folgt ein GET auf die CalenderFeeds URL, nachdem die Kalenderliste empfangen wurde ein GET auf die EventsFeed URL.
Ist das Vorgehen so falsch, oder sieht jemand wo ich nach dem Fehler suchen müsste?