Работали ли вы с HTTP-запросами к внешним API или сторонним ресурсам?

«Работали ли вы с HTTP-запросами к внешним API или сторонним ресурсам?» — вопрос из категории Сети, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, постоянно. В PHP для этого есть несколько инструментов, выбор зависит от контекста.

Для простых GET-запросов часто использовал file_get_contents() с контекстом:

$context = stream_context_create([
    'http' => [
        'method' => 'GET',
        'header' => "Authorization: Bearer TOKENrn"
    ]
]);
$response = file_get_contents('https://api.example.com/data', false, $context);
$data = json_decode($response, true);

Для сложных запросов (POST, кастомные заголовки, SSL-настройки) применял cURL:

$ch = curl_init('https://api.example.com/data');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode(['key' => 'value']),
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer TOKEN',
        'Content-Type: application/json'
    ],
    CURLOPT_TIMEOUT => 10
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
    throw new RuntimeException('CURL error: ' . curl_error($ch));
}
curl_close($ch);

В современных проектах предпочитаю использовать клиентские библиотеки, такие как Guzzle, которые инкапсулируют низкоуровневые детали, предоставляют удобный интерфейс и встроенные механизмы повторных попыток, обработки ошибок и логирования.

Ключевые моменты, которые всегда учитываю:

  • Таймауты (соединение и чтение), чтобы не блокировать скрипт.
  • Обработку HTTP-статусов (особенно 4xx и 5xx).
  • Безопасность: валидацию входящих URL, использование HTTPS.
  • Кэширование ответов, если данные не меняются часто, для снижения нагрузки на внешний сервис.