Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Qt下生成HTTP GET_Qt_Http_Networking_Request - Fatal编程技术网

在Qt下生成HTTP GET

在Qt下生成HTTP GET,qt,http,networking,request,Qt,Http,Networking,Request,我有一种n00b问题,我似乎无法从我的Qt代码中发出HTTP GET请求 下面是应该起作用的代码: void MainWindow::requestShowPage(){ QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestReceived(QNetworkReply*)

我有一种n00b问题,我似乎无法从我的Qt代码中发出HTTP GET请求

下面是应该起作用的代码:

void MainWindow::requestShowPage(){
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestReceived(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://google.com")));
}

void MainWindow::requestReceived(QNetworkReply* reply){
    QString replyText;
    replyText.fromAscii(reply->readAll());

    ui->txt_debug->appendPlainText(replyText);
}
但问题是这根本不起作用:在
requestReceived(QNetworkReply*reply)
中,
replyText
似乎是空的,
reply->error()
返回
0
reply->errorString()
返回“未知错误”。我真的不知道现在该做什么

有什么想法吗?

如果
reply->error()
=0,则表示请求成功。事实上,您的代码对我来说似乎是正确的,我唯一不同的做法是读取数据。试试这个:

QByteArray rawData = reply->readAll();
QString textData(rawData);
qDebug() << textData;
QByteArray rawData=reply->readAll();
QString文本数据(rawData);

qDebug()显然存在重定向,这不被视为错误。
您应该使用回复属性中提供的重定向url运行新请求,直到获得真实页面:

void MainWindow::requestReceived(QNetworkReply *reply)
{
    reply->deleteLater();

    if(reply->error() == QNetworkReply::NoError) {
        // Get the http status code
        int v = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
        if (v >= 200 && v < 300) // Success
        {
             // Here we got the final reply 
            QString replyText = reply->readAll();
            ui->txt_debug->appendPlainText(replyText);
        } 
        else if (v >= 300 && v < 400) // Redirection
        {
            // Get the redirection url
            QUrl newUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
            // Because the redirection url can be relative, 
            // we have to use the previous one to resolve it 
            newUrl = reply->url().resolved(newUrl);

            QNetworkAccessManager *manager = reply->manager();
            QNetworkRequest redirection(newUrl);
            QNetworkReply *newReply = manager->get(redirection);

            return; // to keep the manager for the next request
        } 
    } 
    else 
    {
        // Error
        ui->txt_debug->appendPlainText(reply->errorString());
    }

    reply->manager()->deleteLater();
}
void主窗口::requestReceived(QNetworkReply*reply)
{
回复->删除稍后();
如果(回复->错误()==QNetworkReply::NoError){
//获取http状态代码
int v=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
如果(v>=200&&v<300)//成功
{
//我们得到了最后的答复
QString replyText=reply->readAll();
ui->txt\U调试->追加纯文本(replyText);
} 
如果(v>=300&&v<400)//重定向,则为else
{
//获取重定向url
qrl newUrl=reply->attribute(QNetworkRequest::RedirectionTargetAttribute).tour();
//因为重定向url可以是相对的,
//我们必须使用前一个来解决它
newUrl=reply->url().resolved(newUrl);
QNetworkAccessManager*manager=reply->manager();
QNetworkRequest重定向(newUrl);
QNetworkReply*newReply=manager->get(重定向);
return;//为下一个请求保留管理器
} 
} 
其他的
{
//错误
ui->txt_调试->追加明文(回复->错误字符串());
}
回复->管理器()->deleteLater();
}

您还应该记录重定向的位置或计算重定向的数量,以避免无休止的循环。

非常感谢!你的解决方案很有魅力!我从来没有遇到过困难…@alexisdm Hi,我也遇到过类似的问题,除了我的URL被重定向,也有帖子数据,有没有类似的代码可以解决这个问题?