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数据库数据备份还原工具,并且还能使用 ...
随机推荐
- 017 在SecureCRT中安装rz小工具
1.安装yum 2.上传本地的文件进虚拟机 3.注意点 只是属于SecureCRT的命令,同时,在上传的位置是现在所在的位置 4.测试
- 《Gradle权威指南》--Android Gradle插件
No1: Android Gradle插件分类 App插件id:com.android.application Library插件id:com.android.library Test插件id:com ...
- P2376 [USACO09OCT]津贴Allowance
P2376 [USACO09OCT]津贴Allowance一开始想的是多重背包,但是实践不了.实际是贪心,让多c尽可能少,所以先放大的,最后让小的来弥补. #include<iostream&g ...
- 不一样的go语言之入门篇-Hello World
这是<不一样的go语言>的开篇之作,我尝试以java语言转变者的角度来聊一聊go语言.所以今天先从go语言的基础开始,即语法. 学习一门新的编程语言,必从语法开始.但需要注意的是, ...
- Spring框架学习02——Spring IOC 详解
1.Spring IOC的基本概念 IOC(Inverse of Control)反转控制的概念,就是将原本在程序中手动创建对象的控制权,交由Spring框架管理.当某个Java对象(调用者)需要调用 ...
- scss、less 对浏览器兼容的处理方法, css 的单行溢出、多行溢出
1. scss @mixin rounded($param1,$param2) { #{$param1}:$param2; -webkit-#{$param1}: $param2; ...
- 17,EasyNetQ-替换EasyNetQ组件
EasyNetQ是一个由小型组件组成的库. 当你写: var bus = RabbitHutch.CreateBus("host=localhost"); ...静态方法Creat ...
- jQuery.when().done()
在使用jQuery.when()调用外部声明方法时,如果方法不为Deferred(延时)对象,则done会立即执行,所有需要在调用的方法声明一个var deferred = $.Deferred(); ...
- gradle 汉化
作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com gradle 汉化 android stud ...
- jQueryPrint 的简单使用
jQueryPrint 的简单使用 一.为什么要使用 jQueryPrint? 1.当然是方便的要死尼,相比于其他的方法. 2.打印整个页面或者局部页面都是非常的可以的,使用很方便. 3.如果要导出 ...