Getting empty response in HTTP get request in QT QNetworkAccessManager - c++

I am doing a simple HTTP get request to www.google.co.in but I am getting empty string in response.
Here is my code:
void MainWindow::on_pushButton_clicked()
{
QNetworkAccessManager * mgr = new QNetworkAccessManager(this);
connect(mgr,SIGNAL(finished(QNetworkReply*)),this,SLOT(onfinish(QNetworkReply*)));
QUrl url("www.google.co.in");
url.setScheme("http");
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
mgr->get(QNetworkRequest(QUrl("www.google.co.in")));
}
void MainWindow::onfinish(QNetworkReply *rep)
{
QByteArray bts = rep->readAll();
QString str(bts);
qDebug() << str;
}
Output is :""
Facing same issue when doing post request to my own server.
In pro file I have done QT += core gui network

You have to add the correct URL, in addition it is recommended that you use the new connection between signals and slots, and finally you must remove the QNetworkReply:
void MainWindow::on_pushButton_clicked()
{
QUrl url("https://www.google.co.in/");
QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
connect(mgr,&QNetworkAccessManager::finished,this,&MainWindow::onfinish);
mgr->get(QNetworkRequest(url));
}
void MainWindow::onfinish(QNetworkReply *rep)
{
QByteArray bts = rep->readAll();
QString str(bts);
qDebug() << str;
rep->deleteLater();
}

Related

Parsing youtube with QNetworkAccessManager

