2016-09-17 53 views
0

我希望我的QT应用程序检查sourceforge.net上是否有更新。为此,我使用请求: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)。

如果我尝试与他人网址,我收到了正确的答复。如果我使用任何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),它重现错误(只使用lambdas作为信号目标)。 – hyde

+0

我创建了一个Minimal,Complete和Verifiable示例。 – Junior

回答

1

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

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

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

哇!你救了我的生命......和我的心理健康! :) – Junior