Seite 1 von 2
QTcpServer als ein HTTPServer + POST Requests
Verfasst: 27. Mai 2008 15:17
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):
Wie kann ich Zugriff auf die POST Variablen nehmen?
Regards
NoRulez
Verfasst: 27. Mai 2008 15:46
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?
Verfasst: 27. Mai 2008 15:48
von NoRulez
Das war auch für einen GET Request
Lg
Verfasst: 27. Mai 2008 16:19
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
Verfasst: 27. Mai 2008 17:48
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.
Verfasst: 27. Mai 2008 18:47
von NoRulez
OK habs rausgefunden, und zwar lese ich im Code im moment nur eine Zeile
gehört umgebessert auf:
und schon funktionierts

Verfasst: 27. Mai 2008 19:46
von Maxima
Wie sieht dann die Ausgabe aus? Just curious.
Verfasst: 27. Mai 2008 20:44
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
Verfasst: 27. Mai 2008 21:33
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"

Verfasst: 27. Mai 2008 23:04
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.
Verfasst: 27. Mai 2008 23:23
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.
Verfasst: 27. Mai 2008 23:27
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.
Verfasst: 27. Mai 2008 23:29
von NoRulez
Maxima hat geschrieben:
In jedem Fall super, daß es jetzt geht (Freue mich schon auf ein; "powert by NoRulez-server"


Werde in falls er fertig wird auf keinem Fall der OpenSource Gemeinde fern halten
Lg
Verfasst: 27. Mai 2008 23:33
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
Verfasst: 27. Mai 2008 23:34
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