oat++ oatpp build status Language grade: C/C++ Join the chat at https://gitter.im/oatpp-framework/Lobby
Zero-Dependency. Performance oriented web-service-development framework.
Organic. Pure C++.
Cross-Platform Linux/Unix/Windows. See full list of supported-platforms.
- Website
- Docs
- Api Reference
- Latest Benchmarks: 5 Million WebSockets
Contributors wanted!
Join the community
- Join discussion on Gitter. oat++ framework/Lobby
- Follow us on Twitter for latest news. @oatpp_io
- Join community on Reddit. r/oatpp
- Blazingly fast
- Zero Dependency
- Asynchronous server (High performance. Handle over 5 Million simultaneous WebSocket connections on a single server.) See benchmark
- Multithreaded server (Simple API)
- Connection agnostic. (Use whatever transport. Whatever SSL backend. Whatever sockets, pipes, files. etc. It cares about HTTP stream only)
- REST framework (with ability to autodocument endpoints see oatpp-swagger)
- Retrofit-like client wrapper (Use whatever request executor for example cURL, or minimalistic one provided out of the box)
- Object mapping (Fast object serialization-deserialization. Currently JSON, more formats comes shortly)
- Simple dependency injection framework
- Simple Test framework
- HTTP_1.1 (2.0 comes shortly)
"Simple API" refers to as API used together with oatpp::web::server::HttpConnectionHandler utilizing multithreading plus blocking-IO approach.
ENDPOINT("GET", "demo/api/hello", hello) { return createResponse(Status::CODE_200, "Hello World!"); }
ENDPOINT("GET", "demo/api/param/{param}", getWithParams, PATH(String, param)) { return createResponse(Status::CODE_200, "param=" + param); }
ENDPOINT("GET", "demo/api/json", getJson) { auto dto = MyDto::createShared(); dto->statusCode = 200; dto->message = "Hello json"; return createDtoResponse(Status::CODE_200, dto); }
Output:
{"message": "Hello json", "statusCode": 200}
ENDPOINT("POST", "demo/api/json", postJson, BODY_DTO(MyDto::ObjectWrapper, dto)) { auto dtoMessage = dto->message; return createResponse(Status::CODE_200, "dtoMessage: " + dtoMessage); }
Terminal:
$ curl -X POST "localhost:8001/demo/api/json" -d '{"message": "hello json post"}'
dtoMessage: hello json post
"Async API" refers to as API used together with oatpp::web::server::AsyncHttpConnectionHandler utilizing oatpp-coroutines plus non-blocking-IO approach.
ENDPOINT_ASYNC("GET", "demo/api_async/hello", HelloAsync) { ENDPOINT_ASYNC_INIT(HelloAsync) Action act() override { return _return(controller->createResponse(Status::CODE_200, "Hello World Async API!")); } };
ENDPOINT_ASYNC("GET", "demo/api_async/param/{param}", GetWithParamsAsync) { ENDPOINT_ASYNC_INIT(GetWithParamsAsync) Action act() override { auto param = request->getPathVariable("param"); return _return(controller->createResponse(Status::CODE_200, "param=" + param)); } };
ENDPOINT_ASYNC("GET", "demo/api_async/json", GetJSONAsync) { ENDPOINT_ASYNC_INIT(GetJSONAsync) Action act() override { auto dto = MyDto::createShared(); dto->statusCode = 200; dto->message = "Hello json"; return _return(controller->createDtoResponse(Status::CODE_200, dto)); } };
Output:
{"message": "Hello json", "statusCode": 200}
ENDPOINT_ASYNC("POST", "demo/api_async/json", PostJSONAsync) { ENDPOINT_ASYNC_INIT(PostJSONAsync) Action act() override { return request->readBodyToDtoAsync<MyDto>(controller->getDefaultObjectMapper()).callbackTo(&PostJSONAsync::onBodyObtained); } Action onBodyObtained(const MyDto::ObjectWrapper& dto) { return _return(controller->createResponse(Status::CODE_200, "dtoMessage: " + dto->message)); } };
Terminal:
$ curl -X POST "localhost:8001/demo/api_async/json" -d '{"message": "hello json post"}'
dtoMessage: hello json post
ENDPOINT_INFO(createUser) { info->summary = "Create new User"; info->addConsumes<UserDto::ObjectWrapper>("application/json"); info->addResponse<UserDto::ObjectWrapper>(Status::CODE_200, "application/json"); } ENDPOINT("POST", "demo/api/users", createUser, BODY_DTO(UserDto::ObjectWrapper, userDto)) { return createDtoResponse(Status::CODE_200, m_database->createUser(userDto)); }
Grab any project from examples, and follow README
- Media-Stream (Http-Live-Streaming) - Example project of how-to build HLS-streaming server using oat++ Async-API.
- CRUD - Example project of how-to create basic CRUD endpoints.
- AsyncApi - Example project of how-to use asynchronous API for handling large number of simultaneous connections.
- ApiClient-Demo - Example project of how-to use Retrofit-like client wrapper (ApiClient) and how it works.
- TLS-Libressl - Example project of how-to setup secure connection and serve via HTTPS.
- Consul - Example project of how-to use oatpp::consul::Client. Integration with Consul.
- PostgreSQL - Example of a production grade entity service storing information in PostgreSQL. With Swagger-UI and configuration profiles.
- WebSocket - Collection of oatpp WebSocket examples.