Что такое REST API? Как создать API на PHP?php-25

REST (Representational State Transfer) — это архитектурный стиль для создания веб-сервисов, основанный на стандартных HTTP-методах и статусах.

Основные принципы REST API

  1. Клиент-серверная архитектура — разделение ответственности
  2. Stateless — каждый запрос содержит всю необходимую информацию
  3. Кэширование — ответы могут кэшироваться
  4. Единообразие интерфейса — стандартные методы HTTP
  5. Ресурсоориентированность — всё является ресурсом с уникальным URI

HTTP-методы в REST

Метод Описание Пример использования
GET Получение ресурса Получить данные пользователя
POST Создание ресурса Создать нового пользователя
PUT Полное обновление ресурса Обновить все данные
PATCH Частичное обновление Обновить только email
DELETE Удаление ресурса Удалить пользователя

Создание простого REST API на чистом PHP

1. Настройка маршрутизации

$requestMethod = $_SERVER['REQUEST_METHOD'];
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$uri = explode('/', trim($uri, '/'));

// Пример: /api/users/1 → ['api', 'users', '1']
$resource = $uri[1] ?? null;
$resourceId = $uri[2] ?? null;

header('Content-Type: application/json');
try {
    switch ("$requestMethod $resource") {
        case 'GET users':
            echo json_encode(getUsers());
            break;
        case 'GET users' when $resourceId:
            echo json_encode(getUser($resourceId));
            break;
        case 'POST users':
            $data = json_decode(file_get_contents('php://input'), true);
            echo json_encode(createUser($data));
            break;
        default:
            http_response_code(404);
            echo json_encode(['error' => 'Not Found']);
    }
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['error' => $e->getMessage()]);
}

2. Реализация контроллера пользователей

function getUsers() {
    // В реальном приложении - запрос к БД
    return [
        ['id' => 1, 'name' => 'John'],
        ['id' => 2, 'name' => 'Jane']
    ];
}

function getUser($id) {
    $users = getUsers();
    foreach ($users as $user) {
        if ($user['id'] == $id) {
            return $user;
        }
    }
    throw new Exception('User not found', 404);
}

function createUser($data) {
    // Валидация данных
    if (empty($data['name'])) {
        throw new Exception('Name is required', 400);
    }

    // В реальном приложении - сохранение в БД
    return ['id' => 3, 'name' => $data['name']];
}

Современный подход с использованием фреймворков

Пример с Laravel:

// routes/api.php
Route::apiResource('users', UserController::class);

// app/Http/Controllers/UserController.php
class UserController extends Controller
{
    public function index()
    {
        return User::all();
    }

    public function store(Request $request)
    {
        return User::create($request->validate([
            'name' => 'required|string',
            'email' => 'required|email|unique:users'
        ]));
    }

    // ... другие методы
}

Ключевые аспекты хорошего REST API

  1. Стандартные HTTP-статусы:

    • 200 OK — успешный GET
    • 201 Created — успешный POST
    • 204 No Content — успешный DELETE
    • 400 Bad Request — неверный запрос
    • 401 Unauthorized — требуется авторизация
    • 404 Not Found — ресурс не существует
    • 500 Internal Server Error — ошибка сервера
  2. Версионирование API:

    • Включите версию в URL: /api/v1/users
    • Или в заголовках: Accept: application/vnd.myapi.v1+json
  3. Пагинация:

    {
      "data": [...],
      "meta": {
        "current_page": 1,
        "per_page": 10,
        "total": 100
      }
    }
    
  4. Аутентификация:

    • JWT (JSON Web Tokens)
    • OAuth 2.0
    • API-ключи

Документирование API

Используйте инструменты:

  • Swagger/OpenAPI
  • Postman Collections
  • Redoc

Тестирование API

Пример теста с PHPUnit:

class ApiTest extends TestCase
{
    public function testGetUsers()
    {
        $response = $this->get('/api/users');
        $response->assertStatus(200)
                 ->assertJsonStructure([
                     '*' => ['id', 'name']
                 ]);
    }
}

Резюмируем:

REST API на PHP создается с использованием стандартных HTTP-методов и статусов. Для простых API можно использовать чистый PHP, но для production-решений лучше применять фреймворки (Laravel, Symfony). Ключевые аспекты: единообразие, версионирование, пагинация и грамотное документирование.