Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Charfieldvs/oatpp

Zero-Dependency. Performance oriented web-service-development framework. Organic. Pure C++.
Cross-Platform Linux/Unix/Windows. See full list of supported-platforms.

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.

About

🌱Light, high-performance web framework. Create bleedingly-fast web-services. Organic. Pure C++. Cross-platform. Linux/Unix/Windows.

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Packages

Contributors

Languages

  • C++ 98.2%
  • CMake 1.7%
  • Shell 0.1%

AltStyle によって変換されたページ (->オリジナル) /