Вопрос проверяет умение работать с внешними API и безопасно обрабатывать webhook-уведомления.
Интеграция со сторонним API обычно строится вокруг HTTP-клиента (например, requests или httpx), чётких моделей данных и обработки ошибок. Для webhook-ов важно правильно настроить публичный эндпоинт, проверку подлинности (подписи, секреты) и логирование входящих запросов. Типичный пайплайн: принять webhook, провалидировать, записать в очередь/БД, затем асинхронно обработать. Это помогает не блокировать ответ внешнему сервису и защититься от временных проблем. Также важно предусмотреть идемпотентность и повторную доставку событий, например используя внешние ID и таблицу обработки.
Определение.
Сторонний API — это HTTP/JSON или иной интерфейс другого сервиса, к которому ваш код обращается для получения или отправки данных.
Основные шаги интеграции:
Понять контракт:
Какие эндпоинты есть.
Какие форматы данных используются (JSON, XML).
Какие коды ответа возвращает сервис.
Как происходит аутентификация (API key, OAuth2, подписи).
Инкапсулировать интеграцию:
Выделить отдельный модуль/класс Client.
Скрыть детали HTTP внутри него.
Оставить наружу «бизнесовые» методы (create_invoice, get_user_info и т.п.).
Обрабатывать ошибки:
Повторные попытки (retries).
Таймауты.
Логирование.
Python
import requests
class PaymentClient:
def __init__(self, base_url: str, api_key: str):
self.base_url = base_url
self.api_key = api_key
def create_invoice(self, amount: int) -> dict:
response = requests.post(
f"{self.base_url}/invoices",
json={"amount": amount},
headers={"Authorization": f"Bearer {self.api_key}"},
timeout=5,
)
response.raise_for_status()
return response.json()
Определение.
Webhook — это обратный HTTP-запрос от внешнего сервиса в ваш сервис, который сообщает о событии (например, «платёж оплачен»).
Схема:
Вы регистрируете в стороннем сервисе URL (например, https://myapp.com/webhooks/payments).
При событии сервис делает POST-запрос на этот URL.
Ваш сервер принимает запрос, проверяет подпись/секрет и обрабатывает данные.
Основные принципы:
Безопасность:
Проверка подписи или секретного ключа в заголовках.
Проверка источника IP — опционально.
Отбрасывание запросов без валидной подписи.
Надёжность:
Возможность повторной доставки (внешний сервис может отправлять одно и то же событие несколько раз).
Логирование всех входящих запросов.
Обработка в несколько шагов:
Приняли и быстро ответили 200 OK (или другим кодом, нужным сервису).
Событие положили в очередь или БД.
Отдельный воркер обработал событие.
Python
from fastapi import FastAPI, Request, HTTPException
app = FastAPI()
SECRET = "mysecret"
@app.post("/webhooks/payment")
async def payment_webhook(request: Request):
signature = request.headers.get("X-Signature")
body = await request.body()
if not verify_signature(body, signature, SECRET):
raise HTTPException(status_code=401, detail="Invalid signature")
event = await request.json()
# Сохраняем событие в БД/очередь для асинхронной обработки
save_event(event)
return {"status": "ok"}
Функции verify_signature и save_event вы реализуете под конкретный сервис.
Через очередь:
Сохраняем событие в RabbitMQ, Kafka, Redis stream или БД.
Воркер (Celery, RQ, custom воркер) забирает событие и обрабатывает.
Эндпоинт вебхука отвечает быстро и не падает при проблемах обработки.
Через фоновые задачи фреймворка:
FastAPI: BackgroundTasks.
Django: Celery или аналог.
Python (упрощённый пример с BackgroundTasks)
from fastapi import BackgroundTasks
@app.post("/webhooks/payment")
async def payment_webhook(request: Request, background_tasks: BackgroundTasks):
event = await request.json()
background_tasks.add_task(process_event, event)
return {"status": "accepted"}
Для исходящих интеграций:
Инкапсулируйте вызовы в отдельном клиенте.
Обрабатывайте таймауты и ошибки.
Логируйте важные запросы и ответы.
Для webhook-ов:
Проверяйте подпись и источник.
Не блокируйте ответ внешнему сервису долгой обработкой.
Делайте обработку идемпотентной и устойчивой к повторной доставке.
Краткий вывод:
Интеграция со сторонними API строится на чётком контракте, инкапсуляции HTTP-логики и контроле ошибок. Вебхуки требуют особого внимания к безопасности, идемпотентности и асинхронной обработке, чтобы ваш сервис оставался стабильным даже при большом количестве событий и повторах.