推荐一个 C++ RESTful 框架

2021-12-24 16:55:55 +08:00
 Calatrava

基本上做 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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/824264

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX