Los webhooks ejecutan una gran parte de la "magia" que ocurre entre las aplicaciones. A veces se denominan API inversas, devoluciones de llamada e incluso notificaciones. Muchos servicios, como SendGrid, Stripe, Slack y GitHub, usan eventos para enviar webhooks como parte de su API. Esto permite que su aplicación escuche eventos y realice acciones cuando sucedan. En un artículo anterior, vimos cómo . En este artículo, veremos cómo puede escuchar webhooks usando Python (v3+) con los marcos o . consumir webhooks con Node.js y Express Flask Django Esta guía asume que tiene Python v3 instalado en su máquina. Puede encontrar detalles sobre la instalación de python en la . Dependiendo de su configuración, el el comando que desea usar puede ser . página oficial de descargas python python3 Puede confirmar la versión instalada ejecutando lo siguiente desde la terminal: python --version o, si eso muestra una versión inferior a 3: python3 --version ¿Qué es un webhook? Los webhooks se denominan API inversas por una razón. En lugar de que su aplicación envíe una solicitud a la API, la API envía la solicitud a su aplicación. Si bien el concepto puede sonar diferente, la forma en que consumimos webhooks es la misma forma en que una API consume una solicitud. En la mayoría de los marcos web, existe el concepto de ruta. Una ruta permite que la aplicación responda con contenido o datos específicos cuando el usuario visita una URL específica. La misma idea se aplica a las API. Cuando envía una solicitud a GitHub para obtener detalles sobre una organización específica, como , la ruta es dónde es el nombre de la organización. https://api.github.com/orgs/Bearer /orgs/:org :org El mismo concepto se aplica al recibir webhooks. Establecemos una ruta, le decimos al servicio dónde enviar los datos y nuestra aplicación se sienta y espera hasta que llega una solicitud a esa ruta. Hay algunas consistencias en las implementaciones de webhooks. son normalmente peticiones. POST Reciben datos JSON. Necesitan responder rápidamente. Algunas API requerirán que su aplicación responda dentro de un cierto período de tiempo, de lo contrario, se volverá a enviar el evento. Por ejemplo, la espera una respuesta en tres segundos. API de Slack Recibir un webhook con Flask El es un marco web ligero de Python que se describe a sí mismo como "micro". Esto le permite usar solo lo que necesita y luego agregar más estructura a medida que crece su proyecto. marco Flask Para nuestros propósitos, esto es excelente ya que solo nos preocupa el enrutamiento. Asegúrese de que Python esté instalado, luego ejecute el siguiente comando en su terminal para instalar el matraz: python -m pip install Flask Puede encontrar detalles completos de instalación y configuración en la . documentación de Flask A continuación, cree un archivo, como y agrega lo siguiente: .py main.py flask Flask, request, Response app = Flask(__name__) @app.route( , methods=[ ]) def respond(): print(request.json); Response(status= ) from import '/webhook' 'POST' return 200 Este código importa la clase Flask junto con los objetos de solicitud y respuesta. Luego lo instancia con un nombre de antes de asignarlo a la variable. Este esquema de nombres es una convención en la documentación de Flask. __name__ app A continuación, usamos el decorador para escuchar solicitudes formuladas contra el sendero. Este decorador llama a la función que le sigue inmediatamente cuando se realiza una solicitud a la ruta. En este caso, ese es el función. @app.route POST /webhook respond Para el propósito de este ejemplo, nosotros la solicitud como json, luego devuelva un con un código de estado de 200. Esta respuesta le dice al remitente que recibimos el gancho. Debería poder ejecutar el servidor utilizando la técnica preferida de Flask: print Response FLASK_APP=main.py python -m flask run export ¡Eso es! Ahora tenemos una aplicación que detecta un webhook con python y matraz. Una vez desplegado, las solicitudes realizadas al punto final activarán el función. POST respond Por ejemplo: Esta es también la URL que proporcionará el servicio que envía el webhook. https://exampledomain.com/webhook. Recibir un webhook con Django La configuración de una aplicación en Django está más automatizada que en Flask, pero también viene con una estructura de archivos más elaborada. Como un marco de Modelo-Vista-Controlador (MVC) más tradicional, Django desarrolla las partes principales del proyecto para usted. Una guía de instalación completa está disponible en , pero también se puede instalar con usando el siguiente comando: la página de documentación oficial de Django pip python -m pip install Django Si está configurando un proyecto desde cero, use el utilidad para crear un nuevo proyecto. Si ya tiene un proyecto Django existente al que desea agregar webhooks, salte al siguiente paso. django-admin django-admin startproject example-project Esto sienta las bases para un nuevo proyecto de Django. Navegue a la carpeta recién creada y debería ver una estructura similar a la siguiente: example-project/ manage.py example-project/ __init__.py settings.py urls.py asgi.py wsgi.py Podemos confirmar que todo funcionó ejecutando . python manage.py runserver La convención de Django es configurar "aplicaciones" dentro de este "proyecto" externo. Puede evitar esto y configurar un proyecto de aplicación única ejecutando con un punto final (.) en su lugar. Para este tutorial, reflejaremos la forma preferida como se muestra anteriormente. django-admin startproject example-project . Para hacer eso, configuraremos una "aplicación" llamada . webhooks python manage.py startapp webhooks Esto crea un nuevo directorio llamado . ¡Excelente! Ahora podemos escribir algo de código. webhooks Nos centraremos en tres archivos: , (aún no creado), y . webhooks/views.py webhooks/urls.py example-site/urls.py Abre el archivo . Aquí escribiremos la lógica para manejar una ruta. webhooks/views.py django.http HttpResponse django.views.decorators.http require_POST HttpResponse( ) from import from import @require_POST : def example (request) return 'Hello, world. This is the webhook response.' Este código hace lo siguiente: Importa el objeto que se utilizará para enviar una respuesta. HttpResponse Importa un decorador especial para limitar el método de solicitud. En Django, las rutas aceptan todos los métodos HTTP de forma predeterminada y permiten que las vistas administren a qué métodos responden. Llama al decorador para limitar la función que sigue a sólo el método. POST Define una función, llamada que toma la solicitud como argumento y devuelve una respuesta. example Este el nombre de la función se vinculará a nuestro archivo en breve. No necesita alinearse a una ruta específica. example urls.py A continuación, crea si no existe ya. Aquí es donde organizamos rutas dentro de esta sub-aplicación de nuestro proyecto. webhooks/urls.py django.urls path . views urlpatterns = [ path( , views.example) ] from import from import 'example/' Aquí, importamos de . Define rutas individuales y las asocia con vistas. A continuación, importamos todas las vistas. path django.urls Finalmente, se pasa una lista de caminos. Django reconoce esta lista como las rutas asociadas con la aplicación. urlpatterns En este caso, definimos una ruta que apunta y está asociado con la vista , que era el nombre de nuestra función en . example/ views.example views.py Una vez hecho esto, nuestra aplicación funciona, pero debemos informar al proyecto externo al respecto. Abierto . Debería verse similar al archivo anterior, pero con un archivo existente ruta. Agregue una nueva ruta así: example-project/urls.py admin urlpatterns = [ path( , admin.site.urls), path( , include( )) ] 'admin/' 'webhooks/' 'webhooks.urls' Si su servidor se detuvo, ejecútelo de nuevo con . python manage.py runserver Ahora intente hacer una solicitud POST a (reemplace el host y el puerto con los suyos propios si difieren). http://127.0.0.1:8000/webhooks/example/ Con eso, hemos configurado un proyecto Django que escucha un webhook en . Una vez implementado, agregue esta ruta a la URL completa y proporcione la URL completa al servicio que envía el webhook. /webhooks/example Prueba de webhooks localmente Para probar los webhooks localmente sin implementarlos, necesitamos abrir una conexión desde nuestra máquina de desarrollo al mundo exterior. Una opción es usar . Este servicio le permite brindar acceso externo a un puerto específico en su máquina local. Esto funciona muy bien para nuestras necesidades. Para comenzar, regístrese y siga las instrucciones de instalación y de inicio. ngrok Una vez hecho esto, si está en MacOS, debería poder ejecutar en su terminal donde 3000 se reemplaza con el puerto de su aplicación Python en ejecución. Por ejemplo, un sitio Django predeterminado a menudo se ejecuta en el puerto 8000. ./ngrok http 3000 Una vez que esté en funcionamiento, ngrok le proporcionará una URL que puede usar para probar su webhook. En Bearer, proporcionamos un botón de "prueba" en nuestra configuración de notificaciones. Una vez configurado, comenzará a recibir webhooks en esa URL. No olvide cambiarlo a la URL final del webhook implementado una vez que se hayan completado el desarrollo y las pruebas. ¿Qué puedes hacer con esta información? Una vez que se configura un webhook, depende de usted cómo manejar la información que recibe. Puede usar esta información para reaccionar a eventos en tiempo real, presentar partes de su aplicación o incluso usarla como una forma de escribir datos en una base de datos. Existen innumerables capacidades que su webhook puede tener según el tipo de información que envíe el proveedor de la API. Si bien creamos una implementación básica en este artículo, vale la pena mencionar que muchos servicios ofrecen formas de validar que una solicitud proviene de la fuente real. Esto se puede hacer limitando las URL que acceden a su aplicación o haciendo coincidir una clave secreta. GitHub, por ejemplo, le permite establecer un secreto que se enviará con cada webhook. Explore la documentación de los servicios que utiliza para ver cuál es la mejor manera de trabajar dentro de su configuración. Si le gusta la idea de usar webhooks para reaccionar a los cambios de monitoreo con sus proveedores de API de terceros, . consulte lo que estamos creando en Bearer.sh