Skip to content

Form & Body Parsers Guide

Beginner-friendly guide for:

  • application/x-www-form-urlencoded
  • application/json
  • multipart/form-data

Each section includes: - Minimal server - curl tests - Expected behavior

1) Form Parser (application/x-www-form-urlencoded)

Minimal example

cpp
#include <vix.hpp>
#include <vix/middleware/app/presets.hpp>

using namespace vix;

int main()
{
  App app;

  app.use("/form", middleware::app::form_dev(128));

  app.post("/form", [](Request &req, Response &res)
  {
    auto& fb = req.state<middleware::parsers::FormBody>();

    auto it = fb.fields.find("b");
    res.send(it == fb.fields.end() ? "" : it->second);
  });

  app.run(8080);
}

Test

bash
curl -i -X POST http://localhost:8080/form \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data "a=1&b=hello+world"

2) JSON Parser (application/json)

Minimal example

cpp
#include <vix.hpp>
#include <vix/middleware/app/presets.hpp>

using namespace vix;

int main()
{
  App app;

  app.use("/json", middleware::app::json_dev(256, true, true));

  app.post("/json", [](Request &req, Response &res)
  {
    auto &jb = req.state<middleware::parsers::JsonBody>();
    res.json({
        "ok", true,
        "raw", jb.value.dump()
    });
  });

  app.run(8080);
}

Test

bash
curl -i -X POST http://localhost:8080/json \
  -H "Content-Type: application/json" \
  --data '{"x":1}'

3) Multipart Parser (File Uploads)

Minimal example

cpp
#include <vix.hpp>
#include <vix/middleware/app/presets.hpp>

using namespace vix;

int main()
{
  App app;

  app.use("/mp", middleware::app::multipart_save_dev("uploads"));

  app.post("/mp", [](Request &req, Response &res)
  {
    auto &form = req.state<middleware::parsers::MultipartForm>();
    res.json(middleware::app::multipart_json(form));
  });

  app.run(8080);
}

Test

bash
curl -i -X POST http://localhost:8080/mp \
  -F "a=1" -F "file=@/etc/hosts"

Files are saved to ./uploads/

Error Codes Summary

Code Meaning


400 Invalid body 413 Payload too large 415 Unsupported Content-Type

Recommended Usage

  • Use form_dev() for HTML forms
  • Use json_dev() for APIs
  • Use multipart_save_dev() for file uploads

Keep max_bytes small in production.