Уявіть, що ви чекаєте доставку пакунка. Замість того, щоб постійно перевіряти сайт відстеження, служба доставки надсилає вам SMS-сповіщення, як тільки ваш пакунок доставлений. Ось що насправді робить webhook у цифровому світі!
Webhook — це спосіб, яким одна програма автоматично надсилає реальні дані іншій програмі, коли щось відбувається. Це схоже на push-сповіщення для серверів. Замість того, щоб одна програма постійно запитувала (polling) іншу програму щодо оновлень, перша програма просто каже: "Привіт, щось сталося — ось інформація!" і надсилає дані на вказану вами URL-адресу.
Розкриття потенціалу 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 — це ваша суперсила
Розкриття потенціалу Webhooks
З всього кілька рядків коду, ви перетворили свій додаток на реальний слухач. Webhooks — це не просто інструмент, це зміна мислення, що дозволяє реагувати на світ, поки він відбувається. Тож давайте підключайте ваш додаток до платіжних шлюзів, API чи навіть пристроїв IoT і спостерігайте, як розгортається магія!
Перекладено з: Webhooks Unleashed: Real-Time Magic with Ruby on Rails