drogon/examples/simple_example/main.cc

231 lines
8.3 KiB
C++
Raw Normal View History

2018-05-04 09:51:22 +00:00
#include <iostream>
2018-10-18 07:54:57 +00:00
#include <drogon/drogon.h>
#include <vector>
#include <string>
#include "CustomCtrl.h"
#include "CustomHeaderFilter.h"
2018-06-05 06:40:03 +00:00
2018-05-11 07:33:11 +00:00
using namespace drogon;
using namespace std::chrono_literals;
2018-10-13 13:49:37 +00:00
class A : public DrObjectBase
{
2019-04-18 10:37:31 +00:00
public:
2018-10-13 13:49:37 +00:00
void handle(const HttpRequestPtr &req,
std::function<void(const HttpResponsePtr &)> &&callback,
2018-10-13 13:49:37 +00:00
int p1, const std::string &p2, const std::string &p3, int p4) const
{
2018-06-07 01:41:15 +00:00
HttpViewData data;
2018-10-13 13:49:37 +00:00
data.insert("title", std::string("ApiTest::get"));
std::map<std::string, std::string> para;
para["int p1"] = std::to_string(p1);
para["string p2"] = p2;
para["string p3"] = p3;
para["int p4"] = std::to_string(p4);
2018-06-07 01:41:15 +00:00
2018-10-13 13:49:37 +00:00
data.insert("parameters", para);
auto res = HttpResponse::newHttpViewResponse("ListParaView", data);
callback(res);
}
2018-10-13 13:49:37 +00:00
static void staticHandle(const HttpRequestPtr &req,
std::function<void(const HttpResponsePtr &)> &&callback,
2018-10-13 13:49:37 +00:00
int p1, const std::string &p2, const std::string &p3, int p4)
{
HttpViewData data;
2018-10-13 13:49:37 +00:00
data.insert("title", std::string("ApiTest::get"));
std::map<std::string, std::string> para;
para["int p1"] = std::to_string(p1);
para["string p2"] = p2;
para["string p3"] = p3;
para["int p4"] = std::to_string(p4);
2018-10-13 13:49:37 +00:00
data.insert("parameters", para);
auto res = HttpResponse::newHttpViewResponse("ListParaView", data);
2018-08-26 08:25:35 +00:00
callback(res);
}
};
2018-10-13 13:49:37 +00:00
class B : public DrObjectBase
2018-06-05 02:43:53 +00:00
{
2019-04-18 10:37:31 +00:00
public:
void operator()(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, int p1, int p2)
2018-06-05 02:43:53 +00:00
{
2018-06-07 01:41:15 +00:00
HttpViewData data;
2018-10-13 13:49:37 +00:00
data.insert("title", std::string("ApiTest::get"));
std::map<std::string, std::string> para;
para["p1"] = std::to_string(p1);
para["p2"] = std::to_string(p2);
data.insert("parameters", para);
auto res = HttpResponse::newHttpViewResponse("ListParaView", data);
2018-08-26 08:25:35 +00:00
callback(res);
2018-06-05 02:43:53 +00:00
}
};
2018-06-05 06:40:03 +00:00
namespace api
{
2018-10-13 13:49:37 +00:00
namespace v1
{
class Test : public HttpController<Test>
2018-10-13 13:49:37 +00:00
{
2019-04-18 10:37:31 +00:00
public:
2018-10-13 13:49:37 +00:00
METHOD_LIST_BEGIN
2019-03-06 07:57:05 +00:00
METHOD_ADD(Test::get, "get/{2}/{1}", Get); //path is /api/v1/test/get/{arg2}/{arg1}
METHOD_ADD(Test::list, "/{2}/info", Get); //path is /api/v1/test/{arg2}/info
2018-10-13 13:49:37 +00:00
METHOD_LIST_END
void get(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, int p1, int p2) const
2018-06-05 06:40:03 +00:00
{
2018-10-13 13:49:37 +00:00
HttpViewData data;
data.insert("title", std::string("ApiTest::get"));
std::map<std::string, std::string> para;
para["p1"] = std::to_string(p1);
para["p2"] = std::to_string(p2);
data.insert("parameters", para);
auto res = HttpResponse::newHttpViewResponse("ListParaView", data);
callback(res);
2018-06-05 06:40:03 +00:00
}
void list(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, int p1, int p2) const
2018-10-13 13:49:37 +00:00
{
HttpViewData data;
data.insert("title", std::string("ApiTest::get"));
std::map<std::string, std::string> para;
para["p1"] = std::to_string(p1);
para["p2"] = std::to_string(p2);
data.insert("parameters", para);
auto res = HttpResponse::newHttpViewResponse("ListParaView", data);
callback(res);
}
};
} // namespace v1
} // namespace api
using namespace std::placeholders;
using namespace drogon;
2018-05-11 01:25:17 +00:00
int main()
{
2018-05-11 09:39:52 +00:00
2018-10-13 13:49:37 +00:00
std::cout << banner << std::endl;
2019-03-25 15:28:22 +00:00
//app().addListener("::1", 8848);
app().addListener("0.0.0.0", 8848);
2019-01-19 05:44:24 +00:00
#ifdef USE_OPENSSL
2019-03-13 15:44:53 +00:00
//https
drogon::HttpAppFramework::instance().setSSLFiles("server.pem", "server.pem");
2019-03-13 15:44:53 +00:00
//drogon::HttpAppFramework::instance().addListener("::1", 8849, true);
2019-01-19 05:44:24 +00:00
drogon::HttpAppFramework::instance().addListener("0.0.0.0", 8849, true);
#endif
//app().setThreadNum(4);
2018-10-13 13:49:37 +00:00
// trantor::Logger::setLogLevel(trantor::Logger::TRACE);
2018-06-05 02:43:53 +00:00
//class function
app().registerHandler("/api/v1/handle1/{1}/{2}/?p3={3}&p4={4}", &A::handle);
app().registerHandler("/api/v1/handle11/{1}/{2}/?p3={3}&p4={4}", &A::staticHandle);
2018-06-07 01:41:15 +00:00
//lambda example
app().registerHandler("/api/v1/handle2/{1}/{2}", [](const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback, int a, float b) {
2019-01-29 02:49:37 +00:00
// LOG_DEBUG << "int a=" << a;
// LOG_DEBUG << "float b=" << b;
2018-06-07 01:41:15 +00:00
HttpViewData data;
2018-10-13 13:49:37 +00:00
data.insert("title", std::string("ApiTest::get"));
std::map<std::string, std::string> para;
para["a"] = std::to_string(a);
para["b"] = std::to_string(b);
data.insert("parameters", para);
auto res = HttpResponse::newHttpViewResponse("ListParaView", data);
2018-08-26 08:25:35 +00:00
callback(res);
});
2018-06-05 02:43:53 +00:00
B b;
2018-06-07 01:41:15 +00:00
//functor example
app().registerHandler("/api/v1/handle3/{1}/{2}", b);
2018-06-05 02:43:53 +00:00
A tmp;
std::function<void(const HttpRequestPtr &, std::function<void(const HttpResponsePtr &)> &&, int, const std::string &, const std::string &, int)>
2018-10-13 13:49:37 +00:00
func = std::bind(&A::handle, &tmp, _1, _2, _3, _4, _5, _6);
//api example for std::function
app().registerHandler("/api/v1/handle4/{4}/{3}/{1}", func);
2018-06-11 09:11:06 +00:00
app().setDocumentRoot("./");
app().enableSession(60);
2018-06-11 09:11:06 +00:00
//start app framework
2018-09-13 10:25:30 +00:00
//drogon::HttpAppFramework::instance().enableDynamicViewsLoading({"/tmp/views"});
app().loadConfigFile("config.example.json");
auto &json = app().getCustomConfig();
if (json.empty())
{
std::cout << "empty custom config!" << std::endl;
}
//Install custom controller
auto ctrlPtr = std::make_shared<CustomCtrl>("Hi");
app().registerController(ctrlPtr);
//Install custom filter
auto filterPtr = std::make_shared<CustomHeaderFilter>("custom_header", "yes");
app().registerFilter(filterPtr);
app().setIdleConnectionTimeout(30s);
2019-04-18 10:37:31 +00:00
//Test AOP
app().registerBeginningAdvice([]() {
LOG_DEBUG << "Event loop is running!";
});
app().registerNewConnectionAdvice([](const trantor::InetAddress &peer, const trantor::InetAddress &local) {
LOG_DEBUG << "New connection: " << peer.toIpPort() << "-->" << local.toIpPort();
return true;
});
app().registerPreRoutingAdvice([](const drogon::HttpRequestPtr &req,
drogon::AdviceCallback &&acb,
drogon::AdviceChainCallback &&accb) {
2019-04-18 10:37:31 +00:00
LOG_DEBUG << "preRouting1";
accb();
});
app().registerPostRoutingAdvice([](const drogon::HttpRequestPtr &req,
drogon::AdviceCallback &&acb,
drogon::AdviceChainCallback &&accb) {
2019-04-18 10:37:31 +00:00
LOG_DEBUG << "postRouting1";
LOG_DEBUG << "Matched path=" << req->matchedPathPattern();
accb();
});
app().registerPreHandlingAdvice([](const drogon::HttpRequestPtr &req,
drogon::AdviceCallback &&acb,
drogon::AdviceChainCallback &&accb) {
2019-04-18 10:37:31 +00:00
LOG_DEBUG << "preHandling1";
// auto resp = HttpResponse::newNotFoundResponse();
// acb(resp);
// return;
accb();
});
app().registerPostHandlingAdvice([](const drogon::HttpRequestPtr &, const drogon::HttpResponsePtr &) {
LOG_DEBUG << "postHandling1";
});
app().registerPreRoutingAdvice([](const drogon::HttpRequestPtr &req) {
LOG_DEBUG << "preRouting observer";
});
app().registerPostRoutingAdvice([](const drogon::HttpRequestPtr &req) {
LOG_DEBUG << "postRouting observer";
});
app().registerPreHandlingAdvice([](const drogon::HttpRequestPtr &req) {
LOG_DEBUG << "preHanding observer";
});
2019-04-24 06:38:07 +00:00
auto handlerInfo = app().getHandlersInfo();
for (auto &info : handlerInfo)
{
std::cout << std::get<0>(info);
switch (std::get<1>(info))
{
case Get:
std::cout << " (GET) ";
break;
case Post:
std::cout << " (POST) ";
break;
case Delete:
std::cout << " (DELETE) ";
break;
case Put:
std::cout << " (PUT) ";
break;
case Options:
std::cout << " (OPTIONS) ";
break;
case Head:
std::cout << " (Head) ";
break;
default:
break;
}
std::cout << std::get<2>(info) << std::endl;
}
app().run();
2018-05-04 09:51:22 +00:00
}