Этот тренажер посвящен HTTP-методам, которые являются основой любого REST API. Ты начнешь с основ: сопоставишь каждый метод с его действием, например, что делает GET, а что POST. Затем научишься классифицировать методы по их свойствам, таким как безопасность и идемпотентность. Постепенно перейдешь к практике в PHP: будешь писать код для обработки разных типов запросов, собирать из фрагментов простые обработчики, исправлять типичные ошибки и предсказывать, как поведет себя сервер в ответ на тот или иной запрос. Задания построены от простого к сложному, чтобы ты смог уверенно разобраться в теме.
- Модуль 1: Основы синтаксиса PHP
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Модуль 4: Условные конструкции
- Модуль 5: Циклы
- Модуль 6: Массивы
- Индексированные массивы.
- Ассоциативные массивы.
- Многомерные массивы.
- Добавление элементов в массив.
- Удаление элементов из массива.
- Функция count().
- Функция array_push() и array_pop().
- Функция array_shift() и array_unshift().
- Функция array_merge().
- Функция array_slice().
- Функция array_splice().
- Функция in_array().
- Функция array_search().
- Функция array_keys() и array_values().
- Функция array_unique().
- Функция array_reverse().
- Сортировка: sort(), rsort().
- Сортировка: asort(), arsort().
- Сортировка: ksort(), krsort().
- Функция array_map().
- Функция array_filter().
- Функция array_reduce().
- Функция array_walk().
- Функция array_column().
- Деструктуризация массивов.
- Модуль 7: Функции
- Объявление функций.
- Вызов функций.
- Параметры функций.
- Возврат значений return.
- Значения параметров по умолчанию.
- Передача по значению.
- Передача по ссылке.
- Переменное количество аргументов.
- Оператор распаковки ....
- Типизация параметров.
- Типизация возвращаемых значений.
- Nullable типы.
- Union типы (PHP 8).
- Именованные аргументы (PHP 8).
- Анонимные функции.
- Стрелочные функции.
- Замыкания и use.
- Рекурсивные функции.
- Глобальные переменные в функциях.
- Статические переменные в функциях.
- Модуль 8: Работа со строками
- Одинарные и двойные кавычки.
- Экранирование символов.
- Heredoc и Nowdoc синтаксис.
- Функция strlen().
- Функция substr().
- Функция str_replace().
- Функция strpos() и strrpos().
- Функция explode() и implode().
- Функция trim(), ltrim(), rtrim().
- Функция strtolower() и strtoupper().
- Функция ucfirst() и ucwords().
- Функция str_repeat().
- Модуль 9: Суперглобальные переменные
- Модуль 10: Работа с формами
- Модуль 11: Работа с файлами
- Модуль 12: Дата и время
- Модуль 13: Регулярные выражения
- Модуль 14: Сессии и Cookie
- Модуль 15: Include и Require
- Модуль 16: Объектно-ориентированное программирование
- Модуль 17: Пространства имен
- Модуль 18: Обработка ошибок и исключений
- Модуль 19: Работа с JSON и XML
- Модуль 20: Работа с базами данных MySQLi
- Модуль 21: PDO - PHP Data Objects
- Модуль 22: Composer и зависимости
- Модуль 23: cURL и HTTP запросы
- Модуль 24: REST API
- HTTP методы в REST.
- Модуль 25: Безопасность
- Модуль 26: Генераторы и итераторы
- Модуль 27: Reflection API
- Модуль 28: Работа с изображениями
- Модуль 29: Отправка email
- Модуль 30: Паттерны проектирования
- Модуль 31: Тестирование
- Модуль 32: Продвинутые возможности PHP 8+
Сопоставьте HTTP-метод и его основное действие
Каждый HTTP-метод в REST API имеет свое четкое предназначение. Сопоставьте глаголы (методы) из левой колонки с их стандартными действиями из правой, чтобы восстановить логику CRUD-операций (Create, Read, Update, Delete).
Классификация HTTP-методов
HTTP-методы делятся на "безопасные" (не изменяют состояние сервера) и "идемпотентные" (повторный вызов дает тот же результат). Распределите методы по соответствующим категориям. Обратите внимание, что один и тот же метод может попасть в обе категории.
Проверка метода запроса
Напишите простой скрипт, который будет выводить информацию о пользователе, только если запрос был отправлен методом GET. Заполните пропуск, чтобы проверка работала корректно.
<?php
// Эмулируем запрос к /users/1
$userId = 1;
if ($_SERVER['REQUEST_METHOD'] === input1S) {
// Здесь в реальности была бы логика получения данных из БД
$user = ['id' => $userId, 'name' => 'Alice'];
header('Content-Type: application/json');
echo json_encode($user);
} else {
http_response_code(405); // Method Not Allowed
echo "Метод не поддерживается";
}Ошибка: неверный метод для создания данных
В этом коде допущена логическая ошибка. Для создания нового пользователя используется неподходящий HTTP-метод. Найдите и исправьте строку с проверкой метода, чтобы она соответствовала REST-соглашениям.
<?php// Этот скрипт должен создавать нового пользователя if ($_SERVER['REQUEST_METHOD'] === 'GET') { $data = json_decode(file_get_contents('php://input'), true); // ...логика сохранения $data в базу данных... http_response_code(201); // Created echo json_encode(['status' => 'success', 'user_id' => 123]);}Соберите простой маршрутизатор
Создайте основу для API-маршрутизатора с помощью конструкции switch. Перетащите HTTP-методы из банка в соответствующие блоки case для обработки получения, создания и удаления пользователя.
<?php
header("Content-Type: application/json");
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {
case input1S: // Получить пользователя
echo json_encode(['action' => 'getUser']);
break;
case input2S: // Создать пользователя
http_response_code(201);
echo json_encode(['action' => 'createUser']);
break;
case input3S: // Удалить пользователя
http_response_code(204);
break;
default:
http_response_code(405);
echo json_encode(['error' => 'Method Not Allowed']);
break;
}Соберите обработчик GET-запроса
Соберите из фрагментов кода работающий PHP-скрипт, который возвращает список продуктов в формате JSON. Расположите строки в правильном порядке. Одна из строк лишняя.
<?phpheader('Content-Type: application/json');$products = [['name' => 'Laptop', 'price' => 1200], ['name' => 'Mouse', 'price' => 25]];echo json_encode($products);echo "Список продуктов";Какой HTTP-статус будет в ответе?
Данный скрипт обрабатывает PUT-запрос для обновления данных пользователя. В случае успеха он устанавливает определенный HTTP-статус. Проанализируйте код и введите числовое значение статуса, которое будет отправлено клиенту.
<?php
// Предполагаем, что пришел PUT-запрос
if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
$data = json_decode(file_get_contents('php://input'), true);
// Логика обновления пользователя с id=42
// ... update user in database ...
$success = true;
if ($success) {
http_response_code(200);
echo json_encode(['status' => 'updated']);
} else {
http_response_code(500);
echo json_encode(['status' => 'error']);
}
}Результат повторного DELETE-запроса
Метод DELETE является идемпотентным. Это значит, что повторные запросы на удаление одного и того же ресурса должны обрабатываться предсказуемо. Что вернет сервер при ВТОРОМ запросе на удаление пользователя, если первый уже был успешным?
// Эмуляция сервера
function handle_delete_user($userId) {
static $users = [101 => 'Alice', 102 => 'Bob'];
if (isset($users[$userId])) {
unset($users[$userId]);
return ['code' => 204, 'body' => '']; // No Content
} else {
return ['code' => 404, 'body' => 'User not found']; // Not Found
}
}
// Первый запрос: DELETE /users/101
$response1 = handle_delete_user(101);
// Второй запрос: DELETE /users/101
$response2 = handle_delete_user(101);
// Что будет в $response2['code']?Ошибка: чтение JSON-тела запроса
Этот скрипт должен принимать POST-запрос с JSON-телом вида `{"name": "Bob"}` и создавать пользователя. Однако данные из запроса считываются неправильно. Найдите строку с ошибкой и исправьте ее.
<?php// Ожидаем POST-запрос с JSON: {"name": "Bob", "email": "bob@example.com"}if ($_SERVER['REQUEST_METHOD'] === 'POST') { $name = $_POST['name']; // Эта строка неверна для JSON-запроса if (!empty($name)) { http_response_code(201); echo json_encode(['status' => 'created', 'name' => $name]); } else { http_response_code(400); echo json_encode(['error' => 'Name is required']); }}