Qat++,轻量级开源C++ Web框架

目录

一.简介

二.编译Oat++

1.环境

2.编译/安装

三.试用

1.创建一个 CMake 项目

2.自定义客户端请求响应

3.将请求Router到服务器

4.用浏览器验证


一.简介

Oat++是一个面向C++的现代Web框架
官网地址:https://oatpp.io
github地址:https://github.com/oatpp/oatpp
Oat++具有如下特性:
●随处运行
Oat++没有任何依赖性,可以很容易地移植到各种支持的平台上(Linux、BSD、MacOS、OpenWRT、Windows)。
●构建健壮的api
使用Oat++的Simple-API,很容易就能构建出灵活而健壮的High-Level API。
●高并发
使用Oat++的Async-API,可以在单个服务器上处理超过500万个并发连接。
●访问数据库
Oat++ ORM提供了一种简单而统一的方式来访问数据库。
●保持代码一致
Oat++在整个代码中依靠对象映射(Object-Mapping)来确保API和数据模型的一致性。详见:更多
●生成API文档
使用Swagger-UI和OpenAPI 3.0.0自动记录endpoints。详见:更多
Qat++可以应用于多种不同的领域,比如构建运行在嵌入式设备的REST API,构建微服务和高负载的云应用程序。目前主要的应用案例是IOT和Robotics。
那么在实践中该如何选择Oat++的API类型呢?
优先选择Simple API,因为它开发得更加完善。如果是并发任务,就可以考虑使用Async API了,Async API通常用于以下几种场景:
●文件上传、下载
●向大量客户端推流
●Websocket聊天服务器
说起Web开发,大多数人会想到 Java、Python、Golang ... ,因为用它们实现的主流Web框架有很多:Java有非常知名的Spring全家桶,Python有大而全的Django、小而精的Flask、高性能的Tornado,Golang也有快速灵活的Gin、Echo等框架。
不过现在做C/C++开发的同学可以收回羡慕的眼神啦,Oat++作为C/C++ Web框架的后起之秀,还是非常值得研究的。

二.编译Oat++

这里以Windows为例,其他平台可参考官网。

1.环境

Window 10
Visual Studio 2017(官网测试用的就是这个版本)
CMake 3.25.1(推荐用最新版)

2.编译/安装

以管理员权限打开“VS 2017的开发人员命令提示符”窗口
否则安装的时候会报如下错误:

git clone https://github.com/oatpp/oatpp.git
cd oatpp
MD build
cd build
cmake ..
cmake --build . --target INSTALL

常用CMake参数表

参数默认值说明
CMAKE_BUILD_TYPEDebug编译类型
BUILD_SHARED_LIBSOFF默认值为OFF,此时 Oat++ 被编译Wie静态库.
OATPP_BUILD_TESTSON如果设置为OFF,表示不编译tests
OATPP_DISABLE_ENV_OBJECT_COUNTERSOFF如果设置为ON, 不统计oatpp对象(不检测内存泄漏),可以提升性能
注意: 不要用OFF去编译或运行 tests, 因为tests不检测内存泄漏.
OATPP_DISABLE_POOL_ALLOCATIONSOFF如果设置为ON,不使用 oatpp memory-pools.
OATPP_COMPAT_BUILD_NO_THREAD_LOCALOFF编译时禁用thread_local特性,详见 #81.

 几分钟就能编译安装完成,无报错。安装路径是:C:/Program Files (x86)/oatpp/lib/oatpp-1.3.0/oatpp
下图是执行cmake ..时的打印信息:

三.试用

1.创建一个 CMake 项目

CMakeLists.txt 配置如下:

cmake_minimum_required(VERSION 3.1)
project(HelloWorld)set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp handler.h)# 查找 oatpp 依赖
find_package(oatpp REQUIRED)add_executable(${PROJECT_NAME} ${SOURCE_FILES})# 将目标文件与库文件进行链接
target_link_libraries(${PROJECT_NAME} oatpp::oatpp)

2.自定义客户端请求响应

handler.h

#ifndef HANDLER_H
#define HANDLER_H#include "oatpp/web/server/HttpRequestHandler.hpp"#define O_UNUSED(x) (void)x;// 自定义请求处理程序
class Handler : public oatpp::web::server::HttpRequestHandler
{
public:// 处理传入的请求,并返回响应std::shared_ptr<OutgoingResponse> handle(const std::shared_ptr<IncomingRequest>& request) override {O_UNUSED(request);return ResponseFactory::createResponse(Status::CODE_200, "Hello, World!");}
};#endif // HANDLER_H

