2016-08-31 4 views
0

私はQNetworkReplyを使用してルータインターフェイスに簡単なGET要求を発行しています。基本的に、投稿データが空の場合はGETを発行します。それ以外の場合はPOSTを発行します。のは、私はUIの答えを示してQNetworkReplyの動作は、ローカルサイトの認証で

... 
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()); 
    } 
} 

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); 
} 

今GETに固執してみましょう。 今、ローカルインタフェースはログインとpwを要求します。問題は、GETコマンドを使用して取得したテキストが、ユーザーが間違ったパスワードを入力した場合に表示されるテキストであることです(認証が失敗しました。もう一度やり直してください)。 さらに、コードnam-> head(request)でヘッダを取得できるはずですが、replyAllの内容は空です。

アイデア?

+1

あなたのリクエストにルータのユーザ名/パスワードを送信していますか?ルータでHTTP基本認証が使用されている場合は、[この回答](https://stackoverflow.com/a/1700751/2666212)を参照してください。 – Mike

+0

@Mikeコードでは、paras変数が空の場合は何も送信しないことがはっきりとわかります。私が言ったように、それはちょうどGET要求です – user217354

+0

それが何であれ、あなたはルータに自分自身を認証する必要があります。私の前のコメントにリンクされた答えに指定されたヘッダーを送ろうとしてください。 – Mike

答えて

0

nam->head(request)の後にreply->readAll()を使用する必要はありません。あなたはhead要求の内容を表示することができ、この方法では

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

: この代わりに次のようなメソッドを使用する必要があります。

また、サンプルコードにメモリリークがあります。 finishedスロット内の返信メッセージreply->deleteLater()を削除する必要があります。

+0

クッキーの問題かもしれませんか? QNetworkManagerはCookieハンドラを実装していますか? – user217354

+0

@ user217354これはルータによって異なります。 Web管理インターフェースがHTTP基本認証を使用する場合、Cookieは必要ありません。あなたが行うすべてのリクエストに 'Authorization'ヘッダーを送信するだけです。クッキーを使用する場合は、最初にユーザ名/パスワードを 'POST 'する必要があります。同じ' QNetworkAccessManager'を使用している限り、Web管理にアクセスできます。ここでも、すべてはルータが使用する方法に依存します。 。 。 – Mike

関連する問題