V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Calatrava
V2EX  ›  C++

推荐一个 C++ RESTful 框架

  •  7
     
  •   Calatrava · 2021-12-24 16:55:55 +08:00 · 6347 次点击
    这是一个创建于 825 天前的主题,其中的信息可能已经有所发展或是发生改变。

    基本上做 Web 开发需要的功能,比如 json ,静态文件,form ,Cookie 都支持的比较完整。而且还是一个纯异步的 web 引擎,性能相当可观。

    #include "wfrest/HttpServer.h"
    using namespace wfrest;
    
    int main()
    {
        HttpServer svr;
    
        // curl -v http://ip:port/hello
        svr.GET("/hello", [](const HttpReq *req, HttpResp *resp)
        {
            resp->String("world\n");
        });
        // curl -v http://ip:port/data
        svr.GET("/data", [](const HttpReq *req, HttpResp *resp)
        {
            std::string str = "Hello world";
            resp->String(std::move(str));
        });
    
        // curl -v http://ip:port/post -d 'post hello world'
        svr.POST("/post", [](const HttpReq *req, HttpResp *resp)
        {
            // reference, no copy here
            std::string& body = req->body();
            fprintf(stderr, "post data : %s\n", body.c_str());
        });
    
        if (svr.start(8888) == 0)
        {
            getchar();
            svr.stop();
        } else
        {
            fprintf(stderr, "Cannot start server");
            exit(1);
        }
        return 0;
    }
    

    项目地址: https://github.com/wfrest/wfrest

    第 1 条附言  ·  2021-12-25 11:04:04 +08:00
    补充,框架是基于[C++ Workflow]( https://github.com/sogou/workflow)开发的。弥补了 workflow 在 web 功能上的不足,同时性能上有保证。
    39 条回复    2022-02-02 23:32:46 +08:00
    hotcool100
        1
    hotcool100  
       2021-12-24 17:00:48 +08:00   ❤️ 13
    我疯了用 C++ 写 RESTful
    rophie123
        2
    rophie123  
       2021-12-24 17:07:35 +08:00 via iPhone
    Qt 也有个,之前写过
    hushulin
        3
    hushulin  
       2021-12-24 17:15:20 +08:00
    工作还是不够饱和
    ipwx
        4
    ipwx  
       2021-12-24 17:21:11 +08:00   ❤️ 2
    不错不错。好像还是基于 sogou workflow 库的,也不算是 start from stratch 。

    @hotcool100 @hushulin 当你碰巧有一个 C++ 服务需要暴露简单的 API ,这东西就非常有用了。
    hushulin
        5
    hushulin  
       2021-12-24 17:30:08 +08:00
    @ipwx 假如这个 C++程序员不懂其它 web 开发语言,这是个好选择
    Buges
        6
    Buges  
       2021-12-24 17:40:51 +08:00 via Android
    @ipwx c/cpp 服务需要 Web API 的,一律用 CGI ,简单省事,不用写这些东西折磨自己。
    zachlhb
        7
    zachlhb  
       2021-12-24 18:47:03 +08:00 via iPhone
    是什么想不开要拿 c++写 restful ?
    ipwx
        8
    ipwx  
       2021-12-24 18:59:09 +08:00
    @Buges @hushulin 不,如果这个 C++ 服务不是一个 CURD 服务呢?如果它本身是个像 redis 一样的多线程(有后台队列)的服务程序呢?不是那种来一个请求启动一个进程,而是一个常驻内存、用满整个服务器核心的 C++ 程序呢?

    比如,写了个特殊领域的小型数据库。写了个特殊的调度程序。写了个常驻内存的( C++ 算法)服务程序,每个请求都要占用所有 CPU 并行计算,更多的请求进 C++ 内部的队列,一个一个处理。这种场景下真的很有用,就是要在 C++ 程序里面内嵌一个 HTTP API 。

    你们多少有些按照自己的经验,小看了 C++ 程序的多样化。
    Calatrava
        9
    Calatrava  
    OP
       2021-12-24 19:00:25 +08:00
    @zachlhb 还是有一些需要高性能的场合的。而且懂点 C++的,这个库用起来不比别的语言复杂。
    ipwx
        10
    ipwx  
       2021-12-24 19:02:07 +08:00
    @Buges @zachlhb 而且在我描述的这些场景里面,用 C++ 实现不是因为 C++ 程序员不懂其他语言,而是从效率和实现难度上,用 C++ 内嵌 HTTP API 都是最优选择。包括算法的例子,可能算法需要读取数据,这一步延迟高,所以不得不常驻内存。把 C++ 编译成 Python 模块,可能还不如内嵌一个这个。反正处理的请求是相当简单的
    ragnaroks
        11
    ragnaroks  
       2021-12-24 19:17:09 +08:00   ❤️ 1
    只写脚本的是理解不了一个可执行程序不但有图形界面还有 HTTP 接口的
    Buges
        12
    Buges  
       2021-12-24 19:42:13 +08:00 via Android
    @ipwx
    针对你说的“碰巧有一个 C++ 服务需要暴露简单的 API”,我觉得起个 CGI ,简单的 IPC 好过引入这么一大坨东西,太多无谓的复杂度了。
    shayuvpn0001
        13
    shayuvpn0001  
       2021-12-24 22:26:26 +08:00
    见过 MIPS 处理器的路由器里面,用 printf 输出 web 页面的。资源有限,又需要实现一些功能的场景,还是有很多的。
    ffire
        14
    ffire  
       2021-12-25 00:01:01 +08:00 via iPhone
    看了这贴,多少能理解为啥现在的 web ,呃,不知道如何形容,就说这么让人难受吧,更让人难受的是,他发展的趋势是朝着更让人难受的方向。
    tairan2006
        15
    tairan2006  
       2021-12-25 13:36:05 +08:00
    某些场景还是有用的

    但是写 web 的话,std::string 就能把你搞的欲仙欲死(
    jazzg62
        16
    jazzg62  
       2021-12-25 15:09:37 +08:00
    之前用过,当作 electron 的子进程来执行,但是,这玩意是真麻烦,艹
    iQXQZX
        17
    iQXQZX  
       2021-12-25 15:45:06 +08:00
    还有一个叫 libhv
    Calatrava
        18
    Calatrava  
    OP
       2021-12-25 15:54:15 +08:00 via Android
    @iQXQZX 还有一个 header only 的 cpp-httplib ,但是纯同步的。
    c0xt30a
        19
    c0xt30a  
       2021-12-25 19:26:14 +08:00
    进来之前,我还以为楼主重新发现了 CROW: https://github.com/ipkn/crow
    进来之后,才发现这是另一个轮子。

    这很 C++ -:)
    ipwx
        20
    ipwx  
       2021-12-25 21:11:04 +08:00
    @Buges 。。。不是,你是不能理解 C++ 需要对外提供服务嘛?

    服务内核是完全独立的,外部需要一个 gui 去操纵这个服务。C++ 服务可能部署在 vps 或者阿里云或者 kubernetes 里面,gui 管理程序可能是 qt 或者 c# 写的。这种场景你给 c++ 一个 http 接口难道不是最优解嘛?
    ipwx
        21
    ipwx  
       2021-12-25 21:12:18 +08:00
    @Buges 而且你起个 cgi ,你是每个请求都要启动一个 c++ 服务。但我说了,这个 c++ 服务就是独立的进程,nginx 那种基础设施,gui 或者 web app 才是外挂的管理程序。你是除了 web 开发那三板斧一点都不懂啊
    Calatrava
        22
    Calatrava  
    OP
       2021-12-25 22:23:53 +08:00 via Android
    @c0xt30a 轮子和轮子也是不一样的。
    Buges
        23
    Buges  
       2021-12-26 00:29:03 +08:00 via Android   ❤️ 1
    @ipwx CGI 启动的进程当然不是 damon 主程序,这还用说吗,需要啥数据通过 IPC 拿。关键是这样能把 Web 相关的一系列复杂度都抽离出去,程序里不用引入协议、路由、tls 等等一堆东西,每连接一个进程也不用关心锁、内存泄漏等问题。这个库看起来“容易”并不代表“简单”,依赖庞大,出了问题 backtrace 加长一截,都是不必要的复杂度。
    至于 nginx 那些怎么能一概而论,我回复的一直都是“碰巧有一个 c/cpp 服务需要暴露简单的 HTTP API”这个问题,像是提供 metrics 统计信息、提供 API 给前端面板等简单需求,不值当引入这些复杂度。
    coolmenu
        24
    coolmenu  
       2021-12-26 10:20:25 +08:00
    我的第一反应也是用 IPC 就可以了,或者用 zeromq ,都比这个 http 的服务要好得多
    cpprookie
        25
    cpprookie  
       2021-12-26 11:29:53 +08:00
    @c0xt30a 看了下代码,相对于 crow 这种全是模板的,这个 wfrest 代码更简单易读
    ClarkAbe
        26
    ClarkAbe  
       2021-12-26 15:39:58 +08:00
    阔怕.....我之前也想过用纯 C 写...结果写着写着放弃了太难了....后面用 Golang 挺顺手的......
    ysc3839
        27
    ysc3839  
       2021-12-26 19:55:20 +08:00 via Android
    @ipwx @Buges CGI 早就被淘汰了,不想自己处理 HTTP 相关的东西的话,现在也应该使用 FastCGI 了。目前似乎就只有 PHP 还是传统 CGI 那种从头执行到尾结束的模式了。
    ipwx
        28
    ipwx  
       2021-12-26 21:55:02 +08:00
    @Buges 不,一个是只要部署一个 C++ 程序,另一个是还要配合一个转接 zeromq 的 cgi 程序 + ipc ,到底哪个复杂,你还要杠嘛?
    c0xt30a
        29
    c0xt30a  
       2021-12-26 23:05:32 +08:00
    @cpprookie 这个可能还是要看个人口味了。如果让我选,我可能选 crow ,因为它是 header-only 的。当然 wfrest 也有别的优势 -:)
    Buges
        30
    Buges  
       2021-12-26 23:07:24 +08:00 via Android
    @ipwx 给用户部署的话当然是单程序集成了更“容易”。IPC 具体要看情况,比如给一个服务实现一个动态加载配置文件的 post 接口,直接把内容写到配置文件然后 SIGHUP 就可以;比如给 redis-server 实现统计 API ,直接用 redis client 就可以;比如给内核模块写个监控 API ,暴露个 procfs 就可以;再比如写个运维面板,和 systemd 等服务直接通过 dbus 就可以。总之很多情况,用 signal 、文件、pipe 、socket 等简单方式,或易集成的或已有的专用协议、rpc 、message pass 等,都可以避免在主程序中引入 Web 相关的一系列复杂度的前提下满足需求。
    ppphp
        31
    ppphp  
       2021-12-27 01:07:19 +08:00
    c++写网页,我比程序先崩溃
    chtcrack
        32
    chtcrack  
       2021-12-27 13:28:37 +08:00
    @ipwx 你和那些 web 程序员讲 c++,很多人都不懂的..甚至还有人认为 c++过时的..他们用着 c++大神开发出来的语言,开发 web,然后说 c++过时..是不是很有趣?
    ipwx
        33
    ipwx  
       2021-12-27 15:10:21 +08:00
    @chtcrack 对对对,上面一群没用过 C++ 的,在和我这个今年写了八万行 C++ 的人辩论,C++ 里面到底是内嵌一个 HTTP 服务器暴露给前端 /GUI 更方便,还是引入 IPC 用 CGI/FastCGI 暴露给前端更方便。笑死我了
    hutoer
        34
    hutoer  
       2021-12-28 08:54:51 +08:00   ❤️ 1
    好多年前,我接到一个任务,开发一个响应时间极低(具体多少现在忘了)的 web 服务,我就用 libevent 和 C++编写,效果很好:快、稳。
    LANB0
        35
    LANB0  
       2021-12-28 09:41:34 +08:00   ❤️ 1
    上面要用 CGI 的朋友,当碰到需要完成一个设备 web 时候,拿 CGI 去写几百上千个接口,还得配合前端的同事实现前后端分离,不知道是什么感觉。
    LANB0
        36
    LANB0  
       2021-12-28 09:44:15 +08:00
    @c0xt30a 这个不错,引入方便。最近在用 mongoose 和 httplib ,都有类似支持,不过都是同步的
    ipwx
        37
    ipwx  
       2021-12-28 10:24:32 +08:00
    @hutoer @LANB0 9494 。但凡写过实际的 C++ 项目也不会说出用 IPC 作为方案的话来。C++ 用 IPC 比内嵌 HTTP 服务器容易?笑死我了,这还不如 CGI 呢。当然 CGI 也是脑残
    frodez
        38
    frodez  
       2022-02-01 19:37:38 +08:00
    workflow 和 asio (无论是 boost 版本还是非 boost 版本)相比,或者与 libevent,libuv 相比,有何优势或者特殊之处?
    Calatrava
        39
    Calatrava  
    OP
       2022-02-02 23:32:46 +08:00
    @frodez workflow 是个应用级的项目吧,其他几个都是网络事件库。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5251 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:37 · PVG 17:37 · LAX 02:37 · JFK 05:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.