I want to extract informations from youtube using Qt (QNetworkAccessManager). While the code below works with other websides, i dont get any data from youtube. Any idea what the configuration of QNetworkRequest should be?
PS. Yes i know i can achieve it by using YoutubeApi.
Youtube::Youtube(QObject *parent) : QObject(parent)
{
manager = new QNetworkAccessManager(this);
QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(readyRead(QNetworkReply*)));
}
void Youtube::makeRequest()
{
qDebug() << "YOUTUBE::makeRequest()";
request.setUrl(QUrl("www.youtube.com/"));
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");
manager->get(request);
}
void Youtube::readyRead(QNetworkReply *replay)
{
qDebug() << replay->readAll();
QByteArray dataTemp = replay->readAll();
website = dataTemp.toStdString();
}
You can try this to get info about a video and store in a QJsonDocument object:
QNetworkAccessManager* net = new QNetworkAccessManager(this);
net->get(QNetworkRequest(QUrl("https://noembed.com/embed?
url=https://www.youtube.com/watch?v=dQw4w9WgXcQ")));
connect(net, &QNetworkAccessManager::finished,[](QNetworkReply* reply)
{
QString output = reply->readAll();
QJsonDocument doc;
QJsonParseError errorPtr;
doc = QJsonDocument::fromJson(output.toUtf8(), &errorPtr);
if(! doc.isNull())
{
QJsonObject videoInfoJson = doc.object();
qDebug() <<videoInfoJson.value("title").toString();
}
});

Unable to login using qtnetworkaccessmanager but able using postman tool

I am using qnetworkaccessmanager to login to a website, i am setting user and password in rowHeader but getting empty response in code, but the same request with user and password set in header works properly using Postman tool, can anyone suggest what could be the issue ?
QString user = "user";
QString pass = "testPassword";
QByteArray data1 = user.toLocal8Bit().toBase64();
QByteArray data2 = pass.toLocal8Bit().toBase64();
QNetworkRequest request = QNetworkRequest(QUrl("http://server_address/b1/login"));
request.setRawHeader("user", data1);
request.setRawHeader("password", data2);
QNetworkReply *reply = manager->get(request);
and i am fetching reply using below code -
manager = new QNetworkAccessManager();
QObject::connect(manager, &QNetworkAccessManager::finished,
this, [=](QNetworkReply *reply) {
if (reply->error()) {
qDebug() << reply->errorString();
return;
}
QString answer = QString::fromUtf8(reply->readAll());
qDebug() << answer;
bool isFinished = reply->isFinished();
bool isRunning = reply->isRunning();
QNetworkReply::NetworkError err = reply->error();
QByteArray bts = reply->readAll();
QString str(bts);
qDebug() << str;
Below is the postman screenshot with headers
QString user = "testUser"; // Use same "user" value as you used in your Postman example
QString pass = "testPassword";
QByteArray data1 = user.toLocal8Bit(); // Remove toBase64()
QByteArray data2 = pass.toLocal8Bit(); // Remove toBase64()
QNetworkRequest request = QNetworkRequest(QUrl("http://server_address/b1/login"));
request.setRawHeader("user", data1);
request.setRawHeader("password", data2);
QNetworkReply *reply = manager->get(request);

Download a file using http client from ftp server

I have an existing C++/Qt source code for the firmware update. HTTP client used to download the file.
This piece of code works fine if I'll provide http://<path to file>
But http client failed to download from ftp://<path to down load>. It shows downloaded file size zero with ftp.
As per StackOverflow, It should work for for both. I try to use setScheme("ftp") and other small changes. But does not work.
void HttpClient::onDownloadProgress(qint64 bytesReceived,
qint64 bytesTotal)
{
emit downloadUpdateProgress(
static_cast<int>((bytesReceived * 1.0f / bytesTotal * 1.0f) * 100));
}
void HttpClient::onReadyRead()
{
auto reply = qobject_cast<QNetworkReply *>(QObject::sender());
if (reply) {
QNetworkRequest request(reply->request());
auto device = qobject_cast<QIODevice *>(request.originatingObject());
if (device) {
device->write(reply->readAll());
}
}
}
bool HttpClient::post(const QUrl &url, const QByteArray &data,
QIODevice *device)
{
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded");
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute,
QNetworkRequest::AlwaysNetwork);
request.setSslConfiguration(getSslConfig());
request.setOriginatingObject(device);
QNetworkReply *reply = _networkAccessManager->post(request, data);
connect(reply, &QNetworkReply::readyRead, this, &HttpClientImpl::onReadyRead);
bool result = waitForFinished(reply, 30 * 1000);
return result;
}
bool HttpClientImpl::get(const QUrl &url, QIODevice *device)
{
QNetworkRequest request(url);
request.setSslConfiguration(getSslConfig());
request.setOriginatingObject(device);
QNetworkReply *reply = _networkAccessManager->get(request);
connect(reply, &QNetworkReply::downloadProgress, this,
&HttpClientImpl::onDownloadProgress);
connect(reply, &QNetworkReply::readyRead, this, &HttpClientImpl::onReadyRead);
bool result = waitForFinished(reply);
return result;
}
It should download the correct file size.

create a http communication on blackberry 10 cascade

I'm newbie on development blackberry 10 cascades. I need to use httpget to connect on file xml and get dat from it to display it on list.
There is an example can help me to make http communication or a tutoriel?
All the links for http communication like this https://developer.blackberry.com/cascades/documentation/device_platform/networking/tutorial_http_comm.html didn't work I get 404
Use QNetworkAccessManager, QNetworkRequest and QNetworkReply classes to make http connection.
QNetworkAccessManager* netManager = new QNetworkAccessManager();
QUrl myurl(yourURL);
QNetworkRequest req(url);
QNetworkReply* ipReply = netManager->get(req);
connect(ipReply, SIGNAL(finished(QNetworkReply*)), this, SLOT(onReply(QNetworkReply*)));
}
In onReply slot parse your response
if (reply) {
if (reply->error() == QNetworkReply::NoError) {
int available = reply->bytesAvailable();
if (available > 0) {
int bufSize = sizeof(char) * available + sizeof(char);
QByteArray buffer(bufSize, 0);
int read = reply->read(buffer.data(), available);
response = QString(buffer);
}
} else {
response =
QString("Error: ") + reply->errorString()
+ QString(" status:")
+ reply->attribute(
QNetworkRequest::HttpStatusCodeAttribute).toString();
}
reply->deleteLater();
}
Visit this page for more information
use this code...
QNetworkAccessManager* netManager = new QNetworkAccessManager();
QUrl myurl("http://******");
QNetworkRequest req(myurl);
QNetworkReply* ipReply = netManager->get(req);
QEventLoop eventLoop;
QObject::connect(ipReply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec();
std::cout << "finished" << std::endl; //request finished here
requestFinished(ipReply);

How can I use Qt to get html code of the redirected page?

I'm trying to use Qt to download the html code from the following url:
http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=nucleotide&cmd=search&term=AB100362
this url will re-direct to
www.ncbi.nlm.nih.gov/nuccore/27884304
I try to do it by following way, but I cannot get anything.
it works for some webpage such as www.google.com, but not for this NCBI page. is there any way to get this page??
QNetworkReply::NetworkError downloadURL(const QUrl &url, QByteArray &data)
{
QNetworkAccessManager manager;
QNetworkRequest request(url);
QNetworkReply *reply = manager.get(request);
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
if (reply->error() != QNetworkReply::NoError)
{
return reply->error();
}
data = reply->readAll();
delete reply;
return QNetworkReply::NoError;
}
void GetGi()
{
int pos;
QString sGetFromURL = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi";
QUrl url(sGetFromURL);
url.addQueryItem("db", "nucleotide");
url.addQueryItem("cmd", "search");
url.addQueryItem("term", "AB100362");
QByteArray InfoNCBI;
int errorCode = downloadURL(url, InfoNCBI);
if (errorCode != 0 )
{
QMessageBox::about(0,tr("Internet Error "), tr("Internet Error %1: Failed to connect to NCBI.\t\nPlease check your internect connection.").arg(errorCode));
return "ERROR";
}
}
That page appears to have a redirect.
From the Qt docs for 4.6:
Note: When the HTTP protocol returns a
redirect no error will be reported.
You can check if there is a redirect
with the
QNetworkRequest::RedirectionTargetAttribute
attribute.