我尝试实现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());
}
答案 0 :(得分:3)
当回复从服务器到达时,事件循环会调用插槽replyFinished
,这在您的函数validateTGT
返回后很久就会发生。
manager
对象收到回复,然后发出finished
信号,这是调用插槽replyFinished
的时间。从那里返回一个值是没有意义的。只要问问自己,谁将获得此返回值的调用函数? validateTGT
已经返回,因此它没有得到任何东西。
您的广告位需要声明返回void
,您应该对replyFinished
广告位中的回复做任何您想做的事。
一般情况下,如果您有任何返回值的插槽,则无法检索返回值,除非此插槽被调用为普通函数(显然这不是这种情况)。