Go to file
Leonid Stryzhevskyi 55e73cb699
Update README.md
2019-06-25 03:52:17 +03:00
cmake update installation scripts 2019-01-28 18:16:07 +02:00
src Increase oatpp API version 2019-06-24 03:14:26 +03:00
test better oatpp::async::synchronize API 2019-06-23 00:14:32 +03:00
utility better cmake scripts 2019-01-25 16:38:19 +02:00
.gitignore make methods of CommandLineArguments const 2019-03-28 02:41:01 +02:00
azure-pipelines.yml try enable back CI-Mac builds as for https://github.com/oatpp/oatpp/issues/66 2019-05-01 18:35:49 +03:00
CMakeLists.txt introduce -DOATPP_COMPAT_BUILD_NO_THREAD_LOCAL flag 2019-06-07 23:25:19 +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 Update README.md 2019-06-25 03:52:17 +03:00

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

Contributors wanted!

Join the community

Features

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

"Simple API" refers to as API used together with oatpp::web::server::HttpConnectionHandler utilizing multithreading plus blocking-IO approach.

Create Endpoint

ENDPOINT("GET", "demo/api/hello", hello) {
  return createResponse(Status::CODE_200, "Hello World!");
}

Pass parameters to endpoint

ENDPOINT("GET", "demo/api/param/{param}", getWithParams,
         PATH(String, param)) {
  return createResponse(Status::CODE_200, "param=" + param);
}

Return JSON

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}

Post JSON body

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 overview

"Async API" refers to as API used together with oatpp::web::server::AsyncHttpConnectionHandler utilizing oatpp-coroutines plus non-blocking-IO approach.

Create Endpoint Async

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!"));
  }

};

Pass parameters to endpoint Async

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

};

Return JSON Async

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}

Post JSON body Async

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

Swagger documentation

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

How to start

Grab any project from examples, and follow README

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.