如何使用 Qt 发送 REST 调用?
How to send a REST call with Qt?
我已经开始使用 Qt 框架,在阅读了 Qt5 的文档和一些博客中的一些示例后,我编写了以下程序,但我似乎没有做正确的工作。
我正在编写一个 class,我需要为其编写方法登录和注销。
对于登录方法,我正在编写以下代码:
void User::login()
{
const QUrl loginUrl = (this->m_url).append("/api/auth/login");
QNetworkRequest loginRequest;
loginRequest.setUrl(loginUrl);
loginRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QJsonObject body;
QJsonObject data;
data.insert("userName", this->m_userName);
data.insert("password", this->m_password);
body.insert("data", data);
body.insert("provider", "LDAP");
//loginRequest.setBody(QJsonDocument(body).toJson());
const QByteArray json = QJsonDocument(body).toJson();
QNetworkReply* reply = m_manager.post(loginRequest, QJsonDocument(body).toJson());
while (!reply->isFinished())
{
// wait for the request to complete
}
QByteArray response_data = reply->readAll();
QJsonDocument responseJson = QJsonDocument::fromJson(response_data);
reply->deleteLater();
std::cout << response_data.toStdString() << std::endl;
}
在我的主函数中调用这个方法后,如果我检查fiddler,我也看不到任何请求,程序进入死循环。你能告诉我哪里出了问题吗?
原因
如你所说,程序进入死循环。您创建的那个:
while (!reply->isFinished())
{
// wait for the request to complete
}
简单地说,使用 QNetworkReply* reply = m_manager.post(loginRequest, QJsonDocument(body).toJson());
您不发送请求,而只是声明您这样做的意愿。紧接着你阻塞了事件循环,让 Qt 没有机会实现你的愿望。
解决方案
按预期使用信号和槽。将团队视为事件和回调。一个好的起点是 QNetworkAccessManager
:
的描述
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished,
this, &MyClass::replyFinished);
我已经开始使用 Qt 框架,在阅读了 Qt5 的文档和一些博客中的一些示例后,我编写了以下程序,但我似乎没有做正确的工作。
我正在编写一个 class,我需要为其编写方法登录和注销。 对于登录方法,我正在编写以下代码:
void User::login()
{
const QUrl loginUrl = (this->m_url).append("/api/auth/login");
QNetworkRequest loginRequest;
loginRequest.setUrl(loginUrl);
loginRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QJsonObject body;
QJsonObject data;
data.insert("userName", this->m_userName);
data.insert("password", this->m_password);
body.insert("data", data);
body.insert("provider", "LDAP");
//loginRequest.setBody(QJsonDocument(body).toJson());
const QByteArray json = QJsonDocument(body).toJson();
QNetworkReply* reply = m_manager.post(loginRequest, QJsonDocument(body).toJson());
while (!reply->isFinished())
{
// wait for the request to complete
}
QByteArray response_data = reply->readAll();
QJsonDocument responseJson = QJsonDocument::fromJson(response_data);
reply->deleteLater();
std::cout << response_data.toStdString() << std::endl;
}
在我的主函数中调用这个方法后,如果我检查fiddler,我也看不到任何请求,程序进入死循环。你能告诉我哪里出了问题吗?
原因
如你所说,程序进入死循环。您创建的那个:
while (!reply->isFinished())
{
// wait for the request to complete
}
简单地说,使用 QNetworkReply* reply = m_manager.post(loginRequest, QJsonDocument(body).toJson());
您不发送请求,而只是声明您这样做的意愿。紧接着你阻塞了事件循环,让 Qt 没有机会实现你的愿望。
解决方案
按预期使用信号和槽。将团队视为事件和回调。一个好的起点是 QNetworkAccessManager
:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished,
this, &MyClass::replyFinished);