簡體   English   中英

發出Qt HTTP請求並通過單個函數調用接收響應

[英]Making an Qt HTTP request and receiving the response in a single function call

我正在嘗試創建一個庫,該庫的API將通過以下方式使用:

WebService *service = new WebService( username, password );
User *user = service->getAuthenticatedUser();
UserAssets *assets = user->assets();
// And so on

創建WebServer實例時,既不會下載經過身份驗證的用戶,也不會下載其資產,而是只有在明確請求時才進行檢索。

每當使用Qt之前必須從網絡中檢索數據時,我都會遵循將QNetworkReply finished()信號連接到適當的插槽並使用該插槽來處理返回的數據的標准模式。

我的問題是模式似乎無法容納我想要的用例。 我希望我的庫的用戶(其他開發人員)能夠使用一行來請求和接收他們想要的數據,但是至少從我的角度來看,“ Qt方式”似乎要求他們啟動在一條線上請求,然后將一些信號連接到其他插槽以取回數據,這不是我希望他們擁有的體驗。

我是網絡編程的新手,無論是在一般情況下還是在Qt領域,都是新手,但我使用了Python編寫的庫,可以與完全相同的服務進行通信,因此能夠實現這一目標,因此這似乎是可行的。

是否可以通過單個函數調用用Qt執行HTTP請求的整個生命周期?

最好的選擇是使用QEventLoop 這將使您能夠1)啟動HTTP連接,並從調用者的角度來看2)有效地阻止直到獲得響應。

例如:

如前所述,您可以使用QEventLoop等待QEventLoop finished()error()信號以及退出事件循環。 該解決方案在工作時具有一些嚴重的缺點。

如果花更長的時間下載給定的地址,那么您可能會在事件循環中停留很長時間。 事件循環很好地處理了事件,因此您的應用程序不會感到僵硬,但是總有一些怪癖。 假設用戶正在等待加載,然后按另一個按鈕加載其他內容。 然后,您將有多個循環,第一個文件必須等待第二個文件完成下載。

一次調用就可以向許多程序員建議,這將在一瞬間發生。 但是您的函數在內部處理事件,因此可能不成立。 試想像這樣的代碼

// some pointer accessible to many functions/methods (eg. member, global)
MyData* myData=0;

然后一個代碼調用您的函數:

if (myData){
    QNetworkReply* reply = getMyWobsite(whatever);
    myData->modify(reply);
}

看起來不錯,但是如果碰巧有其他位​​置出現通話怎么辦

    myData=0;

如果在等待請求時執行此插槽,則應用程序將崩潰。 如果決定在函數中使用QEventLoop,請確保在函數文檔中提及它,以便使用它的程序員可以避免此類問題。

如果您沒有將qt用作其他任何東西,您甚至可以考慮使用一些可能已經實現了所需功能的替代庫(例如libcurl )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM