Урок 33: Работа с API

В 33-м уроке мы изучим одну из интересных и практичных тем, это взаимодействие с внешними API на PHP. Это ключевой навык для любого разработчика, ведь API позволяют интегрировать данные и функционал из других сервисов (например погода, социальные сети, платежные системы) в ваши приложения. В этом уроке я подробно расскажу, как получать данные из API, обрабатывать JSON-ответы и применять это на практике.

Что такое API?

API (Application Programming Interface) это интерфейс, который позволяет программам обмениваться данными. Представьте, что вы в ресторане: вы (клиент) делаете заказ официанту (API), а он передает его на кухню (сервер). В итоге вы получаете блюдо (данные) без необходимости знать, как его готовили.

API работают по схожему принципу:

  1. Ваш код отправляет HTTP-запрос на сервер (например, GETPOST).
  2. Сервер обрабатывает запрос и возвращает ответ в формате JSON или XML.
  3. Вы парсите ответ и используете данные в своем приложении.

Получение данных из внешних API

Для отправки HTTP-запросов в PHP есть несколько способов. Рассмотрим два основных: cURL и file_get_contents().

Способ 1: Использование cURL

cURL это библиотека для передачи данных по различным протоколам. Вот пример запроса к API погоды:

<?php
// Указываем URL API (пример: OpenWeatherMap)
$apiKey = 'ваш_ключ_api';
$city = 'Moscow';
$url = "https://api.openweathermap.org/data/2.5/weather?q=$city&appid=$apiKey&units=metric";

// Инициализируем cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Отправляем запрос и получаем ответ
$response = curl_exec($ch);

// Проверяем на ошибки
if (curl_errno($ch)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    // Обрабатываем ответ (об этом позже)
    var_dump($response);
}

// Закрываем соединение
curl_close($ch);
?>

Пояснение:

  • curl_init() создает сеанс cURL.
  • curl_setopt() настраивает параметры (например, URL и возврат ответа в виде строки).
  • curl_exec() выполняет запрос.
  • Всегда проверяйте ошибки через curl_errno()!

Способ 2: Использование file_get_contents()

Этот метод проще, но менее гибкий. Подходит для простых GET-запросов:

<?php
$url = 'https://jsonplaceholder.typicode.com/posts/1';
$response = file_get_contents($url);

if ($response === false) {
    echo 'Ошибка при получении данных';
} else {
    $data = json_decode($response, true); // Преобразуем JSON в массив
    print_r($data);
}
?>

Важно:

  • Для работы с HTTPS может потребоваться включить allow_url_fopen = On в php.ini.
  • Не подходит для POST-запросов или сложных сценариев.

Пример POST-запроса через cURL

Иногда API требуют отправки данных (например, авторизация). Вот как отправить POST:

<?php
$url = 'https://api.example.com/login';
$postData = [
    'username' => 'user123',
    'password' => 'secret'
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);

// Обработка ответа...
?>

Парсинг JSON-ответов

Большинство API возвращают данные в формате JSON. В PHP для работы с ним есть функция json_decode().

Базовый пример

Допустим, мы получили от API такой JSON:

json
{
    "id": 1,
    "title": "Пример поста",
    "body": "Это тело поста...",
    "userId": 1
}

Преобразуем его в объект или массив:

php
$response = '{"id":1, "title":"Пример поста", ... }';
$data = json_decode($response); // По умолчанию возвращается объект

echo $data->title; // Выведет "Пример поста"

// Или в виде ассоциативного массива:
$data = json_decode($response, true);
echo $data['title'];

Обработка сложных структур

Часто JSON содержит вложенные объекты или массивы. Например, ответ API может выглядеть так:

json
{
    "status": "success",
    "data": [
        {"id": 1, "name": "Иван"},
        {"id": 2, "name": "Мария"}
    ]
}

Парсим так:

php
$data = json_decode($response);
if ($data->status === 'success') {
    foreach ($data->data as $user) {
        echo "Пользователь: " . $user->name . "<br>";
    }
} else {
    echo "Ошибка API";
}

Обработка ошибок JSON

Всегда проверяйте, что JSON валиден:

php
$data = json_decode($response);

if (json_last_error() !== JSON_ERROR_NONE) {
    echo 'Ошибка парсинга JSON: ' . json_last_error_msg();
}

Практические задачи

Закрепим материал реальными примерами.

Задача 1: Получить курс валют

Используйте API Центробанка России:

$url = 'https://www.cbr-xml-daily.ru/daily_json.js';
$response = file_get_contents($url);
$data = json_decode($response);

echo "Доллар: " . $data->Valute->USD->Value . " руб.<br>";
echo "Евро: " . $data->Valute->EUR->Value . " руб.";

Задача 2: Парсинг постов с JSONPlaceholder

Сайт JSONPlaceholder предоставляет тестовые данные. Получите список постов:

$url = 'https://jsonplaceholder.typicode.com/posts';
$response = file_get_contents($url);
$posts = json_decode($response, true);

foreach ($posts as $post) {
    echo "<h3>" . $post['title'] . "</h3>";
    echo "<p>" . $post['body'] . "</p>";
}

Задача 3: Создать простой клиент для GitHub API

Получите информацию о репозитории:

$username = 'laravel';
$repo = 'laravel';
$url = "https://api.github.com/repos/$username/$repo";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'MyPHPApp'); // GitHub требует User-Agent
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
$data = json_decode($response);

echo "Репозиторий: " . $data->name . "<br>";
echo "Звезд: " . $data->stargazers_count;

Советы

  1. Всегда проверяйте документацию API. Там указаны доступные методы, параметры и ограничения.
  2. Используйте заголовки. Некоторые API требуют передачи Authorization или Content-Type.
  3. Кэшируйте данные.  Чтобы снизить нагрузку на сервер (например, сохраняйте ответ в файл на 1 час).
  4. Обрабатывайте ошибки. Проверяйте HTTP-коды ответов (200 — OK, 404 — не найдено и т.д.).

Сегодня вы научились работать с внешними API. Отправлять GET/POST-запросы через cURL и file_get_contents(), парсить JSON-ответы и применять это в реальных задачах. Это мощный инструмент, который открывает бесконечные возможности для интеграции данных в ваши проекты.

Создайте мини-приложение, которое показывает погоду, курсы валют или последние посты из блога. Чем больше практики, тем глубже понимание.

Полный курс с уроками по PHP для начинающих по ссылке: https://max-gabov.ru/php-dlya-nachinaushih

Удачи в изучении PHP и до встречи на следующих уроках.