HTTP методы в REST

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

Этот тренажер посвящен HTTP-методам, которые являются основой любого REST API. Ты начнешь с основ: сопоставишь каждый метод с его действием, например, что делает GET, а что POST. Затем научишься классифицировать методы по их свойствам, таким как безопасность и идемпотентность. Постепенно перейдешь к практике в PHP: будешь писать код для обработки разных типов запросов, собирать из фрагментов простые обработчики, исправлять типичные ошибки и предсказывать, как поведет себя сервер в ответ на тот или иной запрос. Задания построены от простого к сложному, чтобы ты смог уверенно разобраться в теме.

Список тем

Сопоставьте HTTP-метод и его основное действие

id: 39280_task_compare_1

Каждый HTTP-метод в REST API имеет свое четкое предназначение. Сопоставьте глаголы (методы) из левой колонки с их стандартными действиями из правой, чтобы восстановить логику CRUD-операций (Create, Read, Update, Delete).

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
GET
POST
PUT
DELETE
Полное обновление существующего ресурса
Удаление ресурса
Создание нового ресурса
Получение (чтение) ресурса
Сообщения
Проверить
Показать подсказку

Классификация HTTP-методов

id: 39280_task_sort_2

HTTP-методы делятся на "безопасные" (не изменяют состояние сервера) и "идемпотентные" (повторный вызов дает тот же результат). Распределите методы по соответствующим категориям. Обратите внимание, что один и тот же метод может попасть в обе категории.

Перетяните элементы в соответствующие блоки
Безопасные методы (не меняют данные)
Идемпотентные методы (повторяемые без побочных эффектов)
Неидемпотентные методы
GET
POST
PUT
DELETE
Сообщения
Проверить
Показать подсказку

Проверка метода запроса

id: 39280_task_replace_3

Напишите простой скрипт, который будет выводить информацию о пользователе, только если запрос был отправлен методом 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 "Метод не поддерживается";
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Ошибка: неверный метод для создания данных

id: 39280_task_error_4

В этом коде допущена логическая ошибка. Для создания нового пользователя используется неподходящий 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]);
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Соберите простой маршрутизатор

id: 39280_task_bank_fill_5

Создайте основу для 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'
'POST'
'DELETE'
'PUT'
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Соберите обработчик GET-запроса

id: 39280_task_bfp_6

Соберите из фрагментов кода работающий PHP-скрипт, который возвращает список продуктов в формате JSON. Расположите строки в правильном порядке. Одна из строк лишняя.

Перетяните в правильном порядке строки из одного блока в другой
<?php
header('Content-Type: application/json');
$products = [['name' => 'Laptop', 'price' => 1200], ['name' => 'Mouse', 'price' => 25]];
echo json_encode($products);
echo "Список продуктов";
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Какой HTTP-статус будет в ответе?

id: 39280_task_give_result_7

Данный скрипт обрабатывает 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-запроса

id: 39280_task_predict_result_8

Метод 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-тела запроса

id: 39280_task_error_9

Этот скрипт должен принимать 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']);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру