QT сделать приложение, чтобы проверить, есть ли обновление на sourceforge.net

Я хочу, чтобы мое приложение 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();
}

mainwindow.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

mainwindow.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();
}

(Чтобы это работало без предупреждений беру libeay32.dll а также ssleay32.dll от https://indy.fulgan.com/SSL/ и поместите эти файлы в одну папку с моим приложением — из-за https).

Если я попробую с другими URL, я получу правильный ответ. Если я использую любой surceforge.net запрос, я получил эту ошибку: QNetworkReply::NetworkError(RemoteHostClosedError),

Я делаю такие же запросы с https://www.hurl.it и все вроде бы нормально. Те же результаты, которые я получил с https://httpstatus.io/ тоже.

Как я могу получить действительный ответ от surceforge.net с QT?

0

Решение

sourceforge.netкажется, закрывает соединение, когда строка агента пользователя HTTP-запроса Mozilla/5.0 (это пользовательский агент по умолчанию, используемый QNetworkAccessManager когда нет QNetworkRequest::UserAgentHeader был установлен).

Возможно, вам придется настроить пользовательский агент перед отправкой запроса:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]