2019-10-07 07:57:22 +08:00
# Oat++ [![oatpp build status](https://dev.azure.com/lganzzzo/lganzzzo/_apis/build/status/oatpp.oatpp)](https://dev.azure.com/lganzzzo/lganzzzo/_build?definitionId=1) [![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/oatpp/oatpp.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/oatpp/oatpp/context:cpp) [![Join the chat at https://gitter.im/oatpp-framework/Lobby](https://badges.gitter.im/oatpp-framework/Lobby.svg)](https://gitter.im/oatpp-framework/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
2018-03-13 12:04:53 +08:00
2020-05-10 04:12:39 +08:00
---
**Attention**
2020-05-17 09:53:31 +08:00
Version `1.1.0` introduces breaking changes. See the
2020-05-17 09:34:17 +08:00
[changelog ](changelog/1.1.0.md ) for details.
2020-05-10 04:12:39 +08:00
---
2020-05-31 16:11:53 +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.
2018-10-18 07:54:45 +08:00
2020-05-31 16:11:53 +08:00
**Start**
- [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
**About**
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
2020-05-31 16:11:53 +08:00
**Join Our Community**
- Chat on **Gitter** . [Oat++ framework/Lobby ](https://gitter.im/oatpp-framework/Lobby )
2019-05-10 02:42:34 +08:00
- Follow us on **Twitter** for latest news. [@oatpp_io ](https://twitter.com/oatpp_io )
2019-05-11 19:11:08 +08:00
- Join community on **Reddit** . [r/oatpp ](https://www.reddit.com/r/oatpp/ )
2018-10-15 19:26:33 +08:00
2019-10-28 10:15:26 +08:00
## High Level Overview
2018-03-13 12:04:53 +08:00
2019-10-28 10:25:45 +08:00
- [API Controller And Request Mapping ](#api-controller-and-request-mapping )
* [Declare Endpoint ](#declare-endpoint )
* [Add CORS for Endpoint ](#add-cors-for-endpoint )
* [Endpoint with Authorization ](#endpoint-with-authorization )
- [Swagger-UI Annotations ](#swagger-ui-annotations )
* [Additional Endpoint Info ](#additional-endpoint-info )
- [API Client - Retrofit / Feign Like Client ](#api-client---retrofit--feign-like-client )
* [Declare Client ](#declare-client )
* [Using API Client ](#using-api-client )
- [Object Mapping ](#object-mapping )
* [Declare DTO ](#declare-dto )
* [Serialize DTO Using ObjectMapper ](#serialize-dto-using-objectmapper )
2019-10-28 10:15:26 +08:00
### API Controller And Request Mapping
2018-10-14 17:49:59 +08:00
2019-10-28 10:09:56 +08:00
For more info see [Api Controller ](https://oatpp.io/docs/components/api-controller/ )
2018-10-14 17:49:59 +08:00
2019-10-28 10:09:56 +08:00
#### Declare Endpoint
2018-10-14 17:49:59 +08:00
2019-10-28 10:09:56 +08:00
```cpp
ENDPOINT("PUT", "/users/{userId}", putUser,
PATH(Int64, userId),
2020-05-23 08:34:01 +08:00
BODY_DTO(Object< UserDto > , userDto))
2019-10-28 10:09:56 +08:00
{
userDto->id = userId;
return createDtoResponse(Status::CODE_200, m_database->updateUser(userDto));
}
2018-10-14 17:49:59 +08:00
```
2019-10-28 10:09:56 +08:00
#### Add CORS for Endpoint
2018-10-14 17:49:59 +08:00
2019-10-28 10:09:56 +08:00
For more info see [Api Controller / CORS ](https://oatpp.io/docs/components/api-controller/#cors )
2018-10-14 17:49:59 +08:00
2019-10-28 10:09:56 +08:00
```cpp
ADD_CORS(putUser)
ENDPOINT("PUT", "/users/{userId}", putUser,
PATH(Int64, userId),
2020-05-23 08:34:01 +08:00
BODY_DTO(Object< UserDto > , userDto))
2019-10-28 10:09:56 +08:00
{
userDto->id = userId;
return createDtoResponse(Status::CODE_200, m_database->updateUser(userDto));
}
2018-10-14 17:49:59 +08:00
```
2019-10-28 10:09:56 +08:00
#### Endpoint with Authorization
2018-10-14 17:49:59 +08:00
2019-10-28 10:09:56 +08:00
For more info see [Api Controller / Authorization ](https://oatpp.io/docs/components/api-controller/#authorization-basic )
2018-10-14 17:49:59 +08:00
2019-10-28 10:09:56 +08:00
```cpp
using namespace oatpp::web::server::handler;
ENDPOINT("PUT", "/users/{userId}", putUser,
AUTHORIZATION(std::shared_ptr< DefaultBasicAuthorizationObject > , authObject),
PATH(Int64, userId),
2020-05-23 08:34:01 +08:00
BODY_DTO(Object< UserDto > , userDto))
2019-10-28 10:09:56 +08:00
{
OATPP_ASSERT_HTTP(authObject->userId == "Ivan" & & authObject->password == "admin", Status::CODE_401, "Unauthorized");
userDto->id = userId;
return createDtoResponse(Status::CODE_200, m_database->updateUser(userDto));
}
2018-10-14 17:49:59 +08:00
```
2019-10-28 10:09:56 +08:00
### Swagger-UI Annotations
For more info see [Endpoint Annotation And API Documentation ](https://oatpp.io/docs/components/api-controller/#endpoint-annotation-and-api-documentation )
#### Additional Endpoint Info
2018-10-15 16:49:04 +08:00
2019-10-28 10:09:56 +08:00
```cpp
ENDPOINT_INFO(putUser) {
// general
info->summary = "Update User by userId";
2020-05-23 08:34:01 +08:00
info->addConsumes< Object < UserDto > >("application/json");
info->addResponse< Object < UserDto > >(Status::CODE_200, "application/json");
2019-10-28 10:09:56 +08:00
info->addResponse< String > (Status::CODE_404, "text/plain");
// params specific
info->pathParams["userId"].description = "User Identifier";
2018-10-15 16:49:04 +08:00
}
2019-10-28 10:09:56 +08:00
ENDPOINT("PUT", "/users/{userId}", putUser,
PATH(Int64, userId),
2020-05-23 08:34:01 +08:00
BODY_DTO(Object< UserDto > , userDto))
2019-10-28 10:09:56 +08:00
{
userDto->id = userId;
return createDtoResponse(Status::CODE_200, m_database->updateUser(userDto));
2018-10-15 16:49:04 +08:00
}
```
2019-10-28 10:25:45 +08:00
### API Client - Retrofit / Feign Like Client
For more info see [Api Client ](https://oatpp.io/docs/components/api-client/ )
#### Declare Client
```cpp
class UserService : public oatpp::web::client::ApiClient {
public:
API_CLIENT_INIT(UserService)
API_CALL("GET", "/users", getUsers)
API_CALL("GET", "/users/{userId}", getUserById, PATH(Int64, userId))
};
```
#### Using API Client
```cpp
auto response = userService->getUserById(id);
2020-05-23 08:34:01 +08:00
auto user = response->readBodyToDto< oatpp::Object < UserDto > >(objectMapper);
2019-10-28 10:25:45 +08:00
```
2019-10-28 10:15:26 +08:00
### Object Mapping
For more info see [Data Transfer Object (DTO) ](https://oatpp.io/docs/components/dto/ ).
#### Declare DTO
```cpp
2020-05-23 08:34:01 +08:00
class UserDto : public oatpp::DTO {
2019-10-28 10:15:26 +08:00
2020-05-23 08:34:01 +08:00
DTO_INIT(UserDto, DTO)
2019-10-28 10:15:26 +08:00
DTO_FIELD(Int64, id);
DTO_FIELD(String, name);
};
```
#### Serialize DTO Using ObjectMapper
```cpp
using namespace oatpp::parser::json::mapping;
auto user = UserDto::createShared();
user->id = 1;
user->name = "Ivan";
auto objectMapper = ObjectMapper::createShared();
auto json = objectMapper->writeToString(user);
```
2020-05-17 09:34:17 +08:00
Output:
```json
{
"id": 1,
"name": "Ivan"
}
```
#### Serialize/Deserialize Data In Free Form
While DTO objects apply strict rules on data ser/de, you can also
serialize/deserialize data in free form using type `oatpp::Any` .
```cpp
oatpp::Fields< oatpp::Any > map = {
{"title", oatpp::String("Hello Any!")},
{"listOfAny",
oatpp::List< oatpp::Any > ({
oatpp::Int32(32),
oatpp::Float32(0.32),
oatpp::Boolean(true)
})
}
};
auto json = mapper->writeToString(map);
```
Output:
```json
{
"title": "Hello Any!",
"listOfAny": [
32,
0.3199999928474426,
true
]
}
```
2018-03-15 12:22:27 +08:00
### Examples:
2020-05-26 08:35:49 +08:00
#### REST-API
2019-01-30 06:38:28 +08:00
- [ApiClient-Demo ](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
- [AsyncApi ](https://github.com/oatpp/example-async-api ) - Example project of how-to use asynchronous API for handling large number of simultaneous connections.
- [CRUD ](https://github.com/oatpp/example-crud ) - Example project of how-to create basic CRUD endpoints.
2020-05-31 16:11:53 +08:00
2020-05-26 08:35:49 +08:00
#### WebSocket
- [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-05-26 08:35:49 +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.
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-05-26 08:35:49 +08:00
#### Streaming
- [Media-Stream (Http-Live-Streaming) ](https://github.com/oatpp/example-hls-media-stream ) - Example project of how-to build HLS-streaming server using oat++ Async-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.
#### TLS
- [TLS-Libressl ](https://github.com/oatpp/example-libressl ) - Example project how-to setup secure connection and serve via HTTPS.
#### Microservices
- [Consul ](https://github.com/oatpp/example-consul ) - Example project of how-to use oatpp::consul::Client. Integration with Consul.
- [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
#### Databases
- [MongoDB ](https://github.com/oatpp/example-mongodb ) - Example project how to work with MongoDB using [oatpp-mongo ](https://github.com/oatpp/oatpp-mongo ) mondule.
Project is a web-service with basic CRUD and Swagger-UI.
- [PostgreSQL ](https://github.com/oatpp/example-postgresql ) - Example of a production grade entity service storing information in PostgreSQL. With Swagger-UI and configuration profiles.