Event Driven Excellence using WebHooks
Tags: webdev, web3, tutorial, programming
Published: 2024-05-29 09:10:15

In web development, connecting different systems is essential for building dynamic and efficient applications. Two common methods for doing this are **webhooks** and **APIs**.

Webhooks are a method for web applications to communicate with each other automatically. They allow one system to send real-time data to another whenever a specific event occurs. Unlike traditional APIs, where one system needs to request data from another, webhooks push data to another system as soon as the event happens.

To set up a webhook, the client gives a unique URL to the server API and specifies which event it wants to know about. Once the webhook is set up, the client no longer needs to poll the server; the server will automatically send the relevant payload to the client’s webhook URL when the specified event occurs.

Webhooks are often referred to as *reverse APIs* or *push APIs*, because they put the responsibility of communication on the server, rather than the client. Instead of the client sending HTTP requests—asking for data until the server responds—the server sends the client a single HTTP POST request as soon as the data is available. Despite their nicknames, webhooks are not APIs; they work together. An application must have an API to use a webhook.

![Working of a Web Hook](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wzfzy1v768uku488j6nl.png)

Here’s a more detailed breakdown of how webhooks work:

1. **Event Occurrence**: An event happens in the source system (e.g., a user makes a purchase on an e-commerce site).
2. **Trigger**: The event triggers a webhook. This means the source system knows something significant has occurred and needs to inform another system.
3. **Webhook URL**: The source system sends an HTTP POST request to a predefined URL (the webhook URL) on the destination system. This URL is configured in advance by the user or administrator of the destination system.
4. **Data Transmission**: The POST request includes a payload of data relevant to the event (e.g., details of the purchase, such as items bought, price, user info).
5. **Processing**: The destination system receives the data and processes it. This could involve updating records, triggering other actions, or integrating the data into its workflows.
6. **Response**: The destination system usually sends back a response to acknowledge receipt of the webhook. This response can be as simple as a 200 OK HTTP status code, indicating successful receipt.

**Example:**

Let's say you subscribe to a streaming service. The streaming service wants to send you an email at the beginning of each month when it charges your credit card.

The streaming service can subscribe to the banking service (the source) to send a webhook when a credit card is charged (event trigger) to their emailing service (the destination). When the event is processed, it will send you a notification each time your card is charged.

The banking system webhooks will include information about the charge (event data), which the emailing service uses to construct a suitable message for you, the customer.

**Use Cases for Webhooks:**

- **E-commerce**: Notifying inventory systems of sales so stock levels can be adjusted.
- **Payment Processing**: Alerting systems of payment events like successful transactions or refunds.
- **Messaging and Notifications**: Sending notifications to chat systems (e.g., Slack, Microsoft Teams) when certain events occur in other systems (e.g., new issue reported in a project management tool).

**Benefits of Webhooks:**

- **Real-time Updates**: Immediate notification of events without the need for periodic polling.
- **Efficiency**: Reduces the need for continuous polling, saving resources and bandwidth.
- **Decoupling Systems**: Allows different systems to work together without tight integration, enhancing modularity and flexibility.

**Implementing Webhooks**

To implement webhooks, you typically need to:

- **Set Up the Webhook URL**: Create an endpoint in the destination system that can handle incoming HTTP POST requests.
- **Configure the Source System**: Register the webhook URL with the source system and specify the events that should trigger the webhook.
- **Handle the Payload**: Write logic in the destination system to process the incoming data appropriately.
- **Security Measures**: Implement security features such as validating the source of the webhook request, using secret tokens, and handling retries gracefully in case of failures.

Webhooks can be categorized based on various criteria, including their purpose, the type of event they respond to, and their implementation specifics. Here are some common types of webhooks:

**Based on Purpose:**

1. **Notification Webhooks**:
    - These webhooks are used to notify a system or user of a specific event.
2. **Data Syncing Webhooks**:
    - These are used to keep data consistent between two systems. For instance, when a user updates their profile on one platform, a webhook can update the user’s profile on another connected platform.
3. **Action-Triggered Webhooks**:
    - These webhooks trigger specific actions in response to an event. For example, when a payment is completed, a webhook can trigger the generation of an invoice.

**Based on Event Types:**

1. **Resource Change Webhooks**:
    - Triggered when a resource is created, updated, or deleted. For example, when a new customer is added to a CRM system.
2. **State Change Webhooks**:
    - These webhooks are triggered by changes in the state of an entity, such as an order status changing from "pending" to "shipped".
3. **Notification Webhooks**:
    - Used to send alerts or notifications, such as when a new comment is posted on a blog.

**Based on Implementation**

1. **One-time Webhooks**:
    - These are triggered by a single event and do not expect any further events after the initial trigger. For example, a webhook that triggers an email confirmation upon user registration.
2. **Recurring Webhooks**:
    - These are set up to handle multiple events over time, like a webhook that sends updates whenever a user’s subscription status changes.

**Examples from Popular Platforms:**

1. **GitHub Webhooks**:
    - **Push Event**: Triggered when code is pushed to a repository.
    - **Issue Event**: Triggered when an issue is opened, closed, or updated.
    - **Pull Request Event**: Triggered when a pull request is opened, closed, or merged.
