hefestoapicontainer

Endpoints y flow de las directivas

Endpoints

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

Flow de las directivas

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.

Ir a la home