在提供 JSON 数据的 C++/Qt(充当服务器)中创建简单的 WebService

Posted

技术标签:

【中文标题】在提供 JSON 数据的 C++/Qt(充当服务器)中创建简单的 WebService【英文标题】:Creating simple WebService in C++ / Qt (acting as server) providing JSON data 【发布时间】:2012-07-19 09:53:30 【问题描述】:

我需要创建一个简单的网络服务(作为“服务器”)。目标是提供一些我在 Qt / C++ 应用程序中读取的数据作为JSON 数据。基本上,浏览器中的 javascript 应用程序应从 Qt 应用程序中读取其数据。它通常是单用户场景,因此用户在她的浏览器中运行 Google Maps 应用程序,而其他数据来自 Qt 应用程序。

到目前为止,我已经找到了这些库:

    Qxt: http://libqxt.bitbucket.org/doc/0.6/index.html 但作为 C++/Qt 的新手,我错过了一些例子。补充:我找到了一个例子here gSoap:http://www.cs.fsu.edu/~engelen/soap.html 有更多示例和文档,而且似乎也支持 JSON KD SOAP: http://www.kdab.com/kdab-products/kd-soap/ 据我所知没有例子,文档是 here Qt 有自己的特色,但更多的是充当客户端:http://qt-project.org/videos/watch/qt-networking-web-services

检查 SO 基本上为我提供了上述库的链接

    webservice with Qt 举个我不太明白的例子。 How to Create a webservice by Qt

所以基本上我确实有以下问题

    您将使用哪个库?我想让它尽可能简单,并且需要一个示例。 除了 WebService 之外,还有其他(简单!)方法可以将 JSON 数据提供给 JavaScript 网页吗?

-- 编辑,备注:---

需要是应用程序固有的。不能安装 Web 服务器,也不能使用额外的运行时间。用户只需运行应用程序。也许 Qt WebKit 可能是一种方法....

-- 编辑2--

目前正在检查小型 Web 服务器,截至 SO“Qt HTTP Server?”

【问题讨论】:

为什么不将其创建为由现有 Web 服务器调用的 CGI 程序?这可能要简单得多。 因为它基本上是桌面场景。数据仅驻留在用户的 PC 上,不可能在每个用户的 PC 上安装 Web 服务器。使用 WebApp 只是因为它具有 Google 地图。 你考虑过Jetty吗? IIRC 不需要安装,只需要 Java。 特别不是 Jetty,而是使用 Web 服务器的方法。应用程序本身需要提供它,没有额外的安装是可行的,需要在没有 Java 的情况下运行。感谢您的提示! 更新:gSOAP 有一个更新的 JSON 引擎和一个新的 jsoncpp 代码生成器,可以在 C++(和 C)中使用 really easy to write JSON code 并部署为服务。 【参考方案1】:

在我的测试中,目前我正在使用 QtWebApp:http://stefanfrings.de/qtwebapp/index-en.html 这是编辑 2 的答案之一(Qt HTTP Server?)

Stefan 的小型 WebServer 有一些记录良好的代码,用“Qt C++”编写并且易于使用,特别是如果您已经使用过 servlet。因为它可以很容易地集成到我的 Qt 项目中,所以我最终会使用一个内部 WebServer。

我的 JSON 测试中的一些演示代码,表明生成 JSON 内容基本上是创建一个QString

void WebServiceController::service(HttpRequest& request, HttpResponse& response) 
// set some headers
response.setHeader("Content-Type", "application/json; charset=ISO-8859-1");
response.setCookie(HttpCookie("wsTest","CreateDummyPerson",600));

QString dp = WebServiceController::getDummyPerson();
QByteArray ba = dp.toLocal8Bit();
const char *baChar = ba.data();
response.write(ba);

如果有人有其他库的简单示例可以分享,请告诉我。

【讨论】:

这个项目有什么演变吗? 感谢stefanfrings.de/qtwebapp/index-en.html 的链接。我花了大约一小时阅读文档。看起来挺好的。应该在github上?【参考方案2】:
QByteArray ba = dp.toLocal8Bit();
const char *baChar = ba.data();

您不需要将 QByteArray 转换为 char 数组。 Response.write() 也可以用QByteArray 调用。

顺便说一句:qPrintable(dp) 是从QString 转换为字符数组的快捷方式。

【讨论】:

以上是关于在提供 JSON 数据的 C++/Qt(充当服务器)中创建简单的 WebService的主要内容,如果未能解决你的问题,请参考以下文章

java怎么实现JSON打包UDP

C ++ Qt - 仅在最后一个回复完成后发送POST请求

Qt浅译:JSON Support in Qt(JSON只有六种数据类型)

C++ Qt 无法正确解析 JSON 数组

C/C++实现WebService服务提供JSON数据的接口

Qt之JSON生成与解析