cinatra是什么?

cinatra是C++开源社区–purecpp发起的一个开源项目,现在正式发布第一个版本cinatra0.9.0,cinatra是一个现代C++写的web framework,它的目的是给用户提供一个易用、灵活和高性能的web框架,让用户能完全专注于核心逻辑而无需关注http细节。它的灵感来源于sinatra,但又有自己的特色。

如何使用

1.从github上下载源码。

2.安装boost,因为框架用到asio和coroutine,需要1.57及以上的版本。

3.编译。已经提供vs2013的工程文件和Cmakelist,直接在win和linux平台下编译即可。

示例

#include <cinatra/cinatra.hpp>
using namespace cinatra;
int main()
{
SimpleApp app;
app.route("/", [](Request& req , Response& res)
{
res.end("Hello Cinatra");
}); app.listen("http").run(); return ;
}

运行起来之后,在浏览器中输入:127.0.0.1就可以看到返回的” Hello Cinatra”, 用起来是不是很简单,cinatra框架帮你把很多事情都做好了,你只需要关注你的核心业务逻辑即可。让我们继续看一个稍微复杂一点的例子。

#include <cinatra/cinatra.hpp>
using namespace cinatra;
int main()
{
SimpleApp app;
app.route("/hello", [](Request& req , Response& res)
{
res.end("Hello " + req.query().get_val("name"));
});
app.route("/hello/:name/:age", [](Request& req, Response& res, const std::string& a, int b)
{
res.end("Name: " + a + " Age: " + boost::lexical_cast<std::string>(b));
}); app.listen("http").run(); return ;
}

浏览器中输入:127.0.0.1/hello?name=test&age=12,页面将输出” Hello test”。 为了让用户用起来更方便,我们还支持下面这种url请求方式:127.0.0.1/hello/test/12,这个url将会被路由到”/hello/:name/:age”对应的handler:[](Request& req, Response& res, const std::string& a, int b);

Router不仅仅支持lambda表达式还支持类的成员函数,如果你想把handler放到类对象中,你可以这样做。

struct MyStruct
{
void hello(Request& req, Response& res)
{
res.end("Hello " + req.session().get<std::string>("uid") + "!");
}
};
MyStruct t;
// 访问/hello
app.route("/hello", &MyStruct::hello, &t);

cinatra不仅仅使用简单,还很灵活,它支持AOP,我们可以很方便的将非核心逻辑和核心逻辑分离,比如下面的例子。

struct CheckLoginAspect
{
void before(Request& req, Response& res)
{
//如果session没有uid且访问的不是login和test_post页面
if (!req.session().exists("uid")&&req.path()!="/login.html"&&
req.path() != "/test_post"&&req.path().compare(, , "/public"))
{
// 跳转到登陆页面
res.redirect("/login.html");
}
} void after(Request& req , Response& res)
{ }
}; #include <cinatra/cinatra.hpp>
using namespace cinatra;
int main()
{
Cinatra<CheckLoginAspect> app;
app.route("/", [](Request& req , Response& res)
{
res.end("Hello Cinatra");
});
app.listen("http").run(); return ;
}

上面的例子中我们增加了一个检查是否登录的切面,如果用户没登录将会重定向到登录页面。我们还可以自由组合多个切面,cinatra可以很方便地扩展任意多个切面。你可以这样扩展切面。

struct CheckLoginAspect
{
void before(Request& req, Response& res)
{
//如果session没有uid且访问的不是login和test_post页面
if (!req.session().exists("uid")&&req.path()!="/login.html"&&
req.path() != "/test_post"&&req.path().compare(, , "/public"))
{
// 跳转到登陆页面
res.redirect("/login.html");
}
} void after(Request& req , Response& res)
{ }
}; struct LogAspect
{
void before(cinatra::Request& req, cinatra::Response& res)
{
std::cout << "log before" << std::endl;
} void after(cinatra::Request& /* req */, cinatra::Response& /* res */)
{
std::cout << "log after" << std::endl;
}
}; #include <cinatra/cinatra.hpp>
using namespace cinatra;
int main()
{
Cinatra<CheckLoginAspect, LogAspect> app; //扩展了一个记录日志的切面
app.route("/", [](Request& req , Response& res)
{
res.end("Hello Cinatra");
}); app.listen("http").run(); return ;
}

性能

用ab工具和另外一个c++ web框架crow做了一下性能对比:

crow:

cinatra:

可以看到cinatra比crow的性能略高。现在第一个版本还没有专门去做优化,主要是完成了基本功能,后续会持续优化的,也欢迎大家帮忙做进一步的性能测试。

cinatra的设计

cinatra的设计非常简单,只有几个组件,下面是cinatra的逻辑视图。

用户仅用cinatra即可,其它的事情框架已经帮用户做好了,用户只用关注核心逻辑即可,这些核心逻辑都在handler中处理,而这些handler完全由用户自定义和扩展。

roadmap

目前支持了http1.0和1.1,支持了session和cookie,后续计划:

  • https
  • html模板
  • websocket
  • cinatra打造purecpp社区

开发和参与者

C++开源社区:http://purecpp.org/,qicosmos(江南),网事如风,SIGSEGV,海盗,福尔摩斯喵。

更多的例子请到社区github上看。

如果你发现了问题请及时到社区反馈给我们,也欢迎提出宝贵意见。希望更多的人能参与进来。

如果你觉得cinatra不错,请不要吝惜给一个star^_^。

