Manapi Http

Recieve Data

Methods to receive data from the HTTP request in handlers

GET params

To receive GET params you can use get(...) method in net::http::request class.

Example: GET request on /sayhello?name=Medved

...
router->GET ("/sayhello", +[] (manapi::net::http::request &req, manapi::net::http::response &resp) -> manapi::future<> {
    std::string_view param = req.get("name").unwrap();
    std::cout << param << "\n"; // prints Medved
    ...
});
...

Verify GET params

To verify GET params you can use verify_get(...) method in net::http::request class.

Example: GET request on /sayhello?name=Medved&age=41

...
router->GET ("/sayhello", +[] (manapi::net::http::request &req, manapi::net::http::response &resp) -> manapi::future<> {
    manapi::json_mask const mask ({
        {"name", "{string(<=50)}"},
        {"age", "{string(>=1 <=3)}"}
    });
    auto verified = req.verify_get(&mask);
    if (!verified.ok())
        co_return resp.text(std::format("Invalid GET params. Msg:{}", 
            verified.fullmsg())).unwrap();
 
    std::string_view param = req.get("name").unwrap();
    std::cout << param << "\n"; // prints Medved
    ...
});
...

Handle POST Body

Recieve body from the request

JSON Data

To read and verify JSON data use net::http::request::json.

Example: POST request on /readjson with JSON data

{
    "name": "Medved",
    "age": 41
}
...
router->POST ("/readjson", +[] (manapi::net::http::request &req, manapi::net::http::response &resp) -> manapi::future<> {
    manapi::json_mask const mask ({
        {"name", "{string(>=3 <=50)}"},
        {"age", "{integer(>=18 <=99)}"}
    });
    auto data = manapi::unwrap(co_await req.json(&mask));
    std::cout << data["name"].as_string() << "\n"; // prints Medved
    ...
});
...

Plain Text

To read plain data use net::http::request::text

Example: POST request on /readtext with plain text data

Medved
router->POST ("/readtext", +[] (manapi::net::http::request &req, manapi::net::http::response &resp) -> manapi::future<> {
    auto name = manapi::unwrap(co_await req.text());
    std::cout << name << "\n"; // prints Medved
    ...
});

File Data

To save binary data into file use net::http::request::file

Example: POST request on /file with binary data

router->POST ("/file", +[] (manapi::net::http::request &req, manapi::net::http::response &resp) -> manapi::future<> {
    manapi::unwrap(co_await req.file(manapi::fs::path::join(".", "body.bin")), 0755); 
    ...
});

FormData

To handle form data messages use net::http::request::form (accepts application/x-www-form-urlencoded and multipart/form-data)

Example: POST request on /form with form data

name=Medved
age=7
age=8
router->POST ("/form", +[] (manapi::net::http::request &req, manapi::net::http::response &resp) -> manapi::future<> {
    std::string name, age;
    manapi::unwrap(co_await req.form([&] (std::string key) 
            -> manapi::net::formdata_recv::ondata_cb_t {
        // calls 3 times
        std::string *s;
        if (key == "name") 
            s = &name;
        else 
            s = &age;
        return manapi::net::formdata_recv::save_string(s, /* max len */ 10000);
    }));
    std::cout << name << " " << age << "\n"; // prints Medved 78
    ...
});

Custom Sync Callback

To custom handle binary data use net::http::request::callback_sync

Example: POST request on /callback_sync with binary data

router->POST ("/callback_sync", +[] (manapi::net::http::request &req, manapi::net::http::response &resp) -> manapi::future<> {
    // prints binary data to stdout
    manapi::unwrap(co_await req.callback_sync([] (const char *buf, std::size_t size, bool fin) -> ssize_t {
        std::cout << std::string_view (buf, size);
        if (fin)
            std::cout << "\n";
        return static_cast<ssize_t>(size);
    }));
    ...
});

Custom Async Callback

To custom handle binary data use net::http::request::callback_async

Example: POST request on /callback_async with binary data

router->POST ("/callback_async", +[] (manapi::net::http::request &req, manapi::net::http::response &resp) -> manapi::future<> {
    // prints binary data to test.bin
    auto s = manapi::fs::fstream::create("test.bin").unwrap();
    manapi::unwrap(co_await s->open(manapi::ev::FS_O_WRONLY, 0755));
    manapi::unwrap(co_await req.callback_async([s] (manapi::slice_view sv, bool fin) -> manapi::future<ssize_t> {
        co_return co_await s->fwrite(sv);
    }));
    ...
});

On this page