oatpp/README.md

182 lines
8.0 KiB
Markdown
Raw Permalink Normal View History

2024-07-31 20:31:35 +08:00
2023-10-06 06:27:23 +08:00
[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://vshymanskyy.github.io/StandWithUkraine/)
---
2020-08-04 09:09:30 +08:00
<div align="center">
<img alt="Oat++ Logo" src="https://raw.githubusercontent.com/lganzzzo/oatpp-website-res/master/logo_x400.png" width="200px"/>
</div>
<p>&nbsp;</p>
<p align="center">
<a href="https://dev.azure.com/lganzzzo/lganzzzo/_build?definitionId=1">
<img src="https://dev.azure.com/lganzzzo/lganzzzo/_apis/build/status/oatpp.oatpp" alt="oatpp build status" />
</a>
<a href="https://gitter.im/oatpp-framework/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge">
<img src="https://badges.gitter.im/oatpp-framework/Lobby.svg" alt="Join the chat at https://gitter.im/oatpp-framework/Lobby" />
</a>
</p>
# Oat++
2018-03-13 12:04:53 +08:00
2024-07-31 20:47:10 +08:00
Oat++ is a modern Web Framework for C++.
It's fully loaded and contains all necessary components for effective production level development.
It's also light and has a small memory footprint.
## News
2020-09-29 07:10:38 +08:00
- ⚠️ Attention! Oat++ main repo is bumping its version to 1.4.0. While 1.4.0 is **IN DEVELOPMENT** use `1.3.0-latest` tag.
- Follow the [changelog](https://github.com/oatpp/oatpp/blob/master/changelog/1.4.0.md) for news and features in version `1.4.0`.
- Consider supporting Oat++ via the [GitHub sponsors](https://github.com/sponsors/oatpp) page.
2020-05-10 04:12:39 +08:00
2024-07-31 20:31:35 +08:00
## Start
2020-10-27 09:31:30 +08:00
2020-05-31 16:11:53 +08:00
- [Get Started](https://oatpp.io/docs/start/)
- [Build For Unix/Linux](https://oatpp.io/docs/installation/unix-linux/)
- [Build For Windows](https://oatpp.io/docs/installation/windows/)
2020-06-05 05:54:11 +08:00
- [Examples](#examples)
2020-05-31 16:11:53 +08:00
2024-07-31 20:31:35 +08:00
## Support the Project
Maintaining and developing this project requires significant time and resources. If you enjoy using it and want to support its continued development, please consider supporting us through GitHub Sponsors.
**[Become a Sponsor on GitHub](https://github.com/sponsors/oatpp)**
Every contribution, big or small, helps us keep improving and maintaining the project.
Thank you for your support!
## About
2020-10-27 09:31:30 +08:00
2019-05-10 02:42:34 +08:00
- [Website](https://oatpp.io/)
2019-10-28 10:09:56 +08:00
- [Supported Platforms](https://oatpp.io/supported-platforms/)
2019-05-20 10:16:00 +08:00
- Latest Benchmarks: [5 Million WebSockets](https://oatpp.io/benchmark/websocket/5-million/)
2020-05-31 16:11:53 +08:00
- [Contributing to Oat++](CONTRIBUTING.md)
2018-07-09 05:11:10 +08:00
2018-10-14 17:49:59 +08:00
2024-07-31 20:31:35 +08:00
2018-10-14 17:49:59 +08:00
2020-10-27 09:31:30 +08:00
## Quick Overview
2018-10-14 17:49:59 +08:00
2020-10-27 09:31:30 +08:00
**Shortcuts:**
2018-10-14 17:49:59 +08:00
2020-10-27 09:31:30 +08:00
- [Oat++ High Level Overview](https://oatpp.io/docs/start/high-level-overview/) - Get a quick overview of Oat++ features.
- [Example Project](https://github.com/oatpp/example-crud) - A complete example of a "CRUD" service (UserService) built with Oat++. REST + Swagger-UI + SQLite.
2018-10-14 17:49:59 +08:00
2020-10-27 09:31:30 +08:00
### Build Powerful API And Document It With Swagger-UI
2018-10-14 17:49:59 +08:00
2020-10-27 09:31:30 +08:00
See [ApiController](https://oatpp.io/docs/components/api-controller/) for more details.
2018-10-14 17:49:59 +08:00
2019-10-28 10:09:56 +08:00
```cpp
2020-10-27 09:31:30 +08:00
ENDPOINT_INFO(getUserById) {
info->summary = "Get one User by userId";
2018-10-14 17:49:59 +08:00
2020-05-23 08:34:01 +08:00
info->addResponse<Object<UserDto>>(Status::CODE_200, "application/json");
2020-10-27 09:31:30 +08:00
info->addResponse<Object<StatusDto>>(Status::CODE_404, "application/json");
info->addResponse<Object<StatusDto>>(Status::CODE_500, "application/json");
2019-10-28 10:09:56 +08:00
info->pathParams["userId"].description = "User Identifier";
2018-10-15 16:49:04 +08:00
}
2020-10-27 09:31:30 +08:00
ENDPOINT("GET", "users/{userId}", getUserById,
PATH(Int32, userId))
2019-10-28 10:09:56 +08:00
{
2020-10-27 09:31:30 +08:00
return createDtoResponse(Status::CODE_200, m_userService.getUserById(userId));
2018-10-15 16:49:04 +08:00
}
2020-10-27 09:31:30 +08:00
```
2018-10-15 16:49:04 +08:00
2020-10-27 09:31:30 +08:00
### Access Databases And Keep Your Data Consistent
2019-10-28 10:25:45 +08:00
2020-10-27 09:31:30 +08:00
See [Oat++ ORM](https://oatpp.io/docs/components/orm/) for more details.
2019-10-28 10:25:45 +08:00
```cpp
2020-10-27 09:31:30 +08:00
QUERY(createUser,
"INSERT INTO users (username, email, role) VALUES (:username, :email, :role);",
PARAM(oatpp::String, username),
PARAM(oatpp::String, email),
PARAM(oatpp::Enum<UserRoles>::AsString, role))
2019-10-28 10:25:45 +08:00
```
2024-07-31 20:31:35 +08:00
## Join Our Community
2020-05-17 09:34:17 +08:00
2024-07-31 20:31:35 +08:00
- [Gitter](https://gitter.im/oatpp-framework/Lobby) - Talk to Oat++ developers and to other Oat++ users.
- [Twitter](https://twitter.com/oatpp_io) - Follow Oat++ on Twitter.
- [Reddit](https://www.reddit.com/r/oatpp/) - Follow Oat++ subreddit.
- [StackOverflow (new)](https://stackoverflow.com/questions/tagged/oat%2b%2b) - Post a Question.
2020-05-17 09:34:17 +08:00
2020-10-27 09:31:30 +08:00
## Examples
2020-05-17 09:34:17 +08:00
2020-10-27 09:31:30 +08:00
### REST-API
2020-05-17 09:34:17 +08:00
2020-10-27 09:31:30 +08:00
- [REST Service](https://github.com/oatpp/example-crud) - A complete example of a "CRUD" service (UserService) built with Oat++. REST + Swagger-UI + SQLite.
- [REST Client](https://github.com/oatpp/example-api-client) - Example project of how-to use Retrofit-like client wrapper (ApiClient) and how it works.
2020-05-26 08:35:49 +08:00
2020-10-27 09:31:30 +08:00
### WebSocket
2020-05-31 16:11:53 +08:00
2020-10-27 09:31:30 +08:00
- [Can Chat](https://github.com/lganzzzo/canchat) - Feature-complete rooms-based chat for tens of thousands users. Client plus Server.
2019-06-25 08:52:17 +08:00
- [WebSocket](https://github.com/oatpp/example-websocket) - Collection of oatpp WebSocket examples.
2020-10-27 09:31:30 +08:00
- [YUV Websocket Stream](https://github.com/oatpp/example-yuv-websocket-stream) - Example project how-to create a YUV image stream from a V4L device (i.E. Webcam) using websockets.
### Databases
2020-05-26 08:35:49 +08:00
2020-10-27 09:31:30 +08:00
- [SQLite](https://github.com/oatpp/example-crud) - A complete example of a "CRUD" service. REST + Swagger-UI + SQLite.
- [PostgreSQL](https://github.com/oatpp/example-postgresql) - Example of a production-grade entity service storing information in PostgreSQL. With Swagger-UI and configuration profiles.
- [MongoDB](https://github.com/oatpp/example-mongodb) - Example project how to work with MongoDB using **oatpp-mongo** mondule. Project is a web-service with basic CRUD and Swagger-UI.
2020-06-16 21:07:00 +08:00
### IoT
- [Example-IoT-Hue](https://github.com/oatpp/example-iot-hue-ssdp) - Example project how-to create an Philips Hue compatible REST-API that is discovered and controllable by Hue compatible Smart-Home devices like Amazon Alexa or Google Echo.
2020-10-27 09:31:30 +08:00
### Streaming
2020-05-26 08:35:49 +08:00
2020-10-27 09:31:30 +08:00
- [HTTP Live Streaming Server](https://github.com/oatpp/example-hls-media-stream) - Example project on how to build an HLS-streaming server using Oat++ asynchronous API.
- [YUV Websocket Stream](https://github.com/oatpp/example-yuv-websocket-stream) - Example project how-to create a YUV image stream from a V4L device (i.E. Webcam) using websockets.
2020-05-26 08:35:49 +08:00
2020-10-27 09:31:30 +08:00
### TLS
2020-05-26 08:35:49 +08:00
2020-10-27 09:31:30 +08:00
- [TLS With Libressl](https://github.com/oatpp/example-libressl) - Example project how-to setup secure connection and serve via HTTPS.
2020-05-26 08:35:49 +08:00
2020-10-27 09:31:30 +08:00
### Microservices
2020-05-26 08:35:49 +08:00
2020-10-27 09:31:30 +08:00
- [Consul Integration](https://github.com/oatpp/example-consul) - Example project on how to use [oatpp::consul::Client](https://oatpp.io/api/latest/oatpp-consul/rest/Client/). Consul integration.
2020-05-26 08:35:49 +08:00
- [Microservices](https://github.com/oatpp/example-microservices) - Example project on how to build microservices with Oat++,
and example on how to consolidate those microservices using [monolithization](https://oatpp.io/docs/monolithization/) technique.
2020-06-16 21:07:00 +08:00
2020-10-27 09:31:30 +08:00
### Asynchronous API
2020-06-16 21:07:00 +08:00
2020-10-27 09:31:30 +08:00
- [Async Service](https://github.com/oatpp/example-async-api) - Example project on how to use asynchronous API to handle a large number of simultaneous connections.
2024-07-31 20:31:35 +08:00
## Frequently Asked Questions
### Q: "Oat++" name?
- "Oat" is something light, organic, and green. It can be easily cooked and consumed with no effort.
- "++" gives a hint that it is "something" for C++.
### Q: What is the main area of Oat++ application?
Oat++ is used for many different purposes, from building REST APIs that run on embedded devices to
building microservices and highly-loaded cloud applications.
But the majority of use cases appears to be in **IoT** and **Robotics**.
### Q: How portable is Oat++?
Theoretically, Oat++ can be **easily** ported everywhere where you have **threads** and **network stack**.
With an additional comparably small effort, it can be ported almost everywhere depending on how
much you strip it and what would be the final binary size.
See [supported platforms](https://oatpp.io/supported-platforms/) for additional info.
### Q: What is the size of a minimal Oat++ application?
About **1Mb**, depending on C/C++ std-lib and oatpp version.
### Q: Which Oat++ API to choose, Simple or Async?
Always choose **Simple API** wherever possible. Simple API is more developed and makes the code cleaner.
Async API is designed for small, specific tasks that run at high concurrency levels ex.:
- Serving file downloads to a large number of concurrent users (1K users and more).
- Streaming to a large number of clients (1K or more).
- Websocket Chat servers.
For all other purposes use simple API.