龙空技术网

Cinatra:高性能现代C++ Web框架

CSDN 514

前言:

当前小伙伴们对“c语言的界面设计”都比较珍视,我们都想要分析一些“c语言的界面设计”的相关文章。那么小编在网络上收集了一些有关“c语言的界面设计””的相关文章,希望小伙伴们能喜欢,兄弟们快快来学习一下吧!

Cinatra是由C++开源社区purecpp发起的一个开源项目,是一个现代C++写的Web框架,旨在给用户提供一个易用、灵活和高性能的Web框架,让用户能完全专注于核心逻辑而无需关注http细节。它的灵感来源于Sinatra,但又有自己的特色。目前正式发布第一个版本Cinatra0.9.0。开发者包括:江南、网事如风、SIGSEGV、海盗、福尔摩斯喵。

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

Cinatra逻辑视图

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

参考示例:

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

运行起来之后,在浏览器中输入: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 0;}

浏览器中输入: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, intb);

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

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

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

structCheckLoginAspect{  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(0, 7, "/public"))    {      // 跳转到登陆页面      res.redirect("/login.html");    }  }  void after(Request&  req , Response&  res)  {  }};#include<cinatra/cinatra.hpp>usingnamespace cinatra;int main{  Cinatra<CheckLoginAspect> app;  app.route("/", (Request&  req , Response& res)  {    res.end("Hello Cinatra");  });app.listen("http").run;  return 0;}

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

structCheckLoginAspect{  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(0, 7, "/public"))    {      // 跳转到登陆页面      res.redirect("/login.html");    }  }  void after(Request&  req , Response&  res)  {  }};structLogAspect{  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>usingnamespace cinatra;int main{  Cinatra<CheckLoginAspect, LogAspect> app; //扩展了一个记录日志的切面  app.route("/", (Request&  req , Response& res)  {    res.end("Hello Cinatra");  });app.listen("http").run;  return 0;}

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

httpshtml模板websocketcinatra打造purecpp社区

更多参考示例,请移步社区和Github。

标签: #c语言的界面设计