3.将请求Router到服务器

main.cpp

#include "oatpp/web/server/HttpConnectionHandler.hpp"
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"
#include "oatpp/network/Server.hpp"
#include "handler.h"void run()
{// 为 HTTP 请求创建路由器auto router = oatpp::web::server::HttpRouter::createShared();// 路由 GET - "/HelloWorld" 请求到处理程序router->route("GET", "/HelloWorld", std::make_shared<Handler>());// 创建 HTTP 连接处理程序auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared(router);// 创建 TCP 连接提供者auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared({"localhost", 8000, oatpp::network::Address::IP_4});// 创建服务器,它接受提供的 TCP 连接并将其传递给 HTTP 连接处理程序oatpp::network::Server server(connectionProvider, connectionHandler);// 打印服务器端口OATPP_LOGI("MyApp", "Server running on port %s", connectionProvider->getProperty("port").getData());// 运行服务器server.run();
}int main()
{// 初始化 oatpp 环境oatpp::base::Environment::init();// 运行应用run();// 销毁 oatpp 环境oatpp::base::Environment::destroy();return 0;
}

4.用浏览器验证

运行上面的服务器程序

在浏览器中访问http://localhost:8000/HelloWorld,就会显示“Hello,World!”


参考链接:https://waleon.blog.csdn.net/article/details/120376280
原文链接:Qat++,轻量级开源C++ Web框架-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/621478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[网络安全]DHCP 部署与安全

一 、DHCP作用 (Dynamic HOst Configure Protocol ) 动态IP配置协议 作用:动态自动分配IP地址 二、DHCP相关概念 地址池/作用域: (IP、子网掩码、网关、DNS、周期) 三、DHCP优点 减少工程量 避免IP避免 提高地址利用率 四、DHCP原理 成为DHCP租约过程 步骤: 1.发送 DHC…

13.Kubernetes部署Go应用完整流程:从Dockerfile到Ingress发布完整流程

本文以一个简单的Go应用Demo来演示Kubernetes应用部署的完整流程 1、Dockerfile多阶段构建 Dockerfile多阶段构建 [root@docker github]# git clone https://gitee.com/yxydde/http-dump.git [root@docker github]# cd http-dump/ [root@docker http-dump]# cat Dockerfile …

15个为你的品牌增加曝光的维基百科推广方法-华媒舍

维基百科是全球最大的免费在线百科全书&#xff0c;拥有庞大的用户群体和高质量的内容。在如今竞争激烈的市场中&#xff0c;利用维基百科推广品牌和增加曝光度已成为许多企业的重要策略。本文将介绍15种方法&#xff0c;帮助你有效地利用维基百科推广品牌&#xff0c;提升曝光…

八. 实战:CUDA-BEVFusion部署分析-学习spconv的优化方案(Explicit GEMM conv)

目录 前言0. 简述1. 什么是Explicit GEMM Conv2. im2col3. spconv是如何使用Explicit GEMM Conv的4. 使用Explicit GEMM Conv处理spconv的优缺点5. 拓展-conv加速5.1 Introduction5.2 im2col5.3 Forward graph5.4 Backward graph5.5 Python example for forward propagation5.6…

Java数据结构与算法

0.数据机构和算法架构图 1.第一章 数据结构与算法介绍 2.第二章 数据结构与算法概述 3.第三章 稀疏数组和队列 4.第四章 链表 5.第五章 栈 6.第六章 递归 7.第七章 排序算法 8.第八章 查找算法 9.第九章 哈希表 10.第十章 树结构基础部分 11.第十一章 树结构实际应用…

工智能基础知识总结--深度学习中的优化方法