2. **Stripe Webhooks**:
    - **Payment Intent Succeeded**: Triggered when a payment is successfully completed.
    - **Invoice Paid**: Triggered when an invoice is paid.
    - **Customer Created**: Triggered when a new customer is created.
3. **Slack Webhooks**:
    - **Incoming Webhooks**: Allow external applications to send messages into Slack channels.
    - **Slash Commands**: Allow users to interact with external applications via commands typed in Slack.

**Security and Verification:**

1. **Secret Tokens**:
    - Webhooks often use secret tokens to verify the authenticity of the source. The source system includes a token in the webhook request, which the destination system verifies to ensure the request is legitimate.
2. **SSL/TLS Encryption**:
    - To ensure data security, webhooks should use HTTPS to encrypt data in transit.
3. **Retries and Error Handling**:
    - Implementing retries in case the webhook delivery fails is a common practice. The source system may retry sending the webhook if it does not receive a successful acknowledgment from the destination system.

**Difference between a Web hook and an API:**

| Feature | Webhook | API |
| --- | --- | --- |
| Initiation | Event-driven (automatic push) | Request-response (manual pull) |
| Updates | Real-time | On-demand |
| Efficiency | High (no polling needed) | Can be lower (may require polling) |
| Setup | Needs a URL to receive data | Needs endpoints to request data |
| Typical Use Case | Notifications, real-time alerts | Fetching data, performing operations |
| Data Transfer | HTTP POST requests | HTTP methods (GET, POST, PUT, DELETE) |
| Security | Secret tokens, SSL/TLS | API keys, OAuth, SSL/TLS |
| Error Handling | Retries if fails | Immediate error response |
| Resource Use | Low on client side | Can be higher on client side |
- **Webhooks** push data to you when something happens.
- **APIs** let you pull data when you need it.

**How to Use it?**
**Using Web Hook:**
Step 1: Set Up Django Project

1. **Install Django:**
    
    ```python
    pip install django
    
    ```
    
2. **Create a Django Project:**
    
    ```python
    django-admin startproject myproject
    cd myproject
    
    ```
    
3. **Create a Django App:**
    
    ```bash
    python manage.py startapp myapp
    
    ```
    
4. **Add the App to `INSTALLED_APPS` in `myproject/settings.py`:**
    
    ```python
    INSTALLED_APPS = [
        ...
        'myapp',
    ]
    
    ```
    
Step 2: Create a Webhook Endpoint

1. **Define the URL in `myapp/urls.py`:**
    
    ```python
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('webhook/', views.webhook, name='webhook'),
    ]
    
    ```
    
2. **Include the App URLs in `myproject/urls.py`:**
    
    ```python
    from django.contrib import admin
    from django.urls import include, path
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('myapp/', include('myapp.urls')),
    ]
    
    ```
    
3. **Create the View in `myapp/views.py`:**
    
    ```python
    from django.http import JsonResponse
    from django.views.decorators.csrf import csrf_exempt
    import json
    
    @csrf_exempt
    def webhook(request):
        if request.method == 'POST':
            data = json.loads(request.body)
            # Process the webhook data here
            print(data)
            return JsonResponse({'status': 'success'}, status=200)
        return JsonResponse({'error': 'invalid method'}, status=400)
    
    ```
    

Step 3: Run the Server

1. **Run the Django Development Server:**
    
    ```bash
    python manage.py runserver
    
    ```
    
2. **Configure the Source System:**
    - Register the webhook URL (e.g., `http://your-domain.com/myapp/webhook/`) with the service that will send the webhook data.

**Using APIs in Django:**

Step 1: Make an API Request

1. **Install Requests Library:**
    
    ```bash
    pip install requests
    
    ```
    
2. **Create a View to Fetch Data from an API in `myapp/views.py`:**
    
    ```python
    import requests
    from django.shortcuts import render
    
    def fetch_data(request):
        api_url = '<https://api.example.com/data>'
        headers = {'Authorization': 'Bearer YOUR_API_TOKEN'}
        response = requests.get(api_url, headers=headers)
        data = response.json() if response.status_code == 200 else None
        return render(request, 'data.html', {'data': data})
    
    ```
    
3. **Define the URL in `myapp/urls.py`:**
    
    ```python
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('webhook/', views.webhook, name='webhook'),
        path('fetch-data/', views.fetch_data, name='fetch_data'),
    ]
    
    ```
    
4. **Create a Template to Display the Data in `myapp/templates/data.html`:**
    
    ```html
    <!DOCTYPE html>
    <html>
    <head>
        <title>API Data</title>
    </head>
    <body>
        <h1>API Data</h1>
        <pre>{{ data }}</pre>
    </body>
    </html>
    
    ```
    

Running the Server:

1. **Run the Django Development Server:**
    
    ```bash
    python manage.py runserver
    
    ```
    
2. **Access the API Data Fetch View:**
    - Open a browser and go to `http://localhost:8000/myapp/fetch-data/` to see the data fetched from the API.

**Conclusion:**

In short, webhooks is a key tool in Django for real-time updates and connecting with other services. By using them effectively, developers can make apps more responsive, scalable, and user-friendly.

Stay tuned for the next post diving into APIs, another essential tool for seamless integration!
I hope this post was informative and helpful.
If you have any questions, please feel free to leave a comment below.

Happy Coding 👍🏻!
Thank You