Qt:将数据发布到服务器

时间:2016-10-06 14:57:40

标签: c++ qt http cas signals-slots

我尝试实现REST客户端,以便从我的服务器获取服务票证。对于那些不了解CAS的人:可以通过显示TGT来申请服务票。基本上可以通过成功登录来请求TGT。也许这甚至不相关。

我觉得我的连接错误了。我的服务器甚至没有对该连接作出反应,并且回复是空的。但出于某种原因,reply->error() == QNetworkReply::NoError是正确的。

我做错了什么?

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

按要求编辑 replyFinished

·H:

public slots:
     void replyFinished(QNetworkReply *);

的.cpp:

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

1 个答案:

答案 0 :(得分:3)

当回复从服务器到达时,事件循环会调用插槽replyFinished,这在您的函数validateTGT返回后很久就会发生。

manager对象收到回复,然后发出finished信号,这是调用插槽replyFinished的时间。从那里返回一个值是没有意义的。只要问问自己,谁将获得此返回值的调用函数? validateTGT已经返回,因此它没有得到任何东西。

您的广告位需要声明返回void,您应该对replyFinished广告位中的回复做任何您想做的事。

一般情况下,如果您有任何返回值的插槽,则无法检索返回值,除非此插槽被调用为普通函数(显然这不是这种情况)。