2016-08-31 2 views
0

Ich verwende QNetworkReply, um eine einfache GET-Anfrage an meine Router-Schnittstelle auszugeben. Grundsätzlich, wenn die Postdaten leer sind, erstelle ich ein GET, sonst werde ich einen POST ausgeben. Bleiben wir mit dem GETQNetworkReply Verhalten gegen lokale Site mit Authentifizierung

QString url=ui->lineEdit_url->text(); 
QString paras=ui->pTextEdit_paras->toPlainText(); 
qDebug()<< "paras" << paras; 
QByteArray post_data; 
post_data.append(paras); 
QNetworkRequest request = QNetworkRequest(QUrl(url)); 
request.setRawHeader("Content-Type", "application/x-www-form-urlencoded"); 
if(post_data.isEmpty()) 
{ 
    //nam->head(request); 
    nam->get(request); 
} 
else 
{ 
    nam->post(request,post_data); 
} 

jetzt mit

... 
connect(nam, 
     SIGNAL(finished(QNetworkReply*)), 
     this, 
     SLOT(finished(QNetworkReply*))); 
... 

void HttppostWindow::finished(QNetworkReply *reply) 
{ 
    if(reply->error() == QNetworkReply::NoError) 
    { 
     ui->textEdit_result->setText(QObject::tr(reply->readAll())); 
    } 
    else 
    { 
     ui->textEdit_result->setPlainText(reply->errorString()); 
    } 
} 

zeige ich die Antwort in der ui. Im Moment fragt die lokale Schnittstelle nach einem Login und einem Passwort. Das Problem besteht darin, dass der abgerufene Text mit dem Befehl GET derjenige ist, den die Schnittstelle anzeigen würde, wenn der Benutzer ein falsches Kennwort eingegeben hätte (Authentisierung fehlgeschlagen, bitte versuchen Sie es erneut usw.). Außerdem sollte ich mit dem Code nam-> head (request) den Header abrufen können, aber der Inhalt von replyAll ist leer.

Irgendwelche Ideen?

+1

Senden Sie den Benutzernamen/das Passwort des Routers in Ihrer Anfrage? Wenn Ihr Router die HTTP-Standardauthentifizierung verwendet, lesen Sie [diese Antwort] (https://Stackoverflow.com/a/1700751/2666212), um Informationen dazu zu erhalten. – Mike

+0

@Mike Nun, im Code ist deutlich sichtbar, dass ich nichts sende, wenn die Variable paras leer ist. Wie ich sagte, es ist nur eine GET-Anfrage – user217354

+0

Was auch immer Anfrage ist, müssen Sie sich an den Router authentifizieren. Versuchen Sie, den Header zu senden, der in der Antwort angegeben wurde, die in meinem vorherigen Kommentar verlinkt ist. – Mike

Antwort

0

Nach nam->head(request) müssen Sie reply->readAll() nicht verwenden. dieser Stattdessen sollten Sie Methoden verwenden wie:

QByteArray rawHeader(const QByteArray &headerName) const; 
QList<QByteArray> rawHeaderList() const; 
const QList<RawHeaderPair> &rawHeaderPairs() const; 

Mit diesen Methoden können Sie den Inhalt Ihrer head Anfrage anzuzeigen.

Auch Ihr Beispielcode weist Speicherverlust auf. Sie sollten die Antwort whis reply->deleteLater() in Ihrem finished Steckplatz löschen.

+0

Könnte es sich um Cookies handeln? Implementiert QNetworkManager einen Cookie-Handler? – user217354

+0

@ user217354, das hängt von Ihrem Router ab. Wenn die Web-Verwaltungsschnittstelle die HTTP-Standardauthentifizierung verwendet, benötigt sie keine Cookies. Sie müssen lediglich den Header "Authorization" bei jeder Anfrage senden. Wenn Cookies verwendet werden, müssen Sie möglicherweise zuerst Ihren Benutzernamen/Ihr Passwort "POST" eingeben, dann haben Sie Zugriff auf das Web-Management, solange Sie denselben "QNetworkAccessManager" verwenden. Auch hier kommt es auf die Methode an, die der Router verwendet. . . – Mike

Verwandte Themen