Para declarar endpoints en cualquier API de Hefesto sólo tienes que añadirlos al api.yaml, en la sección de endpoints:
endpoints:
get /user/{id}:
Ping:
directive: Ping
post /user:
Ping:
directive: Ping
En el caso anterior hemos declarado dos endpoints, un GET a /user/{id} y un POST /user. Los dos endpoints ejecutan una sola directiva Ping, que devuelve al cliente que haga la request un 200 con un JSON que incluye el mensaje "pong".
Una vez desplegada la API, podrás hacer peticiones contra estos endpoints tal como se explica aquí.
Podrás acceder al id del GET /user/{id}, desde una directiva customizada a través del state, o desde el api.yaml, a través de un alias.
Habrá casos, en que quieras que todas las peticiones que entren en la API, tengan el mismo comportamiento, esto lo puedes hacer así:
endpoints:
all /requests:
Ping:
directive: Ping
De esta manera todas las peticiones, tengan el verbo y el path que tengan, serán manejadas por el endpoint especial "all /requests". Puedes usar esta caracterítica con múltipes propósitos, un par de ejemplos:
endpoints:
get /home:
View:
directive: View
name: home
get /about:
View:
directive: View
name: about
all /requests:
View:
directive: View
name: not-found-view
Las APIs, tienen un api.yaml, donde se definen sus endpoints. Al hacerse una llamada a un endpoint, se ejecutan todas sus directivas, siguiendo un flujo, que tiene las siguientes reglas:
Por ejemplo en:
key: poems
before:
CheckKey:
directive: CheckKey
expected: $.map.main.key
current: $.message.header.api-key
after:
OnError:
directive: OnError
groups:
- ERROR_FLOW
Log:
directive: Log
groups:
- AFTER_FLOW
endpoints:
get /user/{id}:
Connect:
directive: DatabaseConnect
ReadUser:
directive: ReadUser
id: $.message.pathParams.id
Prepare-Response:
directive: ModifyMessage
status: 200
headers:
Content-Type: application/json
body: $.memory.model-user
post /user:
LoadUser:
directive: LoadAndValidateModel
source: $.message.bodyAsArray
target: user
Connect:
directive: DatabaseConnect
SaveUser:
directive: SaveUser
user: $.memory.model-user
IdResponse:
directive: IdResponse
id: $.memory.idUser
En una llamada contra post /user, donde no ocurra ningún error, el flujo de diretivas será:
Si se produjera un error, en Connect, porque la base de datos estuviese caida, se lanzaría una excepción, lo que provocaría que ninguna de las directivas siguientes se ejecutaran, excepto las que estén en los group: ERROR_FLOW y/o AFTER_FLOW. Ver el tratamiento de errores al respecto.