API JSON con nyx-serve
response_json toma un string JSON crudo; response_json_map serializa un Map a JSON con el escapado adecuado. Los cuerpos de las peticiones son accesibles vía req.body.
Código
// nyx-serve JSON API -- request parsing and response_json_map
import "std/http"
import "std/web"
import "std/json"
fn echo_json(req: Request) -> Response {
// req.body contains the raw request body as a String
// Use std/json to parse structured input
let data: String = req.body
// response_json_map builds a JSON object from a Map
var result: Map = Map.new()
result.insert("received", data)
result.insert("method", req.method)
result.insert("path", req.path)
return response_json_map(200, result)
}
fn health_check(req: Request) -> Response {
// response_json takes a raw JSON string
return response_json(200, "{\"status\": \"ok\", \"service\": \"api\"}")
}
fn not_found(req: Request) -> Response {
return response_json(404, "{\"error\": \"not found\"}")
}
fn main() -> int {
let app: App = app_new()
app_get(app, "/health", health_check)
app_post(app, "/echo", echo_json)
print("JSON API configured")
print(" GET /health -> {\"status\": \"ok\"}")
print(" POST /echo -> echoes request body as JSON")
return 0
}
Salida
JSON API configured
GET /health -> {"status": "ok"}
POST /echo -> echoes request body as JSON
Explicación
Dos helpers cubren el 95% de las necesidades de respuestas JSON. response_json(status, raw) confía en que se produzca JSON válido — rápido, sin overhead, pero basta una barra invertida faltante para que los clientes fallen. Se usa para respuestas constantes como {"status": "ok"} donde se controla el string completo.
response_json_map(status, map) recorre un Map y emite JSON correctamente escapado: las comillas se escapan con barra invertida, los caracteres de control quedan como \u00XX, y los Maps/Arrays anidados se recorren recursivamente. Siempre debe usarse esto cuando alguna parte de la salida provenga de entrada del usuario. Se puede combinar con std/json::parse para leer el cuerpo de la petición en un Map, mutarlo y volver a serializarlo — un ciclo petición-respuesta sin ceremonias.
Ambos helpers configuran Content-Type: application/json; charset=utf-8 automáticamente. Para headers personalizados, se puede construir un Response con response_new y response_set_header.