C++角度的gin框架 | 青训营笔记

412 阅读2分钟

这是我参与[第五届青训营]的第七天

gin框架中采用的路由是基于httprouter的

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.String(http.StatusOK, "hello word")
    })
    r.POST("/xxxpost",getting)
    r.PUT("/xxxput")
    //监听端口默认为8080
    r.Run(":8000")
}

gin支持Restful(Representational State Transfer 表现层状态转化)风格的API,使用URL定位资源,用HTTP描述操作。

在C++中,比较常用的网络框架有Crow、Oat++、Drogon。 Crow是受到Python Flask启发的微型web框架

  • 简单的路由,类似于Flask
  • 类型安全的处理方法
  • 快速
  • 快速的JSON解析器,可以使用json11或rapidjson以获得更好的速度或可读性。
  • 基于Mustache的模板库
  • 仅提供头文件
  • 中间件和网络套接字支持

Oat++是轻量级且强大的零依赖web框架

  • 可用于嵌入式设备上的REST API、微服务和高负载云应用的构建。大多数情况下用于物联网和机器人
  • 可以便捷地移植到有线程和网络栈的地方
  • 尽量使用简单API,在特定情况,如大量用户提供下载服务、流式传输到大量客户端、websocket服务器等可以使用异步API

Drogon是一个快速的跨平台网络框架

  • 支持cookies和内建的session
  • 支持后端渲染,把控制器生成的数据交给视图生成html页面,视图由CSP模板文件描述,
  • 支持运行期的视图页面动态加载
  • 基于非阻塞IO实现的异步数据库读写
  • 轻量级ORM的实现
  • 支持协程
/// The header file
#pragma once
#include <drogon/HttpController.h>
using namespace drogon;
namespace api
{
namespace v1
{
class User : public drogon::HttpController<User>
{
  public:
    METHOD_LIST_BEGIN
    //use METHOD_ADD to add your custom processing function here;
    METHOD_ADD(User::getInfo, "/{id}", Get);                  //path is /api/v1/User/{arg1}
    METHOD_ADD(User::getDetailInfo, "/{id}/detailinfo", Get);  //path is /api/v1/User/{arg1}/detailinfo
    METHOD_ADD(User::newUser, "/{name}", Post);                 //path is /api/v1/User/{arg1}
    METHOD_LIST_END
    //your declaration of processing function maybe like this:
    void getInfo(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, int userId) const;
    void getDetailInfo(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, int userId) const;
    void newUser(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, std::string &&userName);
  public:
    User()
    {
        LOG_DEBUG << "User constructor!";
    }
};
} // namespace v1
} // namespace api

以上是通过HttpController类创建一个RESTful API的例子。