Помощь

Практика

Практика «API Sandbox» — учебный REST API для упражнений

13 вкладок с HTTP-сценариями: что делает каждая и как обращаться к ней через curl.

/practice/api-sandbox — песочница для HTTP-сценариев. Это учебный REST API со статус-кодами, CRUD, авторизацией, идемпотентностью, ограничением частоты запросов, кэшем, GraphQL и загрузкой файлов. Запросы можно отправлять прямо со страницы или из любого внешнего клиента: Postman, Bruno, curl. Песочница входит в бесплатную часть платформы.

Адрес

Все эндпоинты лежат под /api/practice/.... Пример полного адреса:

https://tomiddle.com/api/practice/users

В примерах curl ниже домен опущен — подставьте его сами.

Вкладки

1. Статусы и ответы

Эндпоинт возвращает тот статус, тело и задержку, которые вы попросите.

curl -i "/api/practice/status?code=200"
curl -i "/api/practice/status?code=404&body=Not%20Found"
curl -i "/api/practice/status?code=500"

2. CRUD: users

Полный жизненный цикл пользователя: список с пагинацией (search, page, limit, sort, order, общее число — в заголовке X-Total-Count), чтение, создание, полная замена, частичное изменение, удаление.

curl /api/practice/users            # GET — список
curl /api/practice/users/1          # GET — один (404, если нет)
curl -X POST /api/practice/users \
     -H "Content-Type: application/json" \
     -d '{"email":"a@b.c","name":"A","age":30}'   # POST — 201 и заголовок Location
curl -X PUT /api/practice/users/1 ...     # PUT — все поля, иначе 422
curl -X PATCH /api/practice/users/1 ...   # PATCH — одно или несколько полей
curl -X DELETE /api/practice/users/1      # DELETE — 204 без тела

3. CRUD: products

То же для товаров, с фильтрами search, category (electronics, merch, books, other) и inStock. Категория не из списка — 400.

4. Авторизация

Сначала регистрация, потом вход и запрос с токеном.

# 1. Регистрация (пароль от 8 символов, иначе 400; занятый email — 409)
curl -X POST /api/practice/auth/register \
     -H "Content-Type: application/json" \
     -d '{"email":"qa@example.com","password":"password123"}'

# 2. Вход — в ответе token
curl -X POST /api/practice/auth/login \
     -H "Content-Type: application/json" \
     -d '{"email":"qa@example.com","password":"password123"}'
# → { "token": "test-…", "tokenType": "Bearer", ... }

# 3. Запрос с токеном
curl /api/practice/auth/me \
     -H "Authorization: Bearer test-…"

Без токена, с неизвестным или устаревшим токеном — 401.

5. Идемпотентность

POST /api/practice/payments с заголовком Idempotency-Key: повтор с тем же ключом возвращает тот же платёж и заголовок Idempotent-Replayed: true. Без ключа каждый запрос создаёт новый платёж.

curl -X POST /api/practice/payments \
     -H "Content-Type: application/json" \
     -H "Idempotency-Key: my-key-1" \
     -d '{"amount":100,"currency":"RUB","recipient":"shop"}'

6. Rate limit

Не больше 5 запросов за 10 секунд. Дальше — 429 Too Many Requests с заголовком Retry-After. В каждом ответе есть X-RateLimit-Remaining.

for i in {1..8}; do curl -i /api/practice/limited; done

7. Кэш

Эндпоинт отдаёт ETag. Повторный запрос с If-None-Match получает 304 Not Modified без тела.

curl -i /api/practice/cached
# → ETag: "abc"
curl -i /api/practice/cached -H 'If-None-Match: "abc"'
# → 304 Not Modified

8. Ошибки

/api/practice/errors/:type — разные виды сбоев: пустое тело при 500, HTML вместо JSON, битый JSON, 502, 503 с Retry-After, медленный ответ, таймаут, неверный Content-Type, цикл редиректов, 418. Учит не доверять заголовку Content-Type и разбирать ответ осторожно.

9. Payload

/api/practice/payload/:size — ответ заданного размера, до 10 МБ. Заголовок Content-Length и поле actualBytesApprox показывают, сколько пришло на самом деле.

10. Webhook

Вы указываете адрес, и сервер отправляет на него POST с телом {hello, at} и заголовком X-Practice-Event. Удобно проверять через webhook.site.

11. GraphQL

POST /api/practice/graphql — упрощённый GraphQL с тремя корневыми полями: users, user(id), products. Ответ всегда со статусом 200 в формате {data, errors?}.

curl -X POST /api/practice/graphql \
     -H "Content-Type: application/json" \
     -d '{"query":"{ users { id email } }"}'

12. Загрузка файлов

multipart/form-data, поле file. Лимит — 5 МБ. Разрешены PNG, JPEG, GIF, WebP, PDF, простой текст и JSON.

curl -X POST /api/practice/upload \
     -F "file=@./image.png"

13. Квиз

12 вопросов по сценариям выше: статусы, заголовки, методы, CORS, идемпотентность, кэш.

Как пользоваться

В браузере откройте /practice/api-sandbox, выберите вкладку, заполните поля и отправьте запрос — ответ появится ниже.

Снаружи — скопируйте запрос в curl или Postman. Эндпоинты те же, заглушек для внешних клиентов нет.

Что важно

  • Все данные в песочнице учебные. Не вводите туда настоящие пароли и личные данные.
  • Данные общие и временные. Их видят все, кто работает с песочницей, а при перезапуске сервера они возвращаются к исходному состоянию.
  • Не используйте песочницу для нагрузочных тестов. Она не рассчитана на тысячи запросов в секунду, и из-за вас она перестанет отвечать остальным.

Что дальше