CINATRA发布第一个版本
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,海盗,福尔摩斯喵。
如果你发现了问题请及时到社区反馈给我们,也欢迎提出宝贵意见。希望更多的人能参与进来。
如果你觉得cinatra不错,请不要吝惜给一个star^_^。
CINATRA发布第一个版本的更多相关文章
- lms框架即将发布第一个版本了
lms微服务框架介绍 LMS框架旨在帮助开发者在.net平台下,通过简单的配置和代码即可快速的使用微服务进行开发. LMS通过.net框架的主机托管应用,内部通过dotnetty/SpanNetty实 ...
- iNeuOS工业互联平台,iNeuKernel(物联网核心组件)远程控制标准化设计与实现。发布v2.3版本。
目 录 1. 概述... 2 2. 平台演示... 2 3. 控制端与iNeuKernel的交互协议... 3 4. 设备驱动实现控制业务... 4 ...
- CDNDrive 第一个版本发布 & 布客新知第二次备份完成
CDNDrive 第一个版本发布,新适配五个图床 https://github.com/apachecn/CDNDrive 另外,布客新知第二次备份完成 TutorialsPoint:http://i ...
- Visual Studio 2017 Enterprise 发布 15.4 版本,离线安装包百度网盘下载。
Visual Studio 2017 于2017年10月13日发布 15.4 版本.该版本包含多项生产力改进,支持 .NET Standard 2.0 ,并且可以开启 Xamarin Live Pla ...
- SuperSocket 2.0 发布第一个预览版, 另寻找Yang Fan哥哥
昨天,SuperSocket的作者发布了2.0版本的第一个预览版.SuperSocket 2.0 是一个经过全新设计的,第一个完全基于.NET Core的版本.作者正在积极尝试提供更简单易用的API的 ...
- Spring Cloud Alibaba发布第二个版本,Spring 发来贺电
还是熟悉的面孔,还是熟悉的味道,不同的是,这次的配方升级了. 今年10月底,Spring Cloud联合创始人Spencer Gibb在Spring官网的博客页面宣布:阿里巴巴开源 Spring Cl ...
- PyQt 5.2 发布,此版本完全支持Qtv5.2.0
PyQt 5.2 发布,此版本完全支持Qtv5.2.0 :包括了新的 QtBluetooth,QtPositioning,QtMacExtras,QtWinExtras 和 Qt11Extras 模板 ...
- 让C/C++程序一次编译可以发布到多版本Linux之上
最近页游开放平台比较多, 每个平台要求的Linux版本各不相同, 这给开发人员部署服务器带来了很大的困难. 在本机Linux编译的程序,发布时即便将依赖的so附带到目标Linux环境,仍然会碰到依赖及 ...
- 数据库备份还原工具EMS SQL Angel for SQL Server发布1.3版本
EMS公司,是专门从事企业数据库以及内置于多层次客户服务器结构自动化开发.其EMS SQL Angel for SQL Server工具,便是SQL Servers数据库数据备份还原工具,并且还能使用 ...
随机推荐
- HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
这篇文章主要介绍了HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法,需要的朋友可以参考下 HTML5的语义化标签以及属性,可以让开发者非常方便地实现清晰的web页面 ...
- POJ 3304 Segments (叉乘判断线段相交)
<题目链接> 题目大意: 给出一些线段,判断是存在直线,使得该直线能够经过所有的线段.. 解题思路: 如果有存在这样的直线,过投影相交区域作直线的垂线,该垂线必定与每条线段相交,问题转化为 ...
- pandas学习(常用数学统计方法总结、读取或保存数据、缺省值和异常值处理)
pandas学习(常用数学统计方法总结.读取或保存数据.缺省值和异常值处理) 目录 常用数学统计方法总结 读取或保存数据 缺省值和异常值处理 常用数学统计方法总结 count 计算非NA值的数量 de ...
- FSMN结构快速解读
参考文献如下: (1) Feedforward Sequential Memory Neural Networks without Recurrent Feedback (2) Feedforward ...
- Avahi DOS攻击broadcast-avahi-dos
Avahi DOS攻击broadcast-avahi-dos Avahi是Linux下常用的类DNS服务.它可以帮助主机在没有DNS服务的局域网中,发现基于Zeroconf协议的设备和服务.该工具 ...
- Javascript中call,apply,bind的区别
一.探索call方法原理 Function.prototype.call = function(obj) { // 1.让fn中的this指向obj // eval(this.toString().r ...
- go协程使用陷阱(转)
协程中使用全局变量.局部变量.指针.map.切片等作为参数时需要注意,此变量的值变化问题. 与for 循环,搭配使用更需谨慎. 1,内置函数时直接使用局部变量,未进行参数传递 package main ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- 洛谷P1265 公路修建(Prim)
To 洛谷.1265 公路修建 题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一“行路难”的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完 ...
- SPOJ.Visible Lattice Points(莫比乌斯反演)
题目链接 /* http://www.spoj.com/problems/VLATTICE/ 题意:求一个n*n*n的晶体,有多少点可以在(0,0,0)处可以直接看到. 同BZOJ.2301 题目即要 ...