Skip to content

HTTP CRUD

Single-item CRUD demo — GET /item returns JSON; POST /item replaces the stored name from the raw body.

Example source: vow-examples/vow-web-server/json_crud.vow

import lib.app
import lib.request
import lib.response
import lib.serve
var store_name: String = "widget";
fn get_item(_req: request.Request) -> response.Response {
let body = "{\"name\":\"" + store_name + "\"}";
return response.json(body);
}
fn create_item(req: request.Request) -> response.Response {
let body = request.body(req, 65536);
if len(body) == 0 {
return response.bad_request("{\"error\":\"empty body\"}");
}
store_name = body;
return response.json(201, "{\"ok\":true}");
}
fn main(caps: Caps) -> int {
let a = app.post(
app.get(app.app(), "/item", get_item),
"/item",
create_item
);
return match caps.net {
Some(cap) => serve.listen(a, cap, 8787),
None => 0 - 1,
};
}
Terminal window
./vow run vow-examples/vow-web-server/json_crud.vow -- --grant net:
curl -sf http://127.0.0.1:8787/item
curl -X POST http://127.0.0.1:8787/item \
-H 'Content-Type: application/json' \
-d '{"name":"gadget"}'
curl -sf http://127.0.0.1:8787/item
Topic This example
Reading POST body request.body(req, max_len)
JSON responses response.json / response.json(201, …)
Error helper response.bad_request for empty body
Mutable state Module-level var store_name