【问题标题】:Qt: Post data to serverQt:将数据发布到服务器
【发布时间】:2016-10-06 14:57:40
【问题描述】:

我尝试实现一个 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());
}

【问题讨论】:

  • 您应该在replyFinished 槽中调用reply->readAll(),而不是在请求之后直接调用。 Qt 中的网络请求是异步的。尝试阅读 Qt 文档和示例。一切都清楚了。
  • 谢谢。我试过了,但 replyFinished 甚至没有被调用。
  • @DennisvonEich ,我认为您应该在replyFinished 插槽中的readAll() 位置发布代码,因为此代码显然是错误的。也许你在那里犯了一些错误。
  • 好的,我加一下
  • 你有限的时间不是 SO 社区的问题。要有礼貌,人们会花时间帮助你。因此,您应该尽最大努力使您的问题完整且易于理解。

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


【解决方案1】:

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

manager 对象收到回复,然后发出finished 信号,这是调用插槽replyFinished 的时候。从那里返回一个值是没有意义的。问问自己,谁会得到这个返回值?validateTGT 已经返回了,所以它什么也没得到。

您的插槽需要声明为返回void,并且您应该对replyFinished 插槽中的回复做任何您想做的事情。

一般情况,如果你有任何返回值的槽,除非这个槽作为普通函数调用(显然这里不是这种情况),否则无法检索返回值。

【讨论】:

  • 我现在稍微编辑了我的代码。这是可编译的。我将返回更改为void。现在我将数据设置为QString。但是,serviceTicket 是空的。
  • @DennisvonEich ,您确定回复不是真的为空吗? qDebug() << replyData 给你什么?
  • 我工作的系统关闭到明天。我明天可以再工作。再次感谢你的帮助。我明天回复
  • 你也可以使用connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError)));信号,如果你使用SSLconnect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(slotSslErrors(QList<QSslError>)));connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(slotSslErrors(QList<QSslError>)));和QNetworkReply对象,别忘了删除deleteLater()作为@的回复对象987654321@说
  • 好的,现在我得到了错误。我遇到 SSL 握手错误 :(
猜你喜欢
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 2015-05-03
相关资源
最近更新 更多