Практикум: одна доменная ошибка, два транспорта¶
Servicewright запускает HTTP и gRPC в одном процессе на портах, выбранных ОС. Оба обработчика вызывают одну функцию получения счёта. Управляющий скрипт отправляет настоящие сетевые запросы, сравнивает успешные ответы и проверяет семь ошибок через оба транспорта.
HTTP возвращает application/problem+json, а gRPC передаёт тот же прикладной код через trailing metadata x-error-code. Неоплаченный заказ имеет категорию PRECONDITION_FAILED: HTTP 412 и gRPC FAILED_PRECONDITION. Закрытые ошибки и неожиданные исключения превращаются в internal_error; внутренние сообщения, параметры и закрытые коды не должны попасть в ответ.
Скрипт останавливает сервис через событие остановки и проверяет, что общее хранилище закрывается после завершения обеих точек входа. Хранилище работает в памяти. Покупатель задан доверенными тестовыми данными; аутентификация в этом практикуме не реализована.
Нужен uv. Запустите из каталога docs/blog/lab/2026-09-07-transport-independent-errors:
Версии закреплены в requirements.txt: grpc-server-kit 0.2.0, servicewright 0.13.1, grpcio 1.84.0, FastAPI 0.141.1, Uvicorn 0.53.0, HTTPX 0.28.1 и cryptography 50.0.1.
Сохраните соседний каталог 2026-09-07-production-grpc-server: практикум использует его прикладной код, имитаторы и зависимости.