c++ - QT make app查看sourceforge.net是否有更新

标签 c++ qt sourceforge

我希望我的 QT 应用程序检查 sourceforge.net 上是否有更新。为此,我使用请求:https://sourceforge.net/projects/kidbasic/best_release.json 如果你在浏览器中使用这个链接,你会得到一些 json 回复。 所以,这是代码:

app.pro

QT       += core gui
QT       += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = app
TEMPLATE = app
SOURCES += main.cpp\
        mainwindow.cpp
HEADERS  += mainwindow.h

main.cpp

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QPushButton>


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void replyFinished(QNetworkReply* reply);
    void checkForUpdate(void);
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QWidget * wdg = new QWidget(this);
    QPushButton *train_button = new QPushButton(wdg);
    train_button->setText(tr("check update"));
    setCentralWidget(wdg);
    QObject::connect(train_button, SIGNAL(released()), this, SLOT(checkForUpdate()));
}

MainWindow::~MainWindow(){    }

void MainWindow::checkForUpdate(void){
    QNetworkRequest request;
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QSslConfiguration config = QSslConfiguration::defaultConfiguration();
    config.setProtocol(QSsl::SecureProtocols);
    request.setSslConfiguration(config);

    request.setUrl(QUrl("https://sourceforge.net/projects/kidbasic/best_release.json"));
    //other urls to test
    //request.setUrl(QUrl("https://sourceforge.net/projects/openofficeorg.mirror/files/stats/json?start_date=2014-10-29&end_date=2014-11-04"));
    //request.setUrl(QUrl("https://ro.gravatar.com/205e460b479e2e5b48aec07710c08d50.json"));
    //request.setUrl(QUrl("http://headers.jsontest.com/"));

    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    manager->get(request);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}


void MainWindow::replyFinished(QNetworkReply* reply){
    qDebug() << reply->error();
    if(reply->error() == QNetworkReply::NoError) {
        //process json reply
        QString strReply = (QString)reply->readAll();
        qDebug() << strReply;
    } else {
        qDebug() << "ERROR";
    }
    reply->deleteLater();
}

(为了让它在没有警告的情况下工作,我从 https://indy.fulgan.com/SSL/ 中获取了 libeay32.dllssleay32.dll 并将这些文件与我的应用程序放在同一个文件夹中 - 因为https)。

如果我尝试使用其他网址,我会得到正确的回复。如果我使用任何 surceforge.net 请求,我会收到此错误:QNetworkReply::NetworkError(RemoteHostClosedError)

我对 https://www.hurl.it 提出了同样的要求一切似乎都很好。我用 https://httpstatus.io/ 得到的结果相同也是。

如何使用 QT 从 surceforge.net 获得有效回复?

最佳答案

sourceforge.net似乎在 HTTP 请求的用户代理字符串为 Mozilla/5.0 时关闭连接(这是 QNetworkAccessManager 使用的默认用户代理 当没有设置 QNetworkRequest::UserAgentHeader 时)。

您可能必须在发送请求之前设置自定义用户代理:

request.setHeader(QNetworkRequest::UserAgentHeader, "App/1.0");

关于c++ - QT make app查看sourceforge.net是否有更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39544640/

相关文章:

qt - 按钮属性 "tooltip"有何用途?

c++ - 如何获取文件大小&文件名&文件起始地址?

python - 在 setup.py 中包含直接依赖下载链接

c++ - 通过 std::function 包装重载函数

c++ - Node-expat 错误的 ELF 类 : ELFCLASS64

C++ string data() 函数使引用和指针无效?

c++ - 在处理迭代器时使用以下内容有什么好处

qt - QWebView 或 QWebEngineView

eclipse - 用于 Sourceforge 功能/错误跟踪系统的 Mylyn 连接器

git - 使用 "git svn clone"从 sourceforge 克隆大型 svn 存储库