2017-08-24 49 views
0

我在Dropbox上使用版本字符串創建公共txt文件,例如2017.09.01。我用捲曲測試了下載使用Qt下載公共收件箱文件

curl -v -L http://www.dropbox.com/s/ehoawgm89yz6pib/version.txt?raw=1 

它確實有效。它需要-L進行重定向。我不知道很多關於捲曲,但我確實看到重定向HTTP/2 302那麼正常請求

< HTTP/2 200 
< content-disposition: inline; filename="version.txt"; filename*=UTF-8''version.txt 
< ... 
< 
2017.09.01 
* Connection #1 to host dl.dropboxusercontent.com left intact 

然後我試圖使用Qt有一個非常簡單的請求類,類似:

MyClass::MyClass() 
{ 
    auto manager = new QNetworkAccessManager(this); 
    QNetworkRequest request(checkURL); 
    connect(manager, &QNetworkAccessManager::finished, 
    this, &MyClass::replyFinished); 

    m_Reply = manager->get(request); 
} 

void MyClass::replyFinished(QNetworkReply *reply) 
{ 
    QUrl redirect = 
    reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); 
    if (redirect.isValid() && reply->url() != redirect) 
    { 
    if (redirect.isRelative()) 
    { 
     redirect = reply->url().resolved(redirect); 
    } 
    reply->manager()->get(QNetworkRequest(redirect)); 
    return; 
    } 

    const auto newVersion = QString(reply->readAll()); 
    // Do something with the version 
} 

在調試運行,我看到重定向,它再次調用replyFinished,但readAll上沒有任何內容。總是一個空的字符串。

在發佈答案之前,請用我提供的鏈接測試!我的代碼已經適用於大多數其他鏈接。

+0

檢查[this out](http://www.bogotobogo.com/Qt/Qt5_Downloading_Files_QNetworkAccessManager_QNetworkRequest.php)。我測試了這個例子並直接工作。不與你的鏈接,但它與其他鏈接。 – apalomer

+1

在問我的問題之前,我讀了這個例子。我的代碼也適用於其他鏈接。 – Nil

+0

我已經嘗試了評論@apalomery的代碼,並且如果你下載了你提到的文件。 – eyllanesc

回答

0

我的不好。我傾向於忽略一些警告,因爲有些警告我無法修復。原來這些警告並非無用!這應該是一個錯誤,而不是一個警告。

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method 
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new 
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init 
qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error 

您必須在Windows安裝OpenSSL的,或使用包管理器上的其他操作系統。否則,reply對象只是返回一個空字符串。

1

默認情況下,重定向處於關閉狀態。這是一個代碼片段應該工作:

auto manager = new QNetworkAccessManager(); 

QObject::connect(manager, &QNetworkAccessManager::finished, 
     [&](QNetworkReply* repl) { 
    qDebug() << repl->readAll(); 
}); 
QNetworkRequest req(QUrl("http://www.dropbox.com/s/ehoawgm89yz6pib/version.txt?raw=1")); 
req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); 
req.setMaximumRedirectsAllowed(3); 
QNetworkReply* reply = manager->get(req); 
+0

謝謝你的回答,但它不起作用。總是一個空的字符串。我給了我的txt文件的鏈接,以便人們可以在發佈答案之前進行測試。你用我的鏈接測試過了嗎? – Nil

+0

經過測試,它可以在Mac OS上運行。 「Mac OS」爲 –

+0

+1。它幫助我找到了問題,這只是我需要在Windows上安裝OpenSSL。謝謝。 – Nil

相關問題