在C/C++中实现JSON RESTful服务的方法

Ways to implement a JSON RESTful service in C/C++

本文关键字:RESTful 服务 方法 JSON 实现 C++      更新时间:2023-10-16

我正在尝试用C/C++做一个JSON Restful web服务。我尝试过Axis2/C和Staff,它们非常适合XML序列化/反序列化,但不适合JSON。

您可能想看看Herb Sutter的博客中介绍的卡萨布兰卡。

有少数库支持使用c创建rest服务,例如restinio:

#include <restinio/all.hpp>
int main()
{
    restinio::run(
        restinio::on_this_thread()
        .port(8080)
        .address("localhost")
        .request_handler([](auto req) {
            return req->create_response().set_body("Hello, World!").done();
        }));
    return 0;
}

tryhttps://github.com/babelouest/ulfius构建C/C++Restful API的伟大库。可以支持所有平台:Linux、FreeBSD、Windows和其他

您可以查看ffead-cpp。除了提供对json和restfull web服务的支持外,它还包括更多功能。不过,对于您的情况来说,这个框架可能太重了。

对于C++web服务,我使用以下堆栈:

  • ipkn/crow C++微网框架
  • 用于json序列化/反序列化的nlohmann/json

看看Oat++

它有:

  • 具有URL参数映射的URL路由
  • 支持Swagger UI端点注释
  • 支持JSON的对象映射

示例终点:

ENDPOINT("GET", "users/{name}", getUserByName, PATH(String, name)) {
  auto userDto = UserDto::createShared();
  userDto->name = name;
  return createDtoResponse(Status::CODE_200, userDto);
}

卷曲:

$ curl http://localhost:8000/users/john
{"name":"john"}

您可能需要了解一下webcc。

这是一个基于Boost.Asio(1.66+).的用于嵌入目的的轻量级C++HTTP客户端和服务器库

它很有前景,正在积极开发中。

它包括许多示例来演示如何创建服务器和客户端。

有一个JIRA项目解决了AXIS2/C中对JSON的支持
我在我的项目中实施了,我与作者一起管理(Badgerfish惯例),但我仍然在努力与读者一起管理
使用内存中的堆栈进行管理似乎更为复杂。

JSON和JSONPath在gsoap中支持C和C++,并提供了新的代码生成器和新的JSON API,让您快速入门。

包括了几个JSON、JSON-RPC和REST示例。内存管理是自动的。

代码生成器可能很有用。以json.org的menu.json片段为例:

{ "menu": {
    "id": "file",
    "value": "File",
    "popup": {
      "menuitem": [
        {"value": "New", "onclick": "CreateNewDoc()"},
        {"value": "Open", "onclick": "OpenDoc()"},
        {"value": "Close", "onclick": "CloseDoc()"}
      ]
    }
  }
}

gsoap命令jsoncpp -M menu.json生成此代码以填充JSON值:

value x(ctx);
x["menu"]["id"] = "file";
x["menu"]["value"] = "File";
x["menu"]["popup"]["menuitem"][0]["value"] = "New";
x["menu"]["popup"]["menuitem"][0]["onclick"] = "CreateNewDoc()";
x["menu"]["popup"]["menuitem"][1]["value"] = "Open";
x["menu"]["popup"]["menuitem"][1]["onclick"] = "OpenDoc()";
x["menu"]["popup"]["menuitem"][2]["value"] = "Close";
x["menu"]["popup"]["menuitem"][2]["onclick"] = "CloseDoc()";

该工具还可以生成读取解析的JSON值和JSONPath代码。

编辑

为了澄清,jsoncpp命令行代码生成器显示了API代码,通过使用.JSON文件作为模板来读取和写入JSON数据,我发现这有助于节省编写API代码以填充和提取JSON数据的时间。JSONPath查询代码也可以使用此工具生成。

对于C语言的web服务,您可以利用像sulius、civetweb:这样的库

https://github.com/babelouest/ulfius

https://github.com/civetweb/civetweb/blob/master/docs/Embedding.md

对于C++中的web服务,您可以利用libhv、restbed:等库

https://github.com/ithewei/libhv

https://github.com/Corvusoft/restbed