Hay casos en los que quieres decirle a los usuarios de tu API que tu aplicación podría llamar a la aplicación de ellos (enviando una petición) con algunos datos, normalmente para notificar sobre algún tipo de evento.
Esto significa que en lugar del proceso normal de tus usuarios enviando peticiones a tu API, es tu API (o tu aplicación) la que podría enviar peticiones a su sistema (a su API, a su aplicación).
El proceso normalmente es que tú defines en tu código cuál es el mensaje que enviarás, el cuerpo de la petición.
También defines de alguna manera en qué momentos tu aplicación enviará esas peticiones o eventos.
Y tus usuarios definen de alguna manera (por ejemplo en un panel web en algún lugar) la URL donde tu aplicación debería enviar esas peticiones.
Toda la lógica sobre cómo registrar las URLs para los webhooks y el código para realmente enviar esas peticiones depende de ti. Lo escribes como quieras en tu propio código.
Con FastAPI, usando OpenAPI, puedes definir los nombres de estos webhooks, los tipos de operaciones HTTP que tu aplicación puede enviar (por ejemplo POST, PUT, etc.) y los cuerpos de las peticiones que tu aplicación enviaría.
Esto puede hacer mucho más fácil para tus usuarios implementar sus APIs para recibir tus peticiones de webhook, incluso podrían ser capaces de autogenerar parte de su propio código de API.
Nota
Los webhooks están disponibles en OpenAPI 3.1.0 y superior, soportados por FastAPI 0.99.0 y superior.
Cuando creas una aplicación FastAPI, hay un atributo webhooks que puedes usar para definir webhooks, de la misma manera que definirías operaciones de ruta, por ejemplo con @app.webhooks.post().
fromdatetimeimportdatetimefromfastapiimportFastAPIfrompydanticimportBaseModelapp=FastAPI()classSubscription(BaseModel):username:strmonthly_fee:floatstart_date:datetime@app.webhooks.post("new-subscription")defnew_subscription(body:Subscription):""" When a new user subscribes to your service we'll send you a POST request with this data to the URL that you register for the event `new-subscription` in the dashboard. """@app.get("/users/")defread_users():return["Rick","Morty"]
Los webhooks que definas terminarán en el esquema de OpenAPI y en la interfaz de documentación automática.
Nota
El objeto app.webhooks es en realidad simplemente un APIRouter, del mismo tipo que usarías al estructurar tu aplicación con múltiples archivos.
Ten en cuenta que con los webhooks en realidad no estás declarando una ruta (como /items/), el texto que pasas ahí es simplemente un identificador del webhook (el nombre del evento), por ejemplo en @app.webhooks.post("new-subscription"), el nombre del webhook es new-subscription.
Esto se debe a que se espera que tus usuarios definan la ruta URL real donde quieren recibir la petición del webhook de alguna otra manera (por ejemplo, un panel web).