I have started started working with Qt framework and after reading the documentation for Qt5 and some examples across some blogs, I wrote the following program but I does not seem to do the correct job.
I am writing a class for which I need to write a method Login and logout. For login method, I am writing following code:
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;
}
After I call this method in my main function, If I check in fiddler, I cannot see any request made also, the program goes into infinite loop. Can you tell me what is wrong?
As you say, the program goes into infinite loop. The very one you have created:
while (!reply->isFinished())
{
// wait for the request to complete
}
Simply put, with QNetworkReply* reply = m_manager.post(loginRequest, QJsonDocument(body).toJson());
you do not send a request, but merely declare your wish to do so. Right after that you block the event loop, leaving Qt no chance to fulfill your wish.
Use signals and slots as intended. Think about team as events and callbacks. A good starting point is the description of QNetworkAccessManager
:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished,
this, &MyClass::replyFinished);