mirror of
https://gitee.com/zyjblog/oatpp.git
synced 2024-12-22 22:16:37 +08:00
cmake | ||
src | ||
test | ||
utility | ||
.gitignore | ||
azure-pipelines.yml | ||
CMakeLists.txt | ||
CODE_OF_CONDUCT.md | ||
CONTRIBUTING.md | ||
lgtm.yml | ||
LICENSE | ||
README.md |
Oat++
Modern Web Framework for C++. High performance, simple API, cross platform, zero dependency.
Works on 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
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.