Справочник «Стандартизация HTTP API» · модуль 8 · Практика
Глава 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Структура отчёта
отчёт
Объём отчёта сам по себе не оценивается. Раздел 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Раздел «Доказательства»
Раздел строят не списком снимков, а по утверждениям: сначала формулировка того, что подтверждается, затем подтверждение.
curl -i на POST: видны код и заголовок.глава 2.3404 и 422: одинаковые поля, один media type.глава 4.1401 без токена и 403 с токеном только на чтение.глава 4.2export_openapi.py --check и тест, который его сторожит.глава 6.3Шести утверждений с подтверждениями достаточно; остальные приводят по желанию.
§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Что снижает оценку
200Самая заметная ошибка: код перестаёт описывать исход.§9Самопроверка перед сдачей
- Склонировали ли вы репозиторий в пустую папку и запустили проверки? Всё зелёное?
- Открывается ли ссылка на документацию у человека, который ваш сервис не запускал?
- Ведёт ли адрес из поля
typeна существующую страницу — или тамabout:blank? - Есть ли в стандарте хоть одно правило без способа проверки?
- Совпадает ли выгруженное описание с кодом прямо сейчас?
- Есть ли в отчёте хотя бы одно доказательство того, что проверка ловит нарушение?
- Сможете ли вы за минуту объяснить каждое своё решение из раздела 4?
областьконтрактдоказательстварешенияссылкикомандакод ответазаголовкителозелёный pytestчистый линтеркрасный прогонсборкадоказательства, не пересказотступление с причинойСправочник «Стандартизация HTTP API» · модуль 8 · глава 8.2Макаров Максим Николаевич