cinatra发布第一个版本

cinatra–a sinatra inspired modern c++ web framework

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平台下编译即可。

示例

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

浏览器中输入: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放到类对象中,你可以这样做。

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

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

性能

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

crow:

crow test_看图王

cinatra:

cinatra test_看图王

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

cinatra的设计

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

图片1

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

roadmap

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

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

开发和参与者

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

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

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

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

可变模板参数类作为友元类

还可以把参数名去掉:

之前遇到这个问题,感谢UnitUniverse帮助解决。

C++多返回值

第一版,随手写就,语法形式上有待优化

组合函数

组合函数是将N个一元函数组成一种更复杂的函数,每个函数的返回值作为参数传给下一个函数,直到传到最后一个函数结束。这种组合函数的能力可以使我们以一种更直观的方式去完成复杂的链式执行行为。例如有三个函数:

这种方式在使用起来不够简洁方便,如果能把这些简单函数组合起来,就可以按简单函数的方式去调用了,更加直观和简洁。比如像这样调用:

这种方式把这些函数串在一起了,内部是一个接一个调用并得到最终结果。

在c++中如何实现这种组合函数的调用呢?想想我们应该怎么做吧。我们先分析一下这种组合函数的调用的特点:

  • 都是一元函数;因为返回值要做下个函数的入参,返回值只有一个结果。
  • 一元函数的入参和返回值都是同一种类型;因为返回值要做下个函数的入参。
  • 按顺序从前往后调用。

通过上面的分析我们知道这种组合函数有个隐含的约束就是,返回值和入参必须相同,这也导致这些函数只能是一元函数。
如果希望有多个入参,则要通过变通的方式了,比如可以将一个结构体作为入参,类似于data_struct f(data_struct)来实现多个入参的问题。

好了现在看看c++中是如何实现这种调用的吧。

测试代码:

对于compose那里之前的代码在gcc下编译不过的问题做一个说明(Normandie反馈过这个问题,在此表示感谢),原因是因为GCC和vs2013对于变参的展开规则不太一样导致的,GCC的展开规则更严格。

Copy Protected by Chetan's WP-Copyprotect.