Validaciones
Hefesto usa JSON Schema para validar el body de las requests y las responses de conexiones HTTP. Si la validación falla, se lanza una excepción que interrumpe el flujo.
JSON Schema en Maps
Los schemas se almacenan como ficheros JSON en el directorio Maps/ de la API. El nombre del fichero (sin extensión) se usa como target en las directivas de validación.
Ejemplo de Maps/user.json:
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "number" },
"email": { "type": "string", "format": "email" }
},
"required": ["name", "age"],
"additionalProperties": false
}
Validar el body de una request
Usa la directiva LoadAndValidateModel:
post /user:
LoadUser:
directive: LoadAndValidateModel
source: $.message.bodyAsArray
target: user
Connect:
directive: DatabaseConnect
SaveUser:
directive: SaveUser
user: $.memory.user
Parámetros:
- source: el objeto a validar (normalmente el body de la request).
- target: nombre del JSON Schema en Maps (sin extensión). Si la validación es correcta, el objeto se guarda en memory con esa clave.
- server-side-error (opcional): si es
true, el error de validación se reporta como 502 (Server Side Error) en lugar de 400 (Bad Request).
Si la validación falla, LoadAndValidateModel lanza una excepción con código 400 (o 502 si server-side-error es true) y un mensaje descriptivo del error.
Validar la response de una conexión HTTP
La directiva Pull valida automáticamente la respuesta contra el JSON Schema correspondiente al parámetro target:
ReadUser:
directive: Pull
host: https://mymicroservice.com
path: /ms/user
target: user # Valida contra Maps/user.json
Si la respuesta del microservicio no cumple el schema, Pull lanza una excepción (502 por defecto si la validación es del lado del servidor).
Validar sin cargar en memory
Si solo quieres validar sin guardar el resultado en memory, usa ValidateModel directamente:
ValidateModel::run($state, [
'name' => 'user', # Schema en Maps/user.json
'server-side-error' => false
]);
El objeto a validar debe estar previamente cargado en memory con la clave indicada en name.