【问题标题】:Making an HTTP GET under Qt在 Qt 下制作 HTTP GET
【发布时间】:2011-08-28 03:21:34
【问题描述】:

我有一个 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() 返回 0reply->errorString() 返回“未知错误”。我现在真的不知道该怎么办......

有什么想法吗?

【问题讨论】:

    标签: qt http networking request


    【解决方案1】:

    明显有重定向,不认为是错误。
    您应该使用回复属性中提供的重定向 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();
    }
    

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

    【讨论】:

    • 非常感谢!您的解决方案就像一个魅力!我永远不会坚持...
    • @alexisdm 嗨,我遇到了类似的问题,除了我被重定向的 URL 也有发布数据,是否有任何类似的代码可以解决这个问题?
    【解决方案2】:

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

    QByteArray rawData = reply->readAll();
    QString textData(rawData);
    qDebug() << textData;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多