如何处理HTTP 301状态代码?

时间:2016-08-16 02:07:39

标签: qt network-programming

我正在创建一个小程序,它将从网站中提取信息以便学习。具体来说,我试图从这个乐透网站中提取存档的中奖号码。

https://www.ohiolottery.com/WinningNumbers/KenoDrawings/KenoDrawingsArchive.aspx?date=01%2f01%2f2010

以下是我目前拥有的代码(在pro文件中有QT += network):

Retriever.h

#ifndef RETRIEVER_H
#define RETRIEVER_H

#include <QObject>
#include <QtNetwork>
#include <QDebug>

class Retriever : public QObject
{
    Q_OBJECT
public:
    explicit Retriever(QObject *parent = 0);
    void fetch();

public slots:
    void replyFinished(QNetworkReply* reply);

private:
    QNetworkAccessManager* manager;
};

#endif // RETRIEVER_H

Retriever.cpp

#include "retriever.h"

Retriever::Retriever(QObject *parent) : QObject(parent)
{
    manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}


void Retriever::fetch()
{
    QString stackoverflow = "http://stackoverflow.com";
    QString lotto = "https://www.ohiolottery.com/WinningNumbers/KenoDrawings/KenoDrawingsArchive.aspx?date=01%2f01%2f2010";

    manager->get(QNetworkRequest(QUrl(lotto)));
}


void Retriever::replyFinished(QNetworkReply *reply)
{

    if (reply->error() == QNetworkReply::NoError) qDebug() << "no error";
    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

    qDebug() << reply->url();
    qDebug() << reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
    qDebug() << statusCode;

    if (reply->atEnd()) qDebug() << "already at end";

    while (!reply->atEnd()) {
        QByteArray data = reply->readLine();
        QString::fromUtf8(data.data(), data.size());
        QString str(data);
        qDebug() << str;
    }
}

当我使用stackoverflow运行它时,它工作正常。但是当我使用乐透网站运行时,我从qDebug得到以下输出:

no error
QUrl("https://www.ohiolottery.com/WinningNumbers/KenoDrawings/KenoDrawingsArchive.aspx?date=01%2F01%2F2010")
QUrl("/mobile")
301
already at end

似乎有一些问题。首先,没有错误,但它认为它是一个移动网站?然后它认为它已经在内容的最后(我假设它是因为301状态代码)。我不熟悉从网站检索信息,所以我不知道如何处理这个错误。我完全从网站上复制了网址,所以我不知道为什么会重定向。我该如何解决这个错误?更具体地说,如何获取正确的URL以提供给QNetworkAccessManager

1 个答案:

答案 0 :(得分:1)

状态virtual告诉您必须从其他网址获取数据,在您的情况下为301

您需要将/mobile请求标头设置为网络浏览器,因为该网站认为您是移动客户端。

user-agent