Hace poco me enteré de los webhooks y estoy tratando de implementar uno para una aplicación de pila completa que estoy creando. Sin embargo, no he podido encontrar información sobre cómo crear mi propio webhook. Así es como se espera que funcione mi aplicación:
Mi lado del cliente es un sitio web creado con React, y cuando se carga, realizará una solicitud GET a mi servidor (construido con Node y Express). La respuesta proporcionará datos que se mostrarán en el sitio web. El usuario hará clic en un botón en el sitio web, que enviará una solicitud (¿POST? ¿OBTENER?) a mi servidor, que realizará su propia solicitud POST para enviar algunos de los datos a una API externa. Cuando los datos de la API externa completen el trabajo en los datos, enviarán una solicitud POST a la URL de mi webhook (que supongo que es parte de mi servidor), y los datos de la API externa deben enviarse al cliente, que se mostrará junto con los datos originales. Además, cuando se completa el trabajo en el primer lote de datos, mi servidor envía otra solicitud POST (con algo más de los datos originales) a la API externa, que luego realizará una solicitud POST a mi webhook/servidor con nuevos datos que luego se pasa al cliente nuevamente, y esto se repite hasta que todos los datos originales de mi servidor han sido pasados y procesados por la API externa, y todos los datos procesados se envían a mi servidor y luego al cliente.
Según tengo entendido, el webhook permitirá que mi cliente realice una sola solicitud a mi servidor y, luego, mi servidor puede realizar varias respuestas a mi cliente: una respuesta para cada solicitud POST recibida de la API externa. Sin embargo, no he podido encontrar información sobre cómo crear un webhook. Todo lo que he encontrado ha sido sobre cómo usar webhooks con aplicaciones/sitios web preexistentes como Dischord o GitHub o Stripe. O usar servicios de terceros para usar sus webhooks para conectar aplicaciones/sitios web preexistentes.
¿Cómo hago para crear un webhook para mi pequeño proyecto que actualizará mi sitio web cada vez que mi servidor reciba una solicitud POST de la API externa? ¿O estoy malinterpretando cómo funciona un webhook? ¿Solo pueden ser creados por servicios de terceros y/o solo pueden usarse en aplicaciones preexistentes?
Para un caso de uso simple, solo significa otro punto final en su servidor que recibirá una solicitud de la API externa cuando haya terminado con la tarea. Es una forma común en que funcionan las API REST para informarle que han terminado con algo o comunicarle cualquier cosa en general. Tiene un punto final que recibirá una solicitud del cliente React y enviará información a la API externa (como dijo) y otro punto final (este "webhook") que recibirá solicitudes de la API externa. Eso es todo.
Usted describió muy bien las comunicaciones cliente-servidor para este problema con la excepción de que el servidor no puede enviar solicitudes al cliente a través de HTTP. Si el cliente necesita algo del servidor, debe enviar una solicitud y solicitarlo. Una forma común de hacer esto sería almacenar la información en el servidor una vez que la API externa llegue a su "webhook", y el cliente puede preguntarle al servidor si los datos están de vuelta cada X segundos (sondeo largo).
Ejemplo (flujo de pago):
Client -> Server: Heres my credit card number Server -> Client: Thanks! Let me process that. Server -> External API: Please process this credit card for the amount of $X and ping me at this webhook when you're done. External API -> Server: OK, will let you know when I'm done. Client -> Server: You done yet? Server -> Client: Nope! External API -> Server (to webhook): Hey, I'm done, here's the receipt. Server -> External API: Thanks! Client -> Server: You done yet? Server -> Client: Yes! Here's your receipt.Formas más avanzadas de resolver el problema serían utilizar un protocolo de comunicación bidireccional de larga duración, como websockets. Y como han mencionado otros, todos los puntos finales no tienen que estar en el mismo servidor. Puede tener un servidor para cada punto final, y puede encenderlos solo cuando reciben una solicitud y luego volver a dormir (eso es un Lambda). Pros y contras de este enfoque. Eso es algo más avanzado y si solo estás aprendiendo, realmente no me preocuparía por eso ahora.
AFAIK, los webhooks son solo API web normales. Propiedades que hacen que una API sea un webhook:
En su caso, su servidor envía datos a la API externa. Lo que hace que el webhook sea diferente es que el servidor de la API externa no tiene que responder de inmediato, sino que le devuelve, por ejemplo, un HTTP 200 OK para reconocer que recibió la solicitud y comenzó a procesar los datos. Cuando el servidor de la API externa termine de procesar los datos (que es un evento), llamará al punto final de su servidor para informarle sobre el proceso junto con los datos procesados (si tuvo éxito).
Su servidor, en consecuencia, deberá informar a su cliente (el usuario) sobre los datos procesados. Sugeriría implementar algunos tipos de conexión persistente (WebSocket o SSE), o simplemente hacer la solicitud de encuesta del cliente cada cierto tiempo.
"(que supongo que es parte de mi servidor)": el webhook es parte de la API de terceros que apunta a su servidor o tal vez a alguna función sin servidor/lambda (que usted configuró) que a su vez puede analizar y realizar cálculos sobre los datos y luego enviarlos de regreso a su servidor.
Realmente depende del caso de uso y la arquitectura de su API. Si no desea que su servidor de API principal se sobrecargue, por ejemplo, si necesita realizar un procesamiento intensivo de E/S, CPU/GPU, puede crear funciones Lambda sin servidor para manejar este procesamiento de datos y ser el punto final que proporciona al tercero. el punto final de la publicación del webhook del grupo.
Si no le preocupa, puede crear otro punto final en su servidor para manejar este webhook.
Solo tenga en cuenta que, cuando intenta escalar, desea que sus sistemas estén lo más distribuidos posible, dentro de lo razonable, para que su API pueda manejar más solicitudes y no sobrecargarse con un montón de procesos.