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

推荐一个 C++ RESTful 框架

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

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

    #include "wfrest/HttpServer.h" using namespace wfrest; int main() { HttpServer svr; // curl -v http://p: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     Solana     1100 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 23:16 PVG 07:16 LAX 16:16 JFK 19:16
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86