Сначала определите контракт интеграции
Запишите endpoint, method, обязательные поля, auth, допустимые HTTP-коды, timeout, rate limit и правило повторов. Это важнее выбора HTTP-библиотеки.
HTTP-код → действие клиента
| Код | Что делать |
|---|---|
| 200–299 | обработать результат |
| 400/422 | исправить payload, не повторять автоматически |
| 401/403 | проверить token/permissions |
| 404 | проверить endpoint/id объекта |
| 409 | конфликт/duplicate — зависит от API |
| 429 | учесть Retry-After/rate limit |
| 500–504 | ограниченный retry с backoff |
Минимальный JSON API client на PHP cURL
$ch = curl_init('https://api.example.com/v1/items');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Authorization: Bearer ' . getenv('API_TOKEN'),
],
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 15,
]);
$body = curl_exec($ch);
$status = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($body === false) {
throw new RuntimeException($error);
}
$data = json_decode($body, true);Таймаут — не значит, что операция не выполнилась
Особенно опасны POST-запросы: сервер мог создать объект, а клиент не получил ответ. Поэтому для платежей, CRM и заказов используйте idempotency/external_id или запрос статуса перед повтором.
Где хранить токены
Не помещайте секретный API token в JavaScript, HTML или публичный repository. Серверные секреты должны жить в env/config вне public web root или в secret storage.
Пример простого backoff
$delays = [1, 2, 4, 8];
foreach ($delays as $delay) {
$result = callApi();
if ($result['status'] < 500 && $result['status'] !== 429) {
break;
}
sleep($delay);
}Скачать примеры для веб-разработки
Связанные материалы
Надёжная интеграция REST API
До интеграции зафиксируйте методы API, способы авторизации, лимиты запросов, версии схемы данных и коды ошибок. Устанавливайте таймауты и разделяйте повторяемые операции от тех, которые могут создавать дубли. При ответе 429 учитывайте ограничения провайдера, а при ошибках 4xx сначала проверяйте запрос — повтор без изменений часто бессмысленен.
В журнале храните время, корреляционный идентификатор, статус и обезличенный ответ, но не пароли и bearer-токены. Для приёмки нужны тесты на потерю соединения и устаревший токен.