当前位置: 首页 > news >正文

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博客

相关文章:

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

目录 一.简介 二.编译Oat 1.环境 2.编译/安装 三.试用 1.创建一个 CMake 项目 2.自定义客户端请求响应 3.将请求Router到服务器 4.用浏览器验证 一.简介 Oat是一个面向C的现代Web框架 官网地址&#xff1a;https://oatpp.io github地址&#xff1a;https://github.co…...

openssl3.2 - 官方demo学习 - digest - EVP_MD_demo.c

文章目录 openssl3.2 - 官方demo学习 - digest - EVP_MD_demo.c概述笔记END openssl3.2 - 官方demo学习 - digest - EVP_MD_demo.c 概述 使用 SHA3-512 对多个buffer连续进行摘要, 最后得到一个摘要值 笔记 /*! \file EVP_MD_demo.c \note openssl3.2 - 官方demo学习 - dig…...

uniapp 编译后文字乱码的解决方案

问题: 新建的页面中编写代码&#xff0c;其中数字和图片都可以正常显示&#xff0c;只有中文编译后展示乱码 页面展示也是乱码 解决方案: 打开HuilderX编辑器的【文件】- 【以指定编码重新打开】- 【选择UTF-8】 然后重新编译就可以啦~ 希望可以帮到你啊~...

iOS中利用KeyChain永久保存用户信息的方法示例

方法示例 一、新建一个LYKeychainTool类&#xff0c;导入系统Security框架 &#xff0c;LYKeychainTool.h文件实现如下 // // LYKeychainTool.h // keyChainTest // // Created by Liyu on 2017/6/2. // Copyright © 2017年 liyu. All rights reserved. //#import <F…...

基于时域有限差分法的FDTD的计算电磁学算法(含Matlab代码)-YEE网格下的更新公式推导

基于时域有限差分法的FDTD的计算电磁学算法&#xff08;含Matlab代码&#xff09;-YEE网格下的更新公式推导 参考书籍&#xff1a;The finite-difference time-domain method for electromagnetics with MATLAB simulations&#xff08;国内翻译版本&#xff1a;MATLAB模拟的电…...

win10使用debug,汇编初学

DOSBox挂载Debug.exe 双击 DOSBox Options.bat 打开配置 或者执行cmd DOSBox.exe -editconf notepad.exe -editconf %SystemRoot%\system32\notepad.exe -editconf %WINDIR%\notepad.exe最后一行增加 mount [盘符] [挂载的工作目录&#xff08;debug.exe文件夹位置&#xff…...

怎么投稿各大媒体网站?

怎么投稿各大媒体网站&#xff1f;这是很多写作者及自媒体从业者经常面临的问题。在信息爆炸的时代&#xff0c;如何将自己的文章推送到广大读者面前&#xff0c;成为了一个不可避免的挑战。本文将为大家介绍一种简单有效的投稿方法——媒介库发稿平台发稿&#xff0c;帮助大家…...

chatgpt免费使用的网站

前言 如果您认为本文对你有帮助&#xff0c;希望可以点赞收藏&#xff01;感谢您的支持 下面我为你推荐我自己在用的gpt类工具&#xff0c;帮你在工作学习生活上解决一些大小问题 &#x1f389;智能GPT 地址&#xff1a; https://meet.adminjs.net 在他的详情中有详细的使用…...

音频编辑软件:Studio One 6 中文

Studio One 6是一款功能强大的数字音乐制作软件&#xff0c;为用户提供一站式音乐制作解决方案。它具有直观的界面和强大的音频录制、编辑、混音和制作功能&#xff0c;支持虚拟乐器、效果器和第三方插件&#xff0c;可帮助用户实现高质量的音乐创作和制作。同时&#xff0c;St…...

MySQL语句|使用UNION和UNION ALL合并两个或多个 SELECT 语句的结果集

文章目录 举个通用的例子举个实际的例子 在MySQL中&#xff0c; UNION 和 UNION ALL 是用于合并两个或多个 SELECT 语句的结果集的操作符。 UNION 会去除结果集中的重复行&#xff0c;返回唯一的行&#xff0c;而 UNION ALL 会返回所有的行&#xff0c;包括重复行。 举个通…...

UNRAID 优盘制作

使用方法和开心方法&#xff1a; 如果重启之后显示器有信号但是黑屏无法正常引导系统&#xff0c;此为九代以后主板快速开机&#xff08;快速引导&#xff09;UNRAID并不支持快速引导所以会直接卡黑屏。所以发现这种情况的时候请进BIOS关闭和开机快速引导或和快有关系的任何开…...

二、Java中SpringBoot组件集成接入【MySQL和MybatisPlus】

二、Java中SpringBoot组件集成接入【MySQL和MybatisPlus】 1.MySQL和MybatisPlus简介2.maven依赖3.配置1.在application.yaml配置中加入mysql配置2.新增Mybatis-Plus配置类 4.参考文章 1.MySQL和MybatisPlus简介 MySQL是一种开源的关系型数据库管理系统&#xff0c;被广泛应用…...

银行测试--------转账

转账 付款账号测试 付款账号是借记卡&#xff0c;也可以是活期存折信用卡&#xff0c;定期存折不能转出。一般在账号选择的时候进行屏蔽转出账户在销户&#xff0c;冻结&#xff0c;挂失等异常状态&#xff0c;不能进行转账付款账号金额不够 转账金额测试 0.01&#xff5e;…...

阿里云最新优惠券领取方法及优惠活动汇总

随着互联网的飞速发展&#xff0c;云服务已经成为企业和个人使用的重要基础设施。阿里云作为全球领先的云服务提供商&#xff0c;一直致力于为用户提供优质的云服务。为了回馈用户&#xff0c;阿里云会定期推出各种优惠券和优惠活动&#xff0c;本文将为大家介绍阿里云最新优惠…...

动态分配内存的风险

1. 悬挂指针问题 在指针释放之后要将指针置空 delete ptr; ptr nullptr;2.内存碎片问题 频繁的申请与释放小块内存会造成大量的内存碎片。 3.内存申请与释放问题 C与C的内存申请与释放最好不要混用。 4.复制内存 基本语法 void* memcpy(void* _Dst, void* _Src, size_…...

多行SQL转成单行SQL

如下图所示 将以上多行SQL转成单行SQL 正则表达式如下 (?s)$[^a-zA-Z()0-9]*结果如下 灵活使用,也未必只能使用Sublime Text...

wpf的资源路径

1、手动命名空间 xmlns:share"clr-namespace:***;assembly**" 2、资源文件 Pack URI 编译到本地程序集内的资源文件的 pack URI 使用以下授权和路径&#xff1a; 授权&#xff1a;application:///。 路径&#xff1a;资源文件的名称&#xff0c;包括其相对于本地…...

shell 脚本之一键部署安装 Nginx

定义一个变量来存放 nginx 版本号 version1.15.4nginx 下载地址&#xff1a;http://nginx.org/download/ 下列函数功能则是判断当前步骤是否执行成功&#xff0c;并将结果输出出来 function show_result(){if [ "$1" -eq 0 ]thenecho -e "\e[32m$2 is Succes…...

第01章_Java语言概述拓展练习(为什么要设置path?)

文章目录 第01章_Java语言概述拓展练习1、System.out.println()和System.out.print()有什么区别&#xff1f;2、一个".java"源文件中是否可以包括多个类&#xff1f;有什么限制&#xff1f;3、Something类的文件名叫OtherThing.java是否可以&#xff1f;4、为什么要设…...

手机直连卫星及NTN简介

一、手机直连卫星的发展现状 近日&#xff0c;华为推出了支持北斗卫星短报文的Mate 50旗舰机、P60系列&#xff0c;苹果也跟Globalstar&#xff08;全球星&#xff09;合作推出了支持卫星求救的iPhone14&#xff0c;最亮眼的还是华为的。这几款产品揭开了卫星通信探索消费领域…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...