Модуль 8 · Практика

Справочник «Стандартизация HTTP API» · модуль 8 · Практика

Глава 8.2

8.2

Отчёт
и критерии

Отчёт по этой работе состоит не из пересказа, а из подтверждений: настоящих ответов сервиса, вывода проверок и ссылок на файлы репозитория. В этой главе перечислено, что сохранять по ходу работы, как оформить отчёт и по каким признакам работа принимается.

Категория
Практика
Уровень
Итоговый
Связанные главы
8.1 Свой API по правилам · 6.4 CI · 7.3 Документация
Что получится
Отчёт, по которому видно, что контракт соблюдается

§1Что сохранять по ходу работы

Часть подтверждений позже не воспроизвести, поэтому их сохраняют по ходу работы, а не перед сдачей.

ЧтоКогда сниматьЗачем
Ответы всех пяти операций с -iКак только операция заработалаПоказывают коды, заголовки и тело
Ответы с ошибками: 401, 403, 404, 422Сразу после проверок доступаДоказывают единый формат ошибок
Вывод pytestКогда все тесты зелёныеЧисло тестов и время прогона
Вывод линтераЧистый прогон и один с ошибкойВторой доказывает, что правила работают
Страница сборкиЗелёная и краснаяПроверки запускаются сами
Swagger UI и опубликованная документацияПосле выкладкиКонтракт доступен читателю
Обязательно снимите упавший прогон

Успешный прогон показывает текущее состояние проекта, упавший — что проверка действительно находит нарушение. Нарушьте правило намеренно, снимите вывод и верните исходное состояние.

§2Как снимать доказательства

Годится
  • текст из терминала целиком, вместе с командой
  • снимок экрана, на котором виден адрес
  • ссылка на конкретный файл или строку в репозитории
  • ссылка на запуск сборки
Не годится
  • пересказ «всё работает»
  • обрезанный снимок без команды и адреса
  • вывод, набранный руками
  • снимок чужого проекта

Команду приводят рядом с выводом: без неё неизвестно, что именно выполнялось.

так выглядит хорошее доказательство
$ curl -i -X POST http://127.0.0.1:8000/api/v1/bookings \
    -H 'Authorization: Bearer demo-token' \
    -H 'Content-Type: application/json' \
    -d '{"room": "312", "date": "2026-10-01", "slot": 3}'

HTTP/1.1 201 Created
location: /api/v1/bookings/6dfeb4e3-497b-4d62-8270-40dace132b9f
etag: "72d232d249fabd6e"
x-request-id: 9073c15c-ea8a-409d-b492-5315e909a71b
content-type: application/json

{ "id": "6dfeb4e3-…", "room": "312", "status": "requested", … }

Четыре части — команда, код ответа, заголовки и тело — описывают выполненный запрос полностью.

§3Структура отчёта

отчёт

1. Предметная областьчто за API, кто им пользуется, что происходит с записью
2. Контрактадреса, операции, коды, схемы, заголовки
3. Доказательстваответы сервиса, вывод проверок, кадры сборки и документации
4. Решения и отступлениячто выбрали из спорных вопросов и почему
5. Ссылкирепозиторий, опубликованная документация, ключевые файлы

Объём отчёта сам по себе не оценивается. Раздел 2 занимает страницу-полторы, раздел 3 — больше всего места, раздел 4 — несколько абзацев. Пересказывать содержание справочника в отчёте не нужно: проверяющий его читал.

§4Раздел «Контракт»

Удобнее всего свести операции в таблицу: она короче текста и показывает контракт целиком.

таблица операций в отчёте
| Метод и адрес                     | Успех          | Ошибки                    | Заголовки       |
|-----------------------------------|----------------|---------------------------|-----------------|
| GET /api/v1/bookings              | 200            | 422                       | X-Request-Id    |
| POST /api/v1/bookings             | 201 + Location | 401, 403, 422             | ETag            |
| GET /api/v1/bookings/{id}         | 200            | 404                       | ETag            |
| PATCH /api/v1/bookings/{id}       | 200            | 401, 403, 404, 412, 422   | If-Match → ETag |
| DELETE /api/v1/bookings/{id}      | 204            | 401, 403, 404             | —               |

Рядом — три-четыре предложения о схемах: сколько их, чем модель запроса отличается от модели ответа, какие ограничения заданы. И одно предложение про версию: где она указана и по какому правилу меняется.

