QTcpServer als ein HTTPServer + POST Requests

Alles rund um die Programmierung mit Qt
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

QTcpServer als ein HTTPServer + POST Requests

Beitrag von NoRulez »

Hey @all,

Ich benutze QTcpServer als meinen HTTPServer. Wenn ich ein HTTP GET Request bekomme funktioniert alles prima, aber wie arbeite ich HTTP POST Requests ab?

Hier der code den ich zum lesen vom Client verwende:

Code: Alles auswählen

void HttpServer::readClient() {
    if (disabled)
        return;

    QTcpSocket* socket = (QTcpSocket*)sender();
    if (socket->canReadLine()) {
        QStringList tokens = QString(socket->readLine()).split(QRegExp("[ \r\n][ \r\n]*"));

        qDebug() << "QStringList ---------";
        for (QList<QString>::iterator i = tokens.begin(); i != tokens.end(); ++i)
            qDebug() << (*i);
    }
}
So sieht bei mir ein GET Request aus(http://127.0.0.1:84/index.html?firstnam ... Mustermann):

Code: Alles auswählen

QStringList ---------
"GET"
"/index.html?firstname=Max&lastname=Mustermann"
"HTTP/1.1"
""
Und so ein POST REQUEST (http://127.0.0.1:84/index.html):

Code: Alles auswählen

QStringList ---------
"POST"
"/"
"HTTP/1.0"
""
Wie kann ich Zugriff auf die POST Variablen nehmen?

Regards
NoRulez
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

"http://127.0.0.1:84/index.html?firstnam ... Mustermann"

Die Variablen hinter index.html haben nichts mit POST zu tun. Verwechselst du vielleicht etwas?
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

PeterLustig hat geschrieben:"http://127.0.0.1:84/index.html?firstnam ... Mustermann"

Die Variablen hinter index.html haben nichts mit POST zu tun. Verwechselst du vielleicht etwas?
Das war auch für einen GET Request

Lg
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Tut mir leid, das hab ich missverstanden...

Einen eigenen HTTP Server via QTcpServer zu bauen ist schon ne harte Sache.. Wie das mit den Post Variablen geht, weiß ich nicht. Aber hier stehen alle Informationen, die du für einen HTTP Server benötigst, drin:
http://www.faqs.org/rfcs/rfc2616.html
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Ich vermute an Deinem POST-Request stimmt noch was nicht.

Siehe das Beispiel hier:
http://de.wikipedia.org/wiki/Hypertext_ ... #HTTP_POST

So kenne ich es eigentlich auch, die POST-Variablen hängen im Header als "Key=Value"-Paare mit drin und können mit nem QRegExp ganz einfach ausgefiltert werden.
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

OK habs rausgefunden, und zwar lese ich im Code im moment nur eine Zeile

Code: Alles auswählen

if (socket->canReadLine()) { 
gehört umgebessert auf:

Code: Alles auswählen

while (socket->canReadLine()) { 
und schon funktionierts :-)
Maxima
Beiträge: 27
Registriert: 23. Mai 2008 03:45

Beitrag von Maxima »

Wie sieht dann die Ausgabe aus? Just curious.
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

So wie es sollte ;-)

Code: Alles auswählen

Method:  "POST"
Path:  "/"
Content-Type:  "text/xml"
VerMaj:  1
VerMin:  0
Keys:  "Host,User-agent,Content-type,Content-length,SOAPAction"
MessageBody:  "<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/env
elope/" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body>
<dispatch SOAP-ENC:root="1">
<v1 href="#i1"/>
<v2 href="#i2"/>
<v3 href="#i3"/>
</dispatch>
<v1 xsi:type="xsd:string" id="i1" SOAP-ENC:root="0">GameHandle</v1>
<v2 xsi:type="xsd:string" id="i2" SOAP-ENC:root="0">multiy</v2>
<v3 SOAP-ENC:arrayType="xsd:ur-type[5]" xsi:type="SOAP-ENC:Array" SOAP-ENC:root="0" id="i3">
<item xsi:type="xsd:int">1</item>
<item xsi:type="xsd:int">2</item>
<item href="#i4"/>
<item href="#i4"/>
<item href="#i4"/>
</v3>
<item xsi:type="xsd:string" id="i4" SOAP-ENC:root="0">multi</item>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
"
Lg
Maxima
Beiträge: 27
Registriert: 23. Mai 2008 03:45

Beitrag von Maxima »

Danke!

fehlt "index.html"? der path "/" ist ja da.
Meine Erfahrungen beschränken sich auf Client-Seite, QHttp und GET, an das POST habe ich mich noch nicht "herangetraut" und war auch nicht nötig.

Ich dachte mit dem POST muß auch eine uri ankommen, sonst weiß der server ja nicht wo es hingehört; hab gerade noch mal in die rfc gesehen, aber wieder fast nix verstanden.

In jedem Fall super, daß es jetzt geht (Freue mich schon auf ein; "powert by NoRulez-server" :D
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Maxima hat geschrieben:fehlt "index.html"? der path "/" ist ja da.
index.html würde zum Pfad dazugehören. "/index.html". Aber in dem Fall wurde einfach der Pfad "/" aufgerufen. HTTP Server übermitteln dann meistens die Datei unter einem Default Wert wie index.html.
Maxima
Beiträge: 27
Registriert: 23. Mai 2008 03:45

Beitrag von Maxima »

PeterLustig hat geschrieben:index.html würde zum Pfad dazugehören. "/index.html". Aber in dem Fall wurde einfach der Pfad "/" aufgerufen. HTTP Server übermitteln dann meistens die Datei unter einem Default Wert wie index.html.
Ich dachte das gilt für das GET, daß aber für das POST ein "index.html" oder "bild.jpg" dazugehört, weil man ja möchte das die daten dahin gepostet werden.
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Das POST-Request muss ja auch irgendeine Datei aufrufen, und im üblichen die Datei, die auch die übermittelten Informationen verwertet.
Ein POST-Request ist ja im Grunde dasselbe wie ein GET-Request, nur das eben noch zusätzlich Informationen außerhalb des Pfades übergeben werden.
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Maxima hat geschrieben: In jedem Fall super, daß es jetzt geht (Freue mich schon auf ein; "powert by NoRulez-server" :D
;-) Werde in falls er fertig wird auf keinem Fall der OpenSource Gemeinde fern halten

Lg
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Ich möchte einen Elan nicht ausbremsen so etwas zu entwickeln, sondern nur zusätzlich den Blick auf weiteres vielversprechendes Projekt lenken:
Das Team von Qxt arbeitet ebenfalls an einem Webservice
http://docs.libqxt.org/group__QxtWeb.html
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

PeterLustig hat geschrieben:Das POST-Request muss ja auch irgendeine Datei aufrufen, und im üblichen die Datei, die auch die übermittelten Informationen verwertet.
Ein POST-Request ist ja im Grunde dasselbe wie ein GET-Request, nur das eben noch zusätzlich Informationen außerhalb des Pfades übergeben werden.
Nicht ganz, in einem GET definierst Du die Variablen und Werte mittels Key/Values ála key1=value1&key2=value2.
Im Gegensatz zum GET wird beim POST nach dem Header im Prinzip alles als Daten verwertet - Eben die Länge von Content-Length. Ob das jetzt eine Datei ist, oder ob Du darin auch Deine Key/Value Paare zusammen stöpselst bleibt Dir überlassen.

Lg NoRulez
Antworten