发出Qt HTTP请求并在单个函数调用中接收响应

时间:2012-09-01 23:38:02

标签: c++ qt

我正在尝试创建一个API,其API将按以下方式使用:

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

创建WebServer实例时,不会下载经过身份验证的用户及其资产,而只会在明确请求时检索它们。

每当我在使用Qt之前必须从网络中检索数据时,我都遵循标准模式将finished()的{​​{1}}信号连接到相应的插槽并使用该插槽处理返回的数据。

我的问题是模式似乎不适合我想要的用例。我希望我的库(其他开发人员)的用户能够使用一行来请求和接收他们想要的数据,但至少从我的观点来看,'Qt方式'似乎要求他们启动请求在一行上,然后将一些信号连接到其他一些插槽以获取数据,这不是我希望他们拥有的经验。

我是网络编程的新手,无论是一般还是Qt,但是我使用的是用Python编写的库,与完全相同的服务进行通信,能够实现这一点,所以它似乎有可能实现。

是否可以通过单个函数调用使用Qt执行HTTP请求的完整生命周期?

2 个答案:

答案 0 :(得分:1)

你最好的选择可能是使用QEventLoop。这将允许您1)启动HTTP连接,并且从调用者的角度来看,2)有效阻止,直到您得到响应。

例如:

答案 1 :(得分:0)

正如其他人所提到的,您可以使用QEventLoop等待finished()error()信号以及退出事件循环。这种解决方案在工作时有一些严重的缺点。

如果下载给定地址需要更长时间,那么您可能会在事件循环中停留很长一段时间。事件循环很好地处理事件,所以你的应用程序不会frezze,但无论如何都有一些连接它的怪癖。想象一下,用户正在等待加载,然后按下另一个按钮,以加载其他内容。然后你将有多个循环循环,第一个文件必须等待第二个文件完成下载。

单次调用中的操作建议许多程序员,这将在一瞬间发生。但是你的功能是在内部处理事件,所以这可能不成立。想象一下像

这样的代码
// 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)。