2021-03-31 17:30:32 +00:00
|
|
|
#define CROW_MAIN
|
2015-02-20 20:46:28 +00:00
|
|
|
#include "crow.h"
|
|
|
|
|
|
|
|
#include <sstream>
|
|
|
|
|
|
|
|
class ExampleLogHandler : public crow::ILogHandler {
|
|
|
|
public:
|
|
|
|
void log(std::string message, crow::LogLevel level) override {
|
|
|
|
// cerr << "ExampleLogHandler -> " << message;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ExampleMiddleware
|
|
|
|
{
|
|
|
|
std::string message;
|
|
|
|
|
2020-12-03 07:16:38 +00:00
|
|
|
ExampleMiddleware() : message("foo")
|
2015-02-20 20:46:28 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2020-12-01 06:20:46 +00:00
|
|
|
void setMessage(const std::string &newMsg)
|
2015-02-20 20:46:28 +00:00
|
|
|
{
|
|
|
|
message = newMsg;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct context
|
|
|
|
{
|
|
|
|
};
|
|
|
|
|
|
|
|
void before_handle(crow::request& req, crow::response& res, context& ctx)
|
|
|
|
{
|
|
|
|
CROW_LOG_DEBUG << " - MESSAGE: " << message;
|
|
|
|
}
|
|
|
|
|
|
|
|
void after_handle(crow::request& req, crow::response& res, context& ctx)
|
|
|
|
{
|
|
|
|
// no-op
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
crow::App<ExampleMiddleware> app;
|
|
|
|
|
|
|
|
app.get_middleware<ExampleMiddleware>().setMessage("hello");
|
|
|
|
|
|
|
|
app.route_dynamic("/")
|
|
|
|
([]{
|
|
|
|
return "Hello World!";
|
|
|
|
});
|
|
|
|
|
|
|
|
app.route_dynamic("/about")
|
|
|
|
([](){
|
|
|
|
return "About Crow example.";
|
|
|
|
});
|
|
|
|
|
|
|
|
// a request to /path should be forwarded to /path/
|
|
|
|
app.route_dynamic("/path/")
|
|
|
|
([](){
|
|
|
|
return "Trailing slash test case..";
|
|
|
|
});
|
|
|
|
|
|
|
|
// simple json response
|
|
|
|
app.route_dynamic("/json")
|
|
|
|
([]{
|
|
|
|
crow::json::wvalue x;
|
|
|
|
x["message"] = "Hello, World!";
|
|
|
|
return x;
|
|
|
|
});
|
|
|
|
|
|
|
|
app.route_dynamic("/hello/<int>")
|
|
|
|
([](int count){
|
|
|
|
if (count > 100)
|
|
|
|
return crow::response(400);
|
|
|
|
std::ostringstream os;
|
|
|
|
os << count << " bottles of beer!";
|
|
|
|
return crow::response(os.str());
|
|
|
|
});
|
|
|
|
|
|
|
|
app.route_dynamic("/add/<int>/<int>")
|
2020-12-03 07:16:38 +00:00
|
|
|
([](crow::response& res, int a, int b){
|
2015-02-20 20:46:28 +00:00
|
|
|
std::ostringstream os;
|
|
|
|
os << a+b;
|
|
|
|
res.write(os.str());
|
|
|
|
res.end();
|
|
|
|
});
|
|
|
|
|
|
|
|
// Compile error with message "Handler type is mismatched with URL paramters"
|
|
|
|
//CROW_ROUTE(app,"/another/<int>")
|
|
|
|
//([](int a, int b){
|
|
|
|
//return crow::response(500);
|
|
|
|
//});
|
|
|
|
|
|
|
|
// more json example
|
|
|
|
app.route_dynamic("/add_json")
|
2021-02-08 16:25:02 +00:00
|
|
|
.methods(crow::HTTPMethod::Post)
|
2015-02-20 20:46:28 +00:00
|
|
|
([](const crow::request& req){
|
|
|
|
auto x = crow::json::load(req.body);
|
|
|
|
if (!x)
|
|
|
|
return crow::response(400);
|
|
|
|
auto sum = x["a"].i()+x["b"].i();
|
|
|
|
std::ostringstream os;
|
|
|
|
os << sum;
|
|
|
|
return crow::response{os.str()};
|
|
|
|
});
|
|
|
|
|
|
|
|
app.route_dynamic("/params")
|
|
|
|
([](const crow::request& req){
|
|
|
|
std::ostringstream os;
|
|
|
|
os << "Params: " << req.url_params << "\n\n";
|
|
|
|
os << "The key 'foo' was " << (req.url_params.get("foo") == nullptr ? "not " : "") << "found.\n";
|
|
|
|
if(req.url_params.get("pew") != nullptr) {
|
|
|
|
double countD = boost::lexical_cast<double>(req.url_params.get("pew"));
|
|
|
|
os << "The value of 'pew' is " << countD << '\n';
|
|
|
|
}
|
|
|
|
auto count = req.url_params.get_list("count");
|
|
|
|
os << "The key 'count' contains " << count.size() << " value(s).\n";
|
|
|
|
for(const auto& countVal : count) {
|
|
|
|
os << " - " << countVal << '\n';
|
|
|
|
}
|
|
|
|
return crow::response{os.str()};
|
|
|
|
});
|
|
|
|
|
|
|
|
// ignore all log
|
2021-02-08 16:25:02 +00:00
|
|
|
crow::logger::setLogLevel(crow::LogLevel::Debug);
|
2015-02-20 20:46:28 +00:00
|
|
|
//crow::logger::setHandler(std::make_shared<ExampleLogHandler>());
|
|
|
|
|
|
|
|
app.port(18080)
|
|
|
|
.multithreaded()
|
|
|
|
.run();
|
|
|
|
}
|