深度学习中的优化问题通常指的是:寻找神经网络上的一组参数 θ \theta θ,它能显著地降低代价函数 J ( θ ) J(\theta) J(θ

【Proteus仿真】【Arduino单片机】智能感应温控风扇

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用LCD1602液晶显示模块、DS18B20温度、按键、声光报警、L293D电机驱动等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示传感器检…

高级JavaScript。同步和异步,阻塞和非阻塞

同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 在当什么是同步和异步&#xff0c;阻塞与非阻塞的概念还没弄清楚之前&#xff0c;更别提上面这些组合术语了&#xff0c;只会让你更加困惑。 同步和异步 同步和异步其实指的是&#xff0c;请求发起方对消息结果的获取是主动发起…

[BUG] Edge出现 0x80190001

前言&#xff1a; 我在登录edge微软账户的时候&#xff0c;出现了 解决&#xff1a; 关闭wifi的ipv6&#xff0c;然后断开wifi&#xff0c;重新连接

uniCloud - 云函数 的基本使用

目录 基本概念 简介 快速上手 1.新建云函数 2.使用云函数 callFunction方法 云函数的入参 获取云函数调用来源 云函数的返回格式 uniCloud响应体规范 总结案例 新建云函数 使用云函数 展示 基本概念 云函数即在云端&#xff08;服务器端&#xff09;运行的函数。…

SpringFramework实战指南(二)

SpringFramework实战指南&#xff08;二&#xff09; 2.1 Spring 和 SpringFramework概念2.2 SpringFramework主要功能模块2.3 SpringFramework 主要优势 2.1 Spring 和 SpringFramework概念 Spring-ioc 广义的 Spring&#xff1a;Spring 技术栈&#xff08;全家桶&#xff0…

odoo17基础培训1-odoo开发基础知识准备以及odoo17开发环境安装

odoo17基础培训 一、odoo开发基础知识准备以及odoo17开发环境安装 1、odoo是什么&#xff1f; 当我介绍客户使用odoo系统作为业务管理平台时&#xff0c;有时会被问到Odoo是什么&#xff1f; 简单点&#xff0c;可以这么说&#xff1a; Odoo是一套完整的系统&#xff0c;是…

ssm基于web的电影购票系统+vue论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统电影购票信息管理难度大&#xff0c;容错率低&#xff0c…

使用 C++/WinRT 的集合

在内部&#xff0c;Windows 运行时集合具有大量复杂的移动部件。 但要将集合对象传递到 Windows 运行时函数&#xff0c;或要实现自己的集合属性和集合类型时&#xff0c;C/WinRT 中有函数和基类可以提供支持。 这些功能消除复杂性&#xff0c;并节省大量时间和精力上的开销。 …

指定GPU无效

今天在进行模型训练的时候遇到这样一个问题&#xff1a;我想要模型在第1块显卡上进行训练&#xff0c;但是不论怎么指定GPU&#xff0c;模型始终是在第0块显卡上进行训练&#xff0c;很是不理解为什么这样&#xff1f; 经过查找资料&#xff0c;发现一个问题&#xff1a;如果在…

Python基础知识:整理14 利用pyecharts生成地图

1 地图可视化的基本使用 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts # 准备地图对象 map Map()# 准备数据 data [("北京市", 8), ("上海市", 99), ("广州省", 199), ("重庆市", 400), ("…

在FFmpeg源码下增加自定义程序

为了了解FFmpeg解码的细节&#xff0c;使用avcodec_send_packet和avcodec_receive_frame组合&#xff0c;写了一个简单的例子&#xff0c;解码video生成yuv文件&#xff0c;比起用FFmpeg跟踪代码要简单很多。 但是问题是在FFmpeg下编译的ffmpeg/ffplay都可以直接跟踪调试&…

什么是RESTful接口风格

开头语&#xff1a; 大家好&#xff01;欢迎来到本篇博客&#xff0c;今天我们将深入讨论RESTful接口风格。RESTful是一种设计风格&#xff0c;用于构建可扩展、可维护的网络服务。本文将为您介绍RESTful的基本概念、设计原则以及实际应用中的一些技巧。 RESTful接口风格分享&…

el-popover设置 :visible 手动关闭弹窗后,无法点击空白处关闭弹窗。

<script setup lang"ts"> import { ref, unref } from "vue"; import { ClickOutside as vClickOutside } from "element-plus";const popoverShow ref(false); //是否显示 const popoverRef ref();/**点击空白处隐藏 */ const onClickO…

DSL查询文档--各种查询

DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1查询所有 结果&#xff1a; 2全文检索&#xff08;full text&#xff09;查询 常见的全文检索查询包括&#xff1a; match查询&#xff1a;单字段查询 multi_match查询&#xff1a;多字段查询&#xff…