[英]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
等待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.