【发布时间】: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