CINATRA发布第一个版本的更多相关文章

  1. lms框架即将发布第一个版本了

    lms微服务框架介绍 LMS框架旨在帮助开发者在.net平台下,通过简单的配置和代码即可快速的使用微服务进行开发. LMS通过.net框架的主机托管应用,内部通过dotnetty/SpanNetty实 ...

  2. iNeuOS工业互联平台,iNeuKernel(物联网核心组件)远程控制标准化设计与实现。发布v2.3版本。

    目       录 1.      概述... 2 2.      平台演示... 2 3.      控制端与iNeuKernel的交互协议... 3 4.      设备驱动实现控制业务... 4 ...

  3. CDNDrive 第一个版本发布 & 布客新知第二次备份完成

    CDNDrive 第一个版本发布,新适配五个图床 https://github.com/apachecn/CDNDrive 另外,布客新知第二次备份完成 TutorialsPoint:http://i ...

  4. Visual Studio 2017 Enterprise 发布 15.4 版本,离线安装包百度网盘下载。

    Visual Studio 2017 于2017年10月13日发布 15.4 版本.该版本包含多项生产力改进,支持 .NET Standard 2.0 ,并且可以开启 Xamarin Live Pla ...

  5. SuperSocket 2.0 发布第一个预览版, 另寻找Yang Fan哥哥

    昨天,SuperSocket的作者发布了2.0版本的第一个预览版.SuperSocket 2.0 是一个经过全新设计的,第一个完全基于.NET Core的版本.作者正在积极尝试提供更简单易用的API的 ...

  6. Spring Cloud Alibaba发布第二个版本,Spring 发来贺电

    还是熟悉的面孔,还是熟悉的味道,不同的是,这次的配方升级了. 今年10月底,Spring Cloud联合创始人Spencer Gibb在Spring官网的博客页面宣布:阿里巴巴开源 Spring Cl ...

  7. PyQt 5.2 发布,此版本完全支持Qtv5.2.0

    PyQt 5.2 发布,此版本完全支持Qtv5.2.0 :包括了新的 QtBluetooth,QtPositioning,QtMacExtras,QtWinExtras 和 Qt11Extras 模板 ...

  8. 让C/C++程序一次编译可以发布到多版本Linux之上

    最近页游开放平台比较多, 每个平台要求的Linux版本各不相同, 这给开发人员部署服务器带来了很大的困难. 在本机Linux编译的程序,发布时即便将依赖的so附带到目标Linux环境,仍然会碰到依赖及 ...

  9. 数据库备份还原工具EMS SQL Angel for SQL Server发布1.3版本

    EMS公司,是专门从事企业数据库以及内置于多层次客户服务器结构自动化开发.其EMS SQL Angel for SQL Server工具,便是SQL Servers数据库数据备份还原工具,并且还能使用 ...

随机推荐

  1. Centos7与Windows10添加Windows10启动项并设置为默认启动

    在Centos7下root登陆 编辑 /boot/grub2/grub.cfg vim /boot/grub2/grub.cfg 在第一行添加 menuentry "Windows10&qu ...

  2. Hdu-1358Period(KMP算法之next数组的应用)

    题解:对于串pattern来说,如果0~i-1这个位置中循环,那么i%(i-next[i])==0 ,循环次数为 i/(i-next[i]),循环长度为 i-next[i] 例如对于串ababab来说 ...

  3. POJ1860-Currency Exchange (正权回路)【Bellman-Ford】

    <题目链接> <转载于 >>> > 题目大意: 有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0. ...

  4. 003.Docker容器管理

    一 docer运行应用 1.1 常见容器运行 root@docker:~# docker #查看docker相关命令 root@docker:~# docker run -d -p 80:80 htt ...

  5. BZOJ.2588.Count on a tree(主席树 静态树上第k小)

    题目链接 /* 序列上的主席树 某点是利用前一个点的根建树 同理 树上的主席树 某个节点可以利用其父节点(is unique)的根建树 排名可以利用树上前缀和求得: 对于(u,v),w=LCA(u,v ...

  6. PHP算式验证码和汉字验证码的实现方法

    在PHP网站开发中,验证码可以有效地保护我们的表单不被恶意提交,但是如果不使用算式验证码或者汉字验证码,仅仅使用简单的字母或者数字验证码,这样的验证码方案真的安全吗? 大家知道简单数字或者字母验证码很 ...

  7. gitbook构建文档命令

    安装node: sudo ln -s /opt/node-v8.3.9-linux-x64/bin/node /usr/local/bin/node sudo ln -s /opt/node-v8.3 ...

  8. 非常简单的方法实现ViewPager自动循环轮播

    非常简单的方法实现ViewPager自动循环轮播,见红色代码部分,其它的代码可以忽略不看. 简洁高效是我解决问题的首要出发点. package com.shuivy.happylendandreadb ...

  9. BZOJ2759一个动态树好题 LCT

    题如其名啊 昨天晚上写了一发忘保存 只好今天又码一遍了 将题目中怕$p[i]$看做$i$的$father$ 可以发现每个联通块都是一个基环树 我们对每个基环删掉环上一条边 就可以得到一个森林了 可以用 ...

  10. C++函数模版的简单使用

    模版算是C++的独有特性吧,也算是C++中比较难的地方,我平时开发的时候用的非常少,或者几乎没有用到,需要模版的地方是能看懂框架中相关的代码: 模版函数相对还是很简单的,引入模版的目的在于代码的重用: ...