Самоучитель: динамические веб-приложения
Глава 5 из 18III. Серверное веб-приложение80 минут

Глава 5. HTTP, маршруты и ответы без скрытой магии

Маршрут связывает метод и путь со сценарием, а ответ явно фиксирует статус, заголовки и тело — до того, как начался вывод.

После главы вы сможете
  • читать HTTP-контракт
  • построить front controller
  • различать редирект, ошибку и успешный ответ

HTTP — не транспорт для функций

URL обозначает ресурс или устойчивую точку сценария, метод выражает намерение, а статус сообщает класс результата. GET читает и должен оставаться безопасным; POST создаёт или запускает операцию; PUT обычно заменяет представление; PATCH меняет часть; DELETE запрашивает удаление. Это не абсолютная религия, а общий словарь между клиентом, кешем и сервером.

Не передавайте изменение состояния через ссылку GET. Поисковый робот, prefetch или повтор браузера не должны случайно выполнить команду.

Front controller

<?php
declare(strict_types=1);

require dirname(__DIR__) . '/vendor/autoload.php';

$request = Request::fromGlobals();
$response = $router->dispatch($request);
$response->send();

Маршрут как пара

Ключ маршрута состоит минимум из метода и нормализованного пути. /tasks для GET и POST — два разных контракта. Динамический параметр /tasks/{id} сначала проверяется как форма идентификатора, затем сценарий проверяет существование и право доступа.

Разделяйте 404 и 403 осознанно. Для закрытых объектов нейтральный 404 иногда уменьшает утечку существования, но внутри журнала причина должна сохраняться.

Статусы, которые помогают

  • 200 — представление получено или команда вернула тело.
  • 201 — ресурс создан; полезен заголовок Location.
  • 303 — после POST перевести браузер на GET и избежать повторной отправки.
  • 400 — запрос синтаксически непригоден; 422 — форма разобрана, но значения нарушают контракт.
  • 401 — требуется аутентификация; 403 — личность известна, действие запрещено.
  • 409 — текущее состояние конфликтует с командой.

HTML и JSON — разные представления

Один use case способен вернуть предметный Result, но HTML-контроллер превращает его в шаблон и редирект, а API-контроллер — в JSON и HTTP-статус. Не заставляйте предметный слой знать о тегах, заголовках или fetch().

Content-Type устанавливается явно. Для JSON используйте application/json; charset для JSON подразумевает UTF-8. Не отражайте входной Accept без allowlist поддерживаемых форматов.

Диагностика маршрута

Выбор обработчикаКаждый слой отвечает на один вопрос и передаёт результат дальше без скрытого вывода.Requestmethod/pathRoutermatchMiddlewarepolicyControlleradapterResponsestatus/body
Каждый слой отвечает на один вопрос и передаёт результат дальше без скрытого вывода.

Практика главы

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

Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Перелинковка со справочником

Проверка актуальности

  • developer.mozilla.orghttps://developer.mozilla.org/en-US/docs/Web/API/Fetch_APIПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie