Go to file
2019-10-28 04:09:56 +02:00
cmake update installation scripts 2019-01-28 18:16:07 +02:00
src network::ConnectionPool. Add connection provider properties. 2019-10-20 18:48:34 +03:00
test Better ConnectionPool. Introduce wrappers ServerConnectionPool, ClientConnectionPool. 2019-10-20 17:22:06 +03:00
utility better cmake scripts 2019-01-25 16:38:19 +02:00
.gitignore better .gitignore 2019-08-05 00:31:00 +04:00
azure-pipelines.yml CI. Cleanup azure-pipelines.yml 2019-08-16 03:56:51 +03:00
CMakeLists.txt Feature async::Executor. Suggest threads count. 2019-09-02 03:48:31 +03:00
CODE_OF_CONDUCT.md Create CODE_OF_CONDUCT.md 2019-05-09 20:12:15 +03:00
CONTRIBUTING.md Fix typos 2019-05-11 10:56:33 +01:00
lgtm.yml fixing lgtm.yml 2019-01-25 15:08:10 +02:00
LICENSE Initial commit 2018-03-13 03:52:44 +02:00
README.md Better Readme 2019-10-28 04:09:56 +02:00

Oat++ oatpp build status Language grade: C/C++ Join the chat at https://gitter.im/oatpp-framework/Lobby

Oat++ is the 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 small memory footprint.

Contributors wanted!

Join the community

API - High Level Overview

Object Mapping

For more info see Data Transfer Object (DTO).

Declare DTO

class UserDto : public oatpp::data::mapping::type::Object {

  DTO_INIT(UserDto, Object)

  DTO_FIELD(Int64, id);
  DTO_FIELD(String, name);

};

Serialize DTO Using ObjectMapper

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);

API Controller - Request Mapping

For more info see Api Controller

Declare Endpoint

ENDPOINT("PUT", "/users/{userId}", putUser,
         PATH(Int64, userId),
         BODY_DTO(dto::UserDto::ObjectWrapper, userDto)) 
{
  userDto->id = userId;
  return createDtoResponse(Status::CODE_200, m_database->updateUser(userDto));
}

Add CORS for Endpoint

For more info see Api Controller / CORS

ADD_CORS(putUser)
ENDPOINT("PUT", "/users/{userId}", putUser,
         PATH(Int64, userId),
         BODY_DTO(dto::UserDto::ObjectWrapper, userDto)) 
{
  userDto->id = userId;
  return createDtoResponse(Status::CODE_200, m_database->updateUser(userDto));
}

Endpoint with Authorization

For more info see Api Controller / Authorization

using namespace oatpp::web::server::handler;
  
ENDPOINT("PUT", "/users/{userId}", putUser,
         AUTHORIZATION(std::shared_ptr<DefaultBasicAuthorizationObject>, authObject),
         PATH(Int64, userId),
         BODY_DTO(dto::UserDto::ObjectWrapper, userDto)) 
{
  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));
}

API Client - Retrofit / Feign Like Client

For more info see Api Client

Declare Client

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

auto response = userService->getUserById(id);
auto user = response->readBodyToDto<dto::UserDto>(objectMapper);

Swagger-UI Annotations

For more info see Endpoint Annotation And API Documentation

Additional Endpoint Info

ENDPOINT_INFO(putUser) {
  // general
  info->summary = "Update User by userId";
  info->addConsumes<dto::UserDto::ObjectWrapper>("application/json");
  info->addResponse<dto::UserDto::ObjectWrapper>(Status::CODE_200, "application/json");
  info->addResponse<String>(Status::CODE_404, "text/plain");
  // params specific
  info->pathParams["userId"].description = "User Identifier";
}
ENDPOINT("PUT", "/users/{userId}", putUser,
         PATH(Int64, userId),
         BODY_DTO(dto::UserDto::ObjectWrapper, userDto)) 
{
  userDto->id = userId;
  return createDtoResponse(Status::CODE_200, m_database->updateUser(userDto));
}

Examples:

  • 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.