2014-04-26 17:19:59 +00:00
|
|
|
#include "crow.h"
|
2014-03-30 13:53:56 +00:00
|
|
|
|
2014-04-13 02:24:06 +00:00
|
|
|
#include <sstream>
|
2014-03-31 16:51:50 +00:00
|
|
|
|
2014-05-23 07:22:12 +00:00
|
|
|
class ExampleLogHandler : public crow::ILogHandler {
|
|
|
|
public:
|
2016-08-27 09:03:49 +00:00
|
|
|
void log(std::string /*message*/, crow::LogLevel /*level*/) override {
|
2014-08-17 09:35:21 +00:00
|
|
|
// cerr << "ExampleLogHandler -> " << message;
|
2014-05-23 07:22:12 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2015-01-02 02:54:30 +00:00
|
|
|
struct ExampleMiddleware
|
2014-10-23 17:33:03 +00:00
|
|
|
{
|
|
|
|
std::string message;
|
|
|
|
|
2015-01-02 02:54:30 +00:00
|
|
|
ExampleMiddleware()
|
2014-10-23 17:33:03 +00:00
|
|
|
{
|
|
|
|
message = "foo";
|
|
|
|
}
|
|
|
|
|
|
|
|
void setMessage(std::string newMsg)
|
|
|
|
{
|
|
|
|
message = newMsg;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct context
|
|
|
|
{
|
|
|
|
};
|
|
|
|
|
2016-08-27 09:03:49 +00:00
|
|
|
void before_handle(crow::request& /*req*/, crow::response& /*res*/, context& /*ctx*/)
|
2014-10-23 17:33:03 +00:00
|
|
|
{
|
|
|
|
CROW_LOG_DEBUG << " - MESSAGE: " << message;
|
|
|
|
}
|
|
|
|
|
2016-08-27 09:03:49 +00:00
|
|
|
void after_handle(crow::request& /*req*/, crow::response& /*res*/, context& /*ctx*/)
|
2014-10-23 17:33:03 +00:00
|
|
|
{
|
|
|
|
// no-op
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-03-30 13:53:56 +00:00
|
|
|
int main()
|
|
|
|
{
|
2015-01-02 02:54:30 +00:00
|
|
|
crow::App<ExampleMiddleware> app;
|
2014-10-23 17:33:03 +00:00
|
|
|
|
2015-01-02 02:54:30 +00:00
|
|
|
app.get_middleware<ExampleMiddleware>().setMessage("hello");
|
2014-04-09 23:17:08 +00:00
|
|
|
|
2014-04-26 17:19:59 +00:00
|
|
|
CROW_ROUTE(app, "/")
|
2014-04-17 06:50:28 +00:00
|
|
|
.name("hello")
|
2014-04-09 23:17:08 +00:00
|
|
|
([]{
|
2014-03-31 16:51:50 +00:00
|
|
|
return "Hello World!";
|
|
|
|
});
|
|
|
|
|
2014-04-26 17:19:59 +00:00
|
|
|
CROW_ROUTE(app, "/about")
|
2014-04-25 22:44:09 +00:00
|
|
|
([](){
|
2014-04-26 17:19:59 +00:00
|
|
|
return "About Crow example.";
|
2014-04-20 08:45:10 +00:00
|
|
|
});
|
|
|
|
|
2015-01-19 10:03:06 +00:00
|
|
|
// a request to /path should be forwarded to /path/
|
|
|
|
CROW_ROUTE(app, "/path/")
|
|
|
|
([](){
|
|
|
|
return "Trailing slash test case..";
|
|
|
|
});
|
|
|
|
|
2015-02-22 14:23:05 +00:00
|
|
|
|
2014-04-25 22:44:09 +00:00
|
|
|
// simple json response
|
2015-02-22 14:23:05 +00:00
|
|
|
// To see it in action enter {ip}:18080/json
|
2014-04-26 17:19:59 +00:00
|
|
|
CROW_ROUTE(app, "/json")
|
2014-04-17 06:50:28 +00:00
|
|
|
([]{
|
2014-04-26 17:19:59 +00:00
|
|
|
crow::json::wvalue x;
|
2014-04-17 14:06:41 +00:00
|
|
|
x["message"] = "Hello, World!";
|
|
|
|
return x;
|
2014-04-17 06:50:28 +00:00
|
|
|
});
|
|
|
|
|
2015-02-22 14:23:05 +00:00
|
|
|
// To see it in action enter {ip}:18080/hello/{integer_between -2^32 and 100} and you should receive
|
|
|
|
// {integer_between -2^31 and 100} bottles of beer!
|
2014-04-26 17:19:59 +00:00
|
|
|
CROW_ROUTE(app,"/hello/<int>")
|
2014-04-13 02:24:06 +00:00
|
|
|
([](int count){
|
|
|
|
if (count > 100)
|
2014-04-26 17:19:59 +00:00
|
|
|
return crow::response(400);
|
2014-04-13 02:24:06 +00:00
|
|
|
std::ostringstream os;
|
|
|
|
os << count << " bottles of beer!";
|
2014-04-26 17:19:59 +00:00
|
|
|
return crow::response(os.str());
|
2014-04-13 02:24:06 +00:00
|
|
|
});
|
|
|
|
|
2015-02-22 14:23:05 +00:00
|
|
|
// To see it in action submit {ip}:18080/add/1/2 and you should receive 3 (exciting, isn't it)
|
2014-08-05 13:38:51 +00:00
|
|
|
CROW_ROUTE(app,"/add/<int>/<int>")
|
2016-08-27 09:03:49 +00:00
|
|
|
([](const crow::request& /*req*/, crow::response& res, int a, int b){
|
2014-08-05 13:38:51 +00:00
|
|
|
std::ostringstream os;
|
|
|
|
os << a+b;
|
2014-08-05 18:54:38 +00:00
|
|
|
res.write(os.str());
|
2014-08-05 13:38:51 +00:00
|
|
|
res.end();
|
|
|
|
});
|
|
|
|
|
2014-04-13 02:24:06 +00:00
|
|
|
// Compile error with message "Handler type is mismatched with URL paramters"
|
2014-04-26 17:19:59 +00:00
|
|
|
//CROW_ROUTE(app,"/another/<int>")
|
2014-04-13 02:24:06 +00:00
|
|
|
//([](int a, int b){
|
2014-04-26 17:19:59 +00:00
|
|
|
//return crow::response(500);
|
2014-04-09 23:17:08 +00:00
|
|
|
//});
|
|
|
|
|
2014-04-25 22:44:09 +00:00
|
|
|
// more json example
|
2015-02-22 14:23:05 +00:00
|
|
|
|
|
|
|
// To see it in action, I recommend to use the Postman Chrome extension:
|
|
|
|
// * Set the address to {ip}:18080/add_json
|
|
|
|
// * Set the method to post
|
|
|
|
// * Select 'raw' and then JSON
|
|
|
|
// * Add {"a": 1, "b": 1}
|
|
|
|
// * Send and you should receive 2
|
2016-03-18 04:19:08 +00:00
|
|
|
|
|
|
|
// A simpler way for json example:
|
|
|
|
// * curl -d '{"a":1,"b":2}' {ip}:18080/add_json
|
2014-04-26 17:19:59 +00:00
|
|
|
CROW_ROUTE(app, "/add_json")
|
2014-12-15 12:52:42 +00:00
|
|
|
.methods("POST"_method)
|
2014-04-26 17:19:59 +00:00
|
|
|
([](const crow::request& req){
|
|
|
|
auto x = crow::json::load(req.body);
|
2014-04-25 22:44:09 +00:00
|
|
|
if (!x)
|
2014-04-26 17:19:59 +00:00
|
|
|
return crow::response(400);
|
2014-04-25 22:44:09 +00:00
|
|
|
int sum = x["a"].i()+x["b"].i();
|
|
|
|
std::ostringstream os;
|
|
|
|
os << sum;
|
2014-04-26 17:19:59 +00:00
|
|
|
return crow::response{os.str()};
|
2014-04-25 22:44:09 +00:00
|
|
|
});
|
|
|
|
|
2015-02-22 10:56:40 +00:00
|
|
|
// Example of a request taking URL parameters
|
|
|
|
// If you want to activate all the functions just query
|
|
|
|
// {ip}:18080/params?foo='blabla'&pew=32&count[]=a&count[]=b
|
2014-09-22 20:34:22 +00:00
|
|
|
CROW_ROUTE(app, "/params")
|
|
|
|
([](const crow::request& req){
|
|
|
|
std::ostringstream os;
|
2015-02-22 10:56:40 +00:00
|
|
|
|
|
|
|
// To get a simple string from the url params
|
2015-02-22 14:29:39 +00:00
|
|
|
// To see it in action /params?foo='blabla'
|
2014-10-14 08:48:35 +00:00
|
|
|
os << "Params: " << req.url_params << "\n\n";
|
|
|
|
os << "The key 'foo' was " << (req.url_params.get("foo") == nullptr ? "not " : "") << "found.\n";
|
2015-02-22 10:56:40 +00:00
|
|
|
|
|
|
|
// To get a double from the request
|
|
|
|
// To see in action submit something like '/params?pew=42'
|
2014-10-14 08:48:35 +00:00
|
|
|
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';
|
|
|
|
}
|
2015-02-22 10:56:40 +00:00
|
|
|
|
|
|
|
// To get a list from the request
|
|
|
|
// You have to submit something like '/params?count[]=a&count[]=b' to have a list with two values (a and b)
|
2014-10-14 08:48:35 +00:00
|
|
|
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';
|
2014-09-22 20:34:22 +00:00
|
|
|
}
|
2017-03-16 16:27:19 +00:00
|
|
|
|
|
|
|
// To get a dictionary from the request
|
|
|
|
// You have to submit something like '/params?mydict[a]=b&mydict[abcd]=42' to have a list of pairs ((a, b) and (abcd, 42))
|
|
|
|
auto mydict = req.url_params.get_dict("mydict");
|
|
|
|
os << "The key 'dict' contains " << mydict.size() << " value(s).\n";
|
|
|
|
for(const auto& mydictVal : mydict) {
|
|
|
|
os << " - " << mydictVal.first << " -> " << mydictVal.second << '\n';
|
|
|
|
}
|
|
|
|
|
2014-09-22 20:34:22 +00:00
|
|
|
return crow::response{os.str()};
|
2014-10-14 08:48:35 +00:00
|
|
|
});
|
2014-09-22 20:34:22 +00:00
|
|
|
|
2016-09-09 16:57:09 +00:00
|
|
|
CROW_ROUTE(app, "/large")
|
|
|
|
([]{
|
|
|
|
return std::string(512*1024, ' ');
|
|
|
|
});
|
|
|
|
|
2020-10-18 00:20:19 +00:00
|
|
|
// Take a multipart/form-data request and print out its body
|
|
|
|
CROW_ROUTE(app,"/multipart")
|
|
|
|
([](const crow::request& req){
|
|
|
|
crow::multipart::message msg(req);
|
|
|
|
CROW_LOG_INFO << "body of the first part " << msg.parts[0];
|
|
|
|
});
|
|
|
|
|
2017-09-17 17:58:53 +00:00
|
|
|
// enables all log
|
|
|
|
app.loglevel(crow::LogLevel::DEBUG);
|
2014-05-23 07:22:12 +00:00
|
|
|
//crow::logger::setHandler(std::make_shared<ExampleLogHandler>());
|
|
|
|
|
2014-04-17 06:50:28 +00:00
|
|
|
app.port(18080)
|
2014-05-02 05:17:49 +00:00
|
|
|
.multithreaded()
|
2014-04-17 06:50:28 +00:00
|
|
|
.run();
|
2014-03-30 13:53:56 +00:00
|
|
|
}
|