Skip to content

fix(http-api): общие данные для REST и RPC, ответы по спецификации - #15

Merged
fey merged 2 commits into
mainfrom
fix/http-api-static-examples
Aug 14, 2026
Merged

fix(http-api): общие данные для REST и RPC, ответы по спецификации#15
fey merged 2 commits into
mainfrom
fix/http-api-static-examples

Conversation

@fey

@fey fey commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Зачем

Мок http-api работал в динамическом режиме (-d), и данные генерировал faker. Из этого росли две проблемы, обе видны студенту в уроках курса HTTP API.

Данные не общие. Урок kinds сравнивает REST и RPC «на одних и тех же данных». На самом деле RPC отдавал три задачи из rpc.js, а REST — новую латинскую мешанину на каждый запрос:

REST  GET /tasks/2      → {"id":-39177245,"title":"et est incididunt","status":"In Progress"}
RPC   tasks.get id=2    → {"id":2,"title":"Записать скринкаст про HTTP API","status":"In Progress"}

Ответы не соответствовали спецификации. Модели объявляют uint16, то есть 0..65535, а приходило "id":-39177245, "total":-33234336, "limit":70134490. Динамический режим про это ограничение не знает. Два запроса к одному адресу давали разные ответы, а GET /tasks/1 возвращал не задачу с идентификатором 1.

Обнаружено при проверке деплоя по FEEDBACK-36.

Что сделано

  • Моделям http-api добавлены @example, а prism для этой спецификации запущен без -d. Ответы теперь берутся из примеров спецификации.
  • Набор задач вынесен в custom-server/src/data/tasks.js — у RPC и примеров спецификации один текст, а не две копии в разных файлах.
  • make test вместо echo no tests поднимает мок с приложением и проверяет ответы запросами.
  • Сборка запускается на пуллреквестах.

Примеры подогнаны под то, что уроки уже печатают, поэтому правка попутно делает верным существующий текст:

Где Что совпало
250-example пользователи 1 и 2 (max@hotmail.com / Allison Bernier, Colt97@yahoo.com / Hudson Schowalter), total: 10
500-authentication токен в ответе /login
400-kinds три задачи, те же что у RPC

Пользователь 1 это max@hotmail.com, под которым логинятся в самостоятельной. Посты принадлежат ему же: статичный мок не умеет отбирать записи по пути, поэтому /posts и /users/1/posts отдают один список, и общий автор не даёт им противоречить друг другу.

Что осталось как было

Три остальные спецификации (http-protocol, js-playwright, postman) остаются на -d осознанно: примеров в них нет, и статичный режим отдал бы вместо данных заглушки вида "string". Их курсы не затронуты, проверено запросами.

Пример запроса в 250-example/self_study.md цитирует прежний faker-вывод с отрицательными числами и после этой правки станет неверным. Это правка курса, отдельным заходом.

Проверка

Не только зелёным прогоном: собран образ и поднят контейнер, запросы шли через Caddy, как на проде.

REST GET /tasks/1  → {"id":1,"title":"Опубликовать курс по основам JavaScript",...,"status":"Backlog"}
RPC  tasks.get id=1 → {"jsonrpc":"2.0","result":{"id":1,"title":"Опубликовать курс по основам JavaScript",...}}

GET /nosuch → 404    DELETE /tasks → 405    POST /tasks {} → 422    DELETE /tasks/1 → 204
POST /posts без токена → 401    с токеном → 201    /courses без ключа → 401    с ключом → 200
RPC: ошибка в теле, код 200

Тест проверен на способность падать: правка одной задачи в data/tasks.js без правки спецификации даёт два провала и выход с кодом 1.

🤖 Generated with Claude Code

fey and others added 2 commits August 14, 2026 16:35
…ации

Мок http-api работал в динамическом режиме, и данные брались у faker'а. Отсюда
две проблемы, обе видны в уроках курса.

Первая: данные не общие. Урок kinds сравнивает REST и RPC на одних и тех же
задачах, но RPC отдавал три задачи из rpc.js, а REST при каждом запросе новую
латинскую мешанину. Студент видел рядом несопоставимые ответы.

Вторая: ответы не соответствовали спецификации. Модели объявляют uint16, то есть
0..65535, а приходило `"id":-39177245` и `"total":-33234336`. Динамический режим
этого ограничения не знает.

Теперь ответы берутся из примеров спецификации: моделям http-api добавлены
`@example`, а prism для этой спецификации запускается без `-d`. Коды 404, 405,
422 и 401, на которых построены самостоятельные, статичный режим сохраняет.

Набор задач вынесен в custom-server/src/data/tasks.js, чтобы у RPC и примеров
спецификации был один текст, а не две копии в разных файлах.

Примеры подогнаны под то, что уроки уже печатают: пользователи 1 и 2 совпадают с
уроком example, токен /login с уроком authentication. Пользователь 1 это
max@hotmail.com, под которым логинятся в самостоятельной, и посты принадлежат
ему же, поэтому /posts и /users/1/posts не противоречат друг другу.

Три остальные спецификации остаются на `-d`: примеров в них нет, и статичный
режим отдал бы заглушки вместо данных.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…еквестах

`make test` печатал «no tests». Между тем сломанную сборку в этом репозитории
заметили только через десять дней, и заметили по тому, что на проде работает
образ старее main.

Прогон поднимает статичный мок и приложение и проверяет то, что уже ломалось
незаметно: REST и RPC отдают один и тот же набор задач, коды 404, 405, 422, 401
и 201 на месте, ошибка RPC приходит в теле с кодом 200, числа в ответах не
выходят за uint16. Расхождение между data/tasks.js и примерами спецификации
валит прогон, то есть одну копию поправить молча нельзя.

Caddy в прогоне не участвует, его нет в раннере. Мок и приложение опрашиваются
напрямую по своим портам, как это делает Caddy, срезая префикс.

Заодно сборка запускается на пуллреквестах. Публикацию образа это не задевает,
у джобы deploy стоит условие на push.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fey
fey merged commit 31c7f31 into main Aug 14, 2026
2 checks passed
@fey
fey deleted the fix/http-api-static-examples branch August 14, 2026 11:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant