Webhooks розкриті: Магія реального часу з Ruby on Rails

Уявіть, що ви чекаєте доставку пакунка. Замість того, щоб постійно перевіряти сайт відстеження, служба доставки надсилає вам SMS-сповіщення, як тільки ваш пакунок доставлений. Ось що насправді робить webhook у цифровому світі!

Webhook — це спосіб, яким одна програма автоматично надсилає реальні дані іншій програмі, коли щось відбувається. Це схоже на push-сповіщення для серверів. Замість того, щоб одна програма постійно запитувала (polling) іншу програму щодо оновлень, перша програма просто каже: "Привіт, щось сталося — ось інформація!" і надсилає дані на вказану вами URL-адресу.

pic

Розкриття потенціалу Webhooks

У світі, де швидкість має вирішальне значення, очікування даних схоже на процес висихання фарби. Ось і з’являються webhooks — непомітні герої реального часу. Будь то оновлення вашого додатку після здійснення платежу, реєстрації користувача або завантаження файлу — webhooks доставляють інформацію в той момент, коли це відбувається. Сьогодні ми відкриємо цей технологічний скарб, дізнаємось, що це таке, і створимо webhook з нуля на Ruby on Rails. Приготуйтеся — буде цікаво!

Webhooks 101: Основи

Подумайте про webhook як про цифрового кур'єра. Коли подія відбувається в одній системі (наприклад, новий коміт на GitHub або транзакція в PayPal), система не чекає, поки ви запитаєте про це. Замість цього вона надсилає запит на URL-адресу, яку ви налаштували, з payload (зазвичай шматком JSON-даних), вказуючи, що саме сталося. Це легковажне, миттєве і набагато ефективніше, ніж постійно запитувати API.

Наприклад:

  • Подія: Користувач підписується на вашу розсилку.
  • Дія webhook: Ваша поштові служба (наприклад, Mailchimp) надсилає POST-запит на URL вашого додатку з email користувача та часом реєстрації.
  • Результат: Ваш додаток реєструє це, надсилає привітальний лист або оновлює інформаційну панель — все це в реальному часі.

Чому Webhooks круті

  • Реальний час: Ніяких затримок, ніякого оновлення — тільки миттєві оновлення.
  • Ефективність: Ваш додаток не витрачає ресурси на перевірку змін.
  • Гнучкість: Від платежів до сповіщень — webhooks адаптуються до будь-якої події.

Давайте створимо один: Webhooks на Ruby on Rails

Готові бруднити руки? Давайте створимо простий додаток на Rails, який отримує webhook від уявної платіжної служби і реєструє транзакцію. Ми зробимо це доступним для початківців, але з функціональністю.

Крок 1: Налаштуйте ваш Rails додаток

Припустимо, у вас вже встановлені Ruby та Rails, почнемо новий проект:

rails new WebhookDemo --database=sqlite3  
cd WebhookDemo

Крок 2: Створіть модель для зберігання транзакцій

Ми зберігатимемо дані про платіж у моделі Transaction. Згенеруємо її за допомогою:

rails generate model Transaction amount:decimal user_name:string status:string  
rails db:migrate

Це створить таблицю з колонками для суми платежу, імені користувача та статусу (наприклад, "завершено").

Крок 3: Налаштуйте точку доступу для webhook

У Rails webhook — це просто дія в контролері, яка приймає POST-запит.

Створіть контролер:

rails generate controller Webhooks receive

Відкрийте app/controllers/webhooks_controller.rb і відредагуйте його:

class WebhooksController < ApplicationController  
 # Пропускаємо перевірку CSRF для цього ендпойнта, оскільки це зовнішній API-запит  
 skip_before_action :verify_authenticity_token, only: :receive  

 def receive  
 # Отримуємо payload з webhook (надіслано як JSON)  
 payload = request.body.read  
 data = JSON.parse(payload)  

 # Отримуємо необхідну інформацію  
 amount = data['amount']  
 user_name = data['user_name']  
 status = data['status']  

 # Зберігаємо в базу даних  
 Transaction.create!(  
 amount: amount,  
 user_name: user_name,  
 status: status  
 )  

 # Відповідаємо статусом успіху  
 render json: { message: "Webhook отримано успішно" }, status: :ok  
 rescue StandardError => e  
 # Обробляємо помилки коректно  
 render json: { error: e.message }, status: :unprocessable_entity  
 end  
end

Крок 4: Визначте маршрут

У config/routes.rb додайте:

Rails.application.routes.draw do  
 post '/webhook', to: 'webhooks#receive'  
end

Тепер ваш додаток буде слухати POST-запити на http://localhost:3000/webhook.

Крок 5: Перевірте

Запустіть сервер Rails:

rails server

Щоб симулювати webhook, використовуйте інструмент, такий як curl або Postman, щоб надіслати POST-запит:

curl -X POST http://localhost:3000/webhook \  
 -H "Content-Type: application/json" \  
 -d '{"amount": 29.99, "user_name": "Jane Doe", "status": "completed"}'

Перевірте свою базу даних (rails dbconsole або інструмент, такий як SQLite Browser), щоб побачити новий запис транзакції. Ви також повинні побачити JSON-відповідь: {“message”: “Webhook отримано успішно”}.

Крок 6: Захистити (Опційно, але рекомендується)

В реальному додатку ви б захотіли:

  • Перевірити джерело: Перевірити підпис або секретний токен, надісланий постачальником webhook, щоб переконатися, що це справжній запит.
  • Обробляти дублікати: Використовувати event_id з payload, щоб уникнути обробки одного й того ж webhook двічі.

Ось швидкий варіант для захисту:

def receive  
 # Приклад: Перевірити секретний токен з заголовка  
 return render json: { error: "Unauthorized" }, status: :unauthorized unless request.headers['X-Webhook-Secret'] == "my_secret_key"  

 payload = request.body.read  
 data = JSON.parse(payload)  
 # ... решта коду  
end

Реальний випадок використання

Уявіть інтеграцію з Stripe. Їхній webhook може надіслати:

{  
 "id": "evt_123",  
 "type": "charge.succeeded",  
 "data": {  
 "object": {  
 "amount": 5000,  
 "customer": "cus_abc",  
 "status": "succeeded"  
 }  
 }  
}

Вам потрібно буде налаштувати контролер для розбору цієї специфічної структури і, можливо, отримати додаткові деталі про клієнта через API Stripe.

Підсумок: Webhooks — це ваша суперсила

pic

Розкриття потенціалу Webhooks

З всього кілька рядків коду, ви перетворили свій додаток на реальний слухач. Webhooks — це не просто інструмент, це зміна мислення, що дозволяє реагувати на світ, поки він відбувається. Тож давайте підключайте ваш додаток до платіжних шлюзів, API чи навіть пристроїв IoT і спостерігайте, як розгортається магія!

Перекладено з: Webhooks Unleashed: Real-Time Magic with Ruby on Rails