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数据库数据备份还原工具,并且还能使用 ...
随机推荐
- php 三元运算符实例详细介绍
三元运算符的功能与“if....else”流程语句一致,它在一行中书写,代码精练.执行效率高.在PHP程序中恰当地使用三元运算符能够让脚本更为简洁.高效.代码的语法如下: ? 1 (expr1)?(e ...
- 匿名函数 lambda
lambda 参数 : 程序体 1. filter 与匿名函数结合运用 2. map与匿名函数结合运用
- 【转】一张图解析FastAdmin中的表格列表的功能
一张图解析FastAdmin中的表格列表的功能 功能描述请根据图片上的数字索引查看对应功能说明. 1.时间筛选器如果想在搜索栏使用时间区间进行搜索,则可以在JS中修改修改字段属性,如 {field: ...
- POJ - 1266 -
题目大意:给出一条圆弧上的两个端点A,B,和圆弧上两端点之间的一个点C,现在要用一块各个定点的坐标均为整数的矩形去覆盖这个圆弧,要求最小的矩形面积. 思路:叉积在本体发挥很强大的作用.首先求出三个点所 ...
- hdu 2063 过山车【匈牙利算法】(经典)
<题目链接> RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partne ...
- 【原创】ABP之IConventionalDependencyRegistra接口分析
类图: 作用: abp中默认把对象的注册分为5中约定注册方式: 1.AbpAspNetCoreConventionalRegistrar public class AbpAspNetCoreConve ...
- 使用element-ui制作三级级联城市选择器
1.效果预览: 2.引入资源文件 1.vue资源 <script src="https://unpkg.com/vue/dist/vue.js"></script ...
- python 列表返回重复数据的下标
class Solution(object): def searchRange(self, nums, target): """ :type nums: List[int ...
- python-docx
pip install python-docx 注意不要直接下载docx包 from docx import Document from docx.shared import RGBColor,Inc ...
- 类文件结构-----Class类文件的结构
①无关性的基石 “与平台无关的”得理想最终实现在操作系统的应用层上:Sun公司和其他虚拟机提供商发布了许多可以在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序 ...