Seite 1 von 1

Qt4 - Problem mit eigener HTTP-Klasse

Verfasst: 13. September 2006 23:18
von caligano
Hallo!

Ich mir in Qt4 eine kleine HTTP-Klasse gebaut, um mir in einem Programm, das oft gleichartige HTTP-Requests an den gleichen Host sendet, ein bisschen Code-Wiederholung zu sparen.

Das ganze sieht so aus:
http.h

Code: Alles auswählen

#ifndef HTTP_H
#define HTTP_H

#include <QHttp>

class QHttpRequestHeader;

class Http : public QHttp
{
   Q_OBJECT
   
public:
   Http(QObject *parent);
   void setHeader(const QString &method, const QString &path, const QString &cookie);
   void sendRequest();

private:
   QHttpRequestHeader header;   
};
        
#endif
http.cpp

Code: Alles auswählen

#include <QHttp>
#include <QHttpRequestHeader>
#include <QByteArray>
#include <QString>

#include "http.h"

Http::Http(QObject *parent = 0) : QHttp(parent) {}

void Http::setHeader(const QString &method, const QString &path, const QString &cookie = "")
{
 header.setRequest(method, path);
 header.setValue("Host", "www.host.de");
 header.setValue("Content-type","application/x-www-form-urlencoded");
 header.setValue("Keep-Alive", "300");
 header.setValue("Connection", "keep-alive"); 
 
 if (cookie!="")
 {
  	 header.setValue("Cookie", cookie);
 }

 
}

void Http::sendRequest()
{
   this->setHost("www.host.de");
   this->request(header);

}
verwendet wird die Klasse Http z.B in : mainwindow.cpp

Code: Alles auswählen

 MainWindow::MainWindow()
{
   http = new Http(this);	
   connect(http, SIGNAL(done(bool)),this, SLOT(displayText(bool)));
   ...
}
Das funktioniert , doch wenn ich z.B. this->setHost("www.host.de"); in den Konstruktor Http::Http schreibe, anstatt diesen Befehl z.B erst in Http::sendRequest() aufzurufen, tritt folgender Fehler auf:

Sofort nach dem Starten des Programm wird die Funktion displayText() aufgerufen (Fenster geht auf, aber natürlich ohne Inhalt). Dann gibt man Daten ein, ein paar Requests werden gesendet, und das Fenster geht nochmal auf, diesmal mit Inhalt.
Wird die connect-Zeile auskommentiert, geht kein Fenster auf, auch nicht das erste gleich nach dem Programmstart.
Daraus schließe ich, dass die Klasse Http sofort beim konstruieren das Signal "done()" aussendet (bei "requestFinished" passiert übrigens das gleiche!).

Ich steh gerade ziemlich aufm Schlauch, warum darf ich im Konstruktor z.B. kein this->setHost() ausführen?

Danke schon mal im Voraus,
caligano

Verfasst: 14. September 2006 13:41
von gerome69
Wenn das Signal "done()" gewissermassen viel zu früh abgesendet wird, wie du beschreibst:
done() schickt doch eine boolsche Variable mit. Hat die immer den gleichen Wert zum "richtigen" und zum "falschen" Zeitpunkt?

Gruß, Bernd

Verfasst: 14. September 2006 15:32
von caligano
ja, es wird sozusagen immer done(false) abgeschickt (false = kein Fehler beim HTTP-Request )