§5Раздел «Доказательства»

Раздел строят не списком снимков, а по утверждениям: сначала формулировка того, что подтверждается, затем подтверждение.

«Создание возвращает 201 с Location»Ответ curl -i на POST: видны код и заголовок.глава 2.3
«Ошибки в едином формате»Два ответа рядом — 404 и 422: одинаковые поля, один media type.глава 4.1
«Права разграничены»401 без токена и 403 с токеном только на чтение.глава 4.2
«Контракт и код не расходятся»Вывод export_openapi.py --check и тест, который его сторожит.глава 6.3
«Правила проверяются»Чистый вывод линтера и вывод с намеренно внесённой ошибкой.глава 6.2
«Проверки запускаются сами»Кадр зелёной сборки и кадр красной на изменении, которое ломает контракт.глава 6.4

Шести утверждений с подтверждениями достаточно; остальные приводят по желанию.

§6Раздел «Решения и отступления»

Здесь отвечают на вопросы из главы 7.4 — те, где своды расходятся и выбор за вами.

форма записи
Решение: мажорная версия в пути /api/v1.
Варианты: путь, заголовок, параметр запроса, media type.
Почему: версия видна в журналах и ссылках; клиентов мало и они обновляются быстро.
Чем платим: несовместимое изменение одной операции требует выпуска /api/v2 целиком.
Источник: Microsoft Graph, ADR 0001 в репозитории.

Отступления от правил справочника тоже записываются в этот раздел. Отступление с названной причиной ошибкой не считается. «Не поддерживаю Idempotency-Key, потому что создание брони и так проверяется по паре аудитория + пара, и повтор не создаст дубль» — это обоснованное решение, а не пропуск требования.

§7Критерии приёмки

ПризнакКак проверяется
Пять операций работают и отвечают правильными кодамиЗапуск и ответы в отчёте
Адреса и имена полей по правиламЛинтер и просмотр описания
Ошибки в едином формате, не меньше четырёх кодовОтветы в отчёте и правило линтера
Каждый ответ несёт X-Request-IdТест и ответы
Описание выгружено в репозиторий и совпадает с кодом--check в сборке
Тестов не меньше двенадцати, все зелёныеВывод pytest
Линтер без замечаний, есть своё правилоВывод линтера и .spectral.yaml
Сборка запускается сама и блокирует красноеСтраница запусков и настройки ветки
Стандарт с уровнями требований и способами проверкиdocs/API_STYLE_GUIDE.md
Есть CHANGELOG и один ADRФайлы в репозитории
История изменений разбита на осмысленные шагиСписок коммитов и pull request
Отчёт содержит доказательства, а не пересказРазделы 3 и 4 отчёта

§8Что снижает оценку

Отчёт без доказательств«Реализованы все операции» без единого ответа сервиса проверить невозможно.
Следы учебного проектаОбращения в стандарте и брони в коде — верный признак копирования.
Правила в стандарте, которых нет в кодеСтандарт описывает ваш API, а не идеальный.
Все ответы 200Самая заметная ошибка: код перестаёт описывать исход.
Ошибки в разном форматеРади этого затевался весь модуль 4.
Один коммит «done»По истории не видно, как шла работа и работали ли проверки.
Красная сборка на момент сдачиПроверки настроены и не пройдены — худшее сочетание.

§9Самопроверка перед сдачей

  1. Склонировали ли вы репозиторий в пустую папку и запустили проверки? Всё зелёное?
  2. Открывается ли ссылка на документацию у человека, который ваш сервис не запускал?
  3. Ведёт ли адрес из поля type на существующую страницу — или там about:blank?
  4. Есть ли в стандарте хоть одно правило без способа проверки?
  5. Совпадает ли выгруженное описание с кодом прямо сейчас?
  6. Есть ли в отчёте хотя бы одно доказательство того, что проверка ловит нарушение?
  7. Сможете ли вы за минуту объяснить каждое своё решение из раздела 4?
Разделы отчётаобластьконтрактдоказательстварешенияссылки
Доказательствокомандакод ответазаголовкитело
Обязательно снятьзелёный pytestчистый линтеркрасный прогонсборка
Главноедоказательства, не пересказотступление с причиной

Справочник «Стандартизация HTTP API» · модуль 8 · глава 8.2Макаров Максим Николаевич

Кадр