Http Post um Forumulardaten zu übertragen

Alles rund um die Programmierung mit Qt
Antworten
ChristianB
Beiträge: 3
Registriert: 1. Dezember 2009 14:58

Http Post um Forumulardaten zu übertragen

Beitrag von ChristianB »

Hallo,

habe leider im Forum kein passendes Thema oder welche mit keinen vernünftigen Antworten gefunden.

Ich möchte eine Post-Request an ein Script im Web stellen.
Das ist soweit auch kein Problem. Jetzt habe ich allerdings das Problem das ich nicht weiß wie ich Parameter(QuerryString) mit übergeben soll.

Mein Script lässt sich entweder nicht compilieren oder stürzt beim ausführen des "requests" ab.

Habe es zum einem so versucht. (Programm stürzt beim ausführen dieser Funktion ab)

Code: Alles auswählen

QUrl url("http://www.xxx.de/xxx.cgi");

    QHttpRequestHeader header("POST", url.path());
    http->setHost(url.host());

    header.setValue("Host", url.host());
    header.setValue( "User-Agent", "User Agent");
    header.setValue("Content-Type", "application/x-www-form-urlencoded");
    buffer = new QBuffer(bytes);
    bytes->append("?do=hallo");
    buffer = new QBuffer(bytes);

    resultFile = "result.html";
    logFile = new QFile(resultFile);
    logFile->open(QIODevice::ReadWrite);
    httpPostId = http->request(header, buffer, logFile);
Ein weiterer Versuch:

Code: Alles auswählen

QUrl url("http://www.xxx.de/xxx.cgi?do=hallo");
    QString fileName = "ausgabe.txt";
    QFile::remove(fileName);
    file = new QFile(fileName);

   QHttp::ConnectionMode mode = url.scheme().toLower() == "https" ? QHttp::ConnectionModeHttps : QHttp::ConnectionModeHttp;
     http->setHost(url.host(), mode, url.port() == -1 ? 0 : url.port());

   QByteArray path = QUrl::toPercentEncoding(url.path(), "!$&'()*+,;=:@/");
    if (path.isEmpty())
         path = "/";
  
   http->Greget(path,file);
Hier wäre ja das Problem das ich den Post-Request nur an den Pfad mache.

Kann mir jemand ein ganz simples Beispiel mit einem Post-Request(bei dem Variablen übergeben werden) zeigen oder mir erklären was ich falsch mache? Werde aus den Dokumentationen von Qt nicht schlau.

Vielen Dank schonmal.

mfg
Christian
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

So hab ichs gemacht:

Code: Alles auswählen

   QNetworkRequest lastRequest(QUrl(url));
   lastRequest.setRawHeader("Authorization", authToken);
   lastRequest.setRawHeader("GData-Version", "2");

   manager->post(lastRequest, data);
manager ist eine Instanz von QNetworkAccessManager, data ist ein QByteArray. Der Inhalt von data ist nach dem Schema "name=wert&name2=wert2" aufgebaut (ohne führendes '?').

data habe ich noch ein kleines bisschen gewrappt, was die Handhabung erleichtert.

Hoffe das hilft.
ChristianB
Beiträge: 3
Registriert: 1. Dezember 2009 14:58

Beitrag von ChristianB »

Vielen Dank hat mir einen guten Denkanstoß gegeben.

Mache es zwar anders aber das funktioniert auch wunderbar.
z.b:

Code: Alles auswählen

    QUrl url("http://www.test.de/user/?do=hallo");
    QNetworkRequest request(url);

    sessionreply = session->get(request);
....
//Requestfinished

    //Ergebnis:
    ui->ergebnisLabel->setText(sessionreply->readAll());
Habe jedoch eine weiter Frage wie verarbeite ich das wenn ich über die Url und einigen Parametern , z.b eine Text oder Pdf-Datei aufrufen oder halt direkt runterladen möchte? Wenn ich einfach die erforderlichen Parameter anhänge weiß ich nicht was ich mit dem Reply machen soll.

Hoffe mir kann jemand helfen.

mfg
Christian
ChristianB
Beiträge: 3
Registriert: 1. Dezember 2009 14:58

Beitrag von ChristianB »

Entschuldigung für den Doppelpost aber der Editieren-Button möchte irgendwie nicht.

Habe jetzt gestern noch einige versucht um eine Pdf-Datei die ich über ein Webscript abrufe zu speichern komme aber kein Stück weiter geschweige denn zu einem Erfolg.

Hab zum Testen mal das probiert um Fehler im Webscript auszuschließen.

Code: Alles auswählen

pdf = new QNetworkAccessManager(this);
...
QUrl url("www.go4.de/pdftest.pdf");
    QNetworkRequest request(url);
pdfreply = pdf->get(request);
Dies hab ich dann versucht mit einem Filestream zu speicher:
Das war aber mehr ein verzweifelter Versuch anstatt einer Lösung.

Code: Alles auswählen

fstream file("test.pdf" ,ios::out);
    
    file.write(pdfreply->readAll(),sizeof(pdfreply->readAll()));
(Dabei kommt in der Datei garnichs oder nur so 3 zeichen raus)

Hoffe mir kann einer einen Lösungsvorschlag zeigen.
Oder mir einen Denkanstoß geben.

mfg
Christian

EDIT: Habe es jetzt hinbekommen eine Pdf-Datei herunterzuladen (das sizeof war zuviel).

Habe nun aber das Problem das die Pdf-Datei im Reader leer ist. Sie hat aber die richtige größe und im Win-Editor oder Hexeditor werden Daten angezeigt.

Hoffe ihr könnt mir sagen wo mein Fehler liegt.

mfg
Christian
Antworten