2016-09-17 1 views
0

sourceforge.netにアップデートがあるかどうかをQTアプリがチェックするようにします。これについて私は要求を使用します:https://sourceforge.net/projects/kidbasic/best_release.json このリンクをブラウザに使用すると、いくつかのjson応答が得られます。 したがって、これはコードである:QTは、sourceforge.netにアップデートがあるかどうかを確認するようにアプリケーションを修正します。

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

(それは私がhttps://indy.fulgan.com/SSL/からlibeay32.dllssleay32.dllを取り、自分のアプリケーションと同じフォルダにそれらのファイルを置く警告なしに動作させるために - 理由httpsの)。

他のURLで試してみると、私は正しい返答を得ました。 surceforge.netリクエストを使用した場合、私はこのエラーを受け取ります:QNetworkReply::NetworkError(RemoteHostClosedError)

私はhttps://www.hurl.itと同じリクエストを行い、すべてが正常であるようです。私はhttps://httpstatus.io/と同じ結果を得ました。

QTでsurceforge.netから有効な返信を受け取るにはどうすればよいですか?

+2

誰がその部分のコードで答えることができない場合、私はあなたが単一main.cppにファイル無GUIを作成することをお勧め[ MCVE](http://stackoverflow.com/help/mcve)、エラーを再現します(信号ターゲットとしてlambdaを使用するだけです)。 – hyde

+0

私は、最小、完全、および検証可能な例を作成します。 – Junior

答えて

1

sourceforge.net(これは何QNetworkRequest::UserAgentHeaderが設定されていないQNetworkAccessManagerが使用するデフォルトのユーザーエージェントである)HTTPリクエストのユーザーエージェント文字列がMozilla/5.0ときに接続を閉じているように見えます。

あなたは要求を送信する前に、カスタムユーザーエージェントを設定する必要があります:

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

うわー!あなたは私の人生と私の精神的健康を救った! :) – Junior

関連する問題