🧱 Суть

REST API – это способ обмена данными между приложениями через HTTP-запросы.

Например:

PHP-приложение
       |
       | HTTP-запрос

Внешний API
       |

JSON-ответ

PHP может выступать в роли клиента:

  • получать данные из внешних сервисов
  • отправлять данные
  • работать с авторизацией
  • интегрироваться с платежами, картами, погодой, соцсетями и другими сервисами

Для HTTP-запросов в PHP часто используют расширение:

cURL

💻 Код

Основы REST API

REST API обычно использует стандартные HTTP-методы.

МетодНазначениеПример
GETполучить данныеполучить пользователя
POSTсоздать данныесоздать заказ
PUTобновить данныеизменить профиль
PATCHчастично обновитьизменить имя
DELETEудалить данныеудалить запись
Пример запроса:
GET https://api.example.com/users/1

Ответ:

{
    "id": 1,
    "name": "Alex"
}

Что такое cURL

cURL – это библиотека для выполнения HTTP-запросов.

В PHP используется через функции:

curl_*

Простейший запрос:

$curl = curl_init();
 
curl_setopt(
    $curl,
    CURLOPT_URL,
    'https://api.example.com/users'
);
 
curl_setopt(
    $curl,
    CURLOPT_RETURNTRANSFER,
    true
);
 
$response = curl_exec($curl);
 
curl_close($curl);

Разбор

Создание клиента

curl_init();

Создаёт объект cURL-сессии.

Настройка запроса

curl_setopt();

Задаёт параметры запроса.

Например:

CURLOPT_URL

адрес API.

Получение ответа

CURLOPT_RETURNTRANSFER

говорит:

вернуть ответ как строку, а не вывести его сразу

Выполнение

curl_exec();

Отправляет запрос.

Закрытие

curl_close();

Освобождает ресурсы.

GET-запрос

Пример:

$curl = curl_init();
 
curl_setopt_array(
    $curl,
    [
        CURLOPT_URL => 'https://api.example.com/users',
        CURLOPT_RETURNTRANSFER => true,
    ]
);
 
$response = curl_exec($curl);
 
curl_close($curl);
 
$data = json_decode(
    $response,
    true
);

Теперь:

$data['name'];

можно использовать в коде.

Передача параметров GET

Например:

/api/users?id=10

В PHP:

$params = http_build_query([
    'id' => 10,
    'page' => 2
]);
 
$url =
"https://api.example.com/users?$params";

Результат:

/users?id=10&page=2

POST-запрос

POST используется для отправки данных.

Пример:

$data = [
    'name' => 'Alex',
    'email' => 'alex@test.com'
];
 
$curl = curl_init();
 
curl_setopt_array(
    $curl,
    [
        CURLOPT_URL => 'https://api.example.com/users',
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => json_encode($data),
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json'
        ],
        CURLOPT_RETURNTRANSFER => true,
    ]
);
 
$response = curl_exec($curl);
 
curl_close($curl);

Заголовки HTTP

Через headers передаются:

  • тип данных
  • токены авторизации
  • ключи API

Пример:

CURLOPT_HTTPHEADER => [
    'Content-Type: application/json',
    'Authorization: Bearer TOKEN'
]

Авторизация через Bearer Token

Многие API используют JWT-токены.

Запрос:

Authorization: Bearer eyJhbGci...

В PHP:

curl_setopt(
    $curl,
    CURLOPT_HTTPHEADER,
    [
        'Authorization: Bearer ' . $token
    ]
);

Работа с JSON

Большинство REST API возвращают JSON.

Получение:

$response = curl_exec($curl);
 
$data = json_decode(
    $response,
    true
);

Теперь JSON:

{
    "id": 5,
    "name": "Alex"
}

становится:

[
    'id' => 5,
    'name' => 'Alex'
]

Отправка JSON:

$json = json_encode([
    'name' => 'Alex'
]);

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

Важно проверять результат.

Плохо:

$response = curl_exec($curl);

Без проверки.

Правильно:

$response = curl_exec($curl);
 
if ($response === false) {
    throw new Exception(
        curl_error($curl)
    );
}

Проверка HTTP-статуса

API может вернуть:

200 OK
404 Not Found
500 Server Error

Получить код:

$status = curl_getinfo(
    $curl,
    CURLINFO_HTTP_CODE
);

Пример:

if ($status !== 200) {
    throw new Exception(
        "API error: $status"
    );
}

Пример функции-обёртки

В реальных проектах часто создают свой клиент:

function apiRequest(
    string $url
): array {
 
    $curl = curl_init();
 
    curl_setopt_array(
        $curl,
        [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
        ]
    );
 
    $response = curl_exec($curl);
 
    curl_close($curl);
 
    return json_decode(
        $response,
        true
    );
}

Использование:

$user = apiRequest(
    'https://api.example.com/user/1'
);

REST API в архитектуре приложения

Часто структура выглядит так:

src/
 ├── Services/
 │    └── WeatherApi.php
 │
 ├── Http/
 │    └── Client.php
 │
 └── Controllers/
      └── WeatherController.php

Где:

  • Client отвечает за HTTP-запросы
  • Service знает конкретный API
  • Controller использует данные

Частые ошибки

Не проверять ошибки API

Плохо:

$data = json_decode(
    curl_exec($curl),
    true
);

Если API упал – непонятно почему.

Хранить токены в коде

Плохо:

$token = "secret123";

Лучше:

.env

Например:

API_TOKEN=secret123

Не ограничивать время ожидания

Без timeout запрос может зависнуть.

Добавлять:

CURLOPT_TIMEOUT => 10

Не проверять ответ API

Нельзя сразу доверять данным:

echo $data['name'];

Лучше проверять структуру ответа.

🎯 Вывод

  • REST API позволяет приложениям обмениваться данными через HTTP
  • PHP может работать как клиент внешних API
  • Для HTTP-запросов часто используют cURL
  • curl_init() создаёт запрос
  • curl_setopt() настраивает параметры
  • curl_exec() выполняет запрос
  • json_decode() преобразует JSON в массив
  • json_encode() отправляет данные в JSON
  • всегда нужно проверять ошибки и HTTP-коды
  • токены и секреты нельзя хранить в коде
  • в больших проектах cURL обычно выносят в отдельный HTTP-клиент

🔗 Связано