2016-10-06 12 views
-1

Ich versuche einen REST-Client zu implementieren, um ein Service Ticket von meinem Server zu bekommen. Für diejenigen von Ihnen, die CAS nicht kennen: Ein Service Ticket kann angefordert werden, indem man ein TGT zeigt. Das TGT kann grundsätzlich durch eine erfolgreiche Anmeldung angefordert werden. Vielleicht ist das nicht einmal relevant.Qt: Daten an den Server senden

Ich quess Ich habe einen Fehler in meiner Verbindung. Mein Server reagiert nicht einmal auf diese Verbindung und die Antwort ist leer. Aus irgendeinem Grund ist reply->error() == QNetworkReply::NoError jedoch wahr.

Was mache ich falsch?

bool Client::validateTGT(QString const & tgt) const 
{ 
    bool isValid = false; 
    QUrl url = QUrl("https://localhost:8943/cas/v1/tickets/" + tgt); 

    QUrl postData; 
    postData.addQueryItem("service", "https://test.de"); 

    QNetworkRequest request(url);  
    request.setHeader(QNetworkRequest::ContentTypeHeader, 
         "application/x-www-form-urlencoded"); 

    //QNetworkAccessManager *networkManager = new QNetworkAccessManager(); 
    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), 
        this, SLOT(replyFinished(QNetworkReply*)), Qt::AutoConnection); 
    QNetworkReply *reply = manager->post(request, postData.encodedQuery()); 
    QByteArray replyData = reply->readAll(); 
    QString s_data = QString::fromAscii(replyData.data()); 
    if (reply->error() == QNetworkReply::NoError) 
    { 
     isValid = true; 
    } 
    return isValid; 
} 

EDIT:replyFinished wie gewünscht

.h:

public slots: 
    void replyFinished(QNetworkReply *); 

CPP:

void CCASRESTClient::replyFinished(QNetworkReply *reply) 
{ 
    QByteArray replyData = reply->readAll(); 
    serviceTicket = QString::fromAscii(replyData.data()); 
} 
+0

Sie sollten 'reply-> readAll()' im 'replyFinished'-Slot aufrufen, nicht direkt nach Anforderung. Netzwerkanforderungen in Qt sind asynchron. Versuchen Sie, Qt-Dokumentation und Beispiele zu lesen. Da ist alles klar. –

+0

Danke. Ich habe es versucht, aber "replyFinished" wird nicht einmal aufgerufen. – Goldi

+0

@DennisvonEich, ich denke, dass Sie den Code, wo Sie die 'readAll()' in den 'replyFinished'-Steckplatz haben sollten, da dieser Code offensichtlich falsch ist. Vielleicht hast du dort einen Fehler gemacht. – Mike

Antwort

3

Der Schlitz replyFinished durch die Ereignisschleife aufgerufen wird, wenn die Antwort ist vom Server angekommen, thi s passiert weit nach Ihrer Funktion validateTGT ist zurückgekehrt.

Das Objekt manager empfängt die Antwort und gibt dann das Signal finished aus, wenn der Steckplatz replyFinished aufgerufen wird. Es macht keinen Sinn, einen Wert von dort zurückzugeben. Fragen Sie sich einfach, wer ist die Anruferfunktion, die diesen Rückgabewert erhalten wird?validateTGT ist schon zurückgekommen, somit bekommt es nichts.

Ihr Steckplatz muss deklariert werden, um void zurückzugeben, und Sie sollten tun, was auch immer Sie mit der Antwort in Ihrem replyFinished-Steckplatz tun möchten.

Im Allgemeinen, wenn Sie einen Steckplatz haben, der einen Wert zurückgibt, kann der Rückgabewert nicht abgerufen werden, es sei denn, dieser Steckplatz wurde als normale Funktion aufgerufen (offensichtlich ist dies hier nicht der Fall).

+0

Ich habe meinen Code jetzt ein wenig bearbeitet. Dies ist kompilierbar. Ich habe die Rückkehr auf "void" geändert. Und jetzt setze ich die Daten auf einen 'QString'.'ServiceTicket' ist jedoch leer. – Goldi

+0

@DennisvonEich, bist du sicher, dass die Antwort nicht wirklich leer ist? Was gibt 'qDebug() << replyData' dir? – Mike

+0

Das System, an dem ich arbeite, wird bis morgen abgeschaltet. Ich kann morgen wieder daran arbeiten. Danke nochmal für deine Hilfe. Ich werde morgen antworten – Goldi

Verwandte Themen