diff --git a/README.md b/README.md index 8753642..a9e6a90 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,38 @@ You can then parse `r->data()` to JSON object with your favorite JSON library. M ## Server API Examples +### Hello, World! + +```cpp +class HelloView : public webcc::View { +public: + webcc::ResponsePtr Handle(webcc::RequestPtr request) override { + if (request->method() == "GET") { + return webcc::ResponseBuilder{}.OK().Body("Hello, World!")(); + } + + return {}; + } +}; + +int main() { + try { + webcc::Server server(8080); + + server.Route("/", std::make_shared()); + + server.Run(); + + } catch (const std::exception&) { + return 1; + } + + return 0; +} +``` + +### Book Store + Suppose you want to create a book server and provide the following operations with RESTful API: - Query books based on some criterias. diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index b482753..58c2ee6 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -39,6 +39,9 @@ if(WEBCC_ENABLE_SSL) target_link_libraries(github_client ${EXAMPLE_LIBS} jsoncpp) endif() +add_executable(hello_world_server hello_world_server.cc) +target_link_libraries(hello_world_server ${EXAMPLE_LIBS}) + add_executable(rest_book_server rest_book_server.cc ${REST_BOOK_SRCS}) target_link_libraries(rest_book_server ${EXAMPLE_LIBS} jsoncpp) diff --git a/examples/hello_world_server.cc b/examples/hello_world_server.cc new file mode 100644 index 0000000..f08f022 --- /dev/null +++ b/examples/hello_world_server.cc @@ -0,0 +1,28 @@ +#include "webcc/response_builder.h" +#include "webcc/server.h" + +class HelloView : public webcc::View { +public: + webcc::ResponsePtr Handle(webcc::RequestPtr request) override { + if (request->method() == "GET") { + return webcc::ResponseBuilder{}.OK().Body("Hello, World!")(); + } + + return {}; + } +}; + +int main() { + try { + webcc::Server server(8080); + + server.Route("/", std::make_shared()); + + server.Run(); + + } catch (const std::exception&) { + return 1; + } + + return 0; +} diff --git a/examples/rest_book_client.cc b/examples/rest_book_client.cc index a54ca4b..e4cf4c5 100644 --- a/examples/rest_book_client.cc +++ b/examples/rest_book_client.cc @@ -214,6 +214,7 @@ int main(int argc, char* argv[]) { session.set_timeout(timeout); // If the request has body, default to this content type. + // Optional. session.set_media_type("application/json"); session.set_charset("utf-8"); diff --git a/webcc/server.h b/webcc/server.h index cd09c9d..6765d62 100644 --- a/webcc/server.h +++ b/webcc/server.h @@ -17,7 +17,8 @@ namespace webcc { class Server { public: - Server(std::uint16_t port, std::size_t workers, const Path& doc_root = {}); + explicit Server(std::uint16_t port, std::size_t workers = 1, + const Path& doc_root = {}); virtual ~Server() = default; @@ -26,25 +27,19 @@ public: // Route a URL to a view. // The URL should start with "/". E.g., "/instances". - bool Route(const std::string& url, ViewPtr view, const Strings& methods) { + bool Route(const std::string& url, ViewPtr view, + const Strings& methods = { "GET" }) { return request_handler_.Route(url, view, methods); } - bool Route(const std::string& url, ViewPtr view) { - return Route(url, view, { methods::kGet }); - } - // Route a regular expression URL to a view. // The URL should start with "/" and be a regular expression. // E.g., "/instances/(\\d+)". - bool Route(const RegexUrl& regex_url, ViewPtr view, const Strings& methods) { + bool Route(const RegexUrl& regex_url, ViewPtr view, + const Strings& methods = { "GET" }) { return request_handler_.Route(regex_url, view, methods); } - bool Route(const RegexUrl& regex_url, ViewPtr view) { - return request_handler_.Route(regex_url, view, { methods::kGet }); - } - // Run the loop. void Run(); diff --git a/webcc/view.cc b/webcc/view.cc deleted file mode 100644 index c2a740b..0000000 --- a/webcc/view.cc +++ /dev/null @@ -1,43 +0,0 @@ -#include "webcc/view.h" - -namespace webcc { - -// ----------------------------------------------------------------------------- -// -//ResponsePtr DetailView::Handle(RequestPtr request, const UrlArgs& args) { -// if (request->method() == methods::kGet) { -// return Get(args, UrlQuery(request->url().query())); -// } -// -// if (request->method() == methods::kPut) { -// return Put(request, args); -// } -// -// if (request->method() == methods::kPatch) { -// return Patch(request, args); -// } -// -// if (request->method() == methods::kDelete) { -// return Delete(args); -// } -// -// return ResponsePtr(); -//} -// -//ResponsePtr DetailView::Get(const UrlArgs& args, const UrlQuery& query) { -// return ResponsePtr(); -//} -// -//ResponsePtr DetailView::Put(RequestPtr request, const UrlArgs& args) { -// return ResponsePtr(); -//} -// -//ResponsePtr DetailView::Patch(RequestPtr request, const UrlArgs& args) { -// return ResponsePtr(); -//} -// -//ResponsePtr DetailView::Delete(const UrlArgs& args) { -// return ResponsePtr(); -//} - -} // namespace webcc