Коды ошибок
Каждый error.code, когда он случается и что с ним делать.
Ветвитесь по error.code. Он стабилен. message для людей и может быть переформулирован.
{ "error": { "code": "language_not_found",
"message": "Unknown language code: 'xx-YY'",
"details": { "language": "xx-YY" } } }
Публичный API
language_not_found — 404
Код не совпал ни с каноническим кодом, ни с алиасом, и укорачивание тоже ничего не нашло.
Делайте: залогируйте сырое значение. Это либо опечатка на стороне отправителя, либо написание, которого каталог ещё не несёт. Если вы классифицируете, а не резолвите, берите /v1/normalize: он отдаёт known: false с 200 — см. Нормализация входящих кодов.
Не делайте ретраев. Ответ не изменится, пока кто-то не отредактирует каталог.
details.language несёт присланное вами значение.
provider_not_found — 404
Ни код провайдера, ни один зарегистрированный алиас не совпали с присланным значением.
Делайте: проверьте актуальный перечень в GET /v1/providers, а алиасы каждого — в GET /v1/providers/{code}. См. Providers and Vendors.
language_unsupported — 409
Провайдер и язык существуют; пара зафиксирована как нерабочая.
409, а не 404, потому что оба названных ресурса реальны — отказано именно их комбинации, а вызывающий, вечно ретраящий тот же 404, делал бы неверный вывод.
Делайте: выберите другого провайдера для этого языка. GET /v1/languages/{code}/providers показывает, кто его возьмёт.
Info
/v1/resolve отдаёт это в теле
Эндпоинт возвращает 200 с supported: false и code: null, а не бросает ошибку, так что вызывающий может залогировать пару и идти дальше без обработки исключений. Форма 409 появляется там, где неподдерживаемая пара — жёсткий сбой.
validation_error — 422
Некорректный запрос: неправильный тип, отсутствующий параметр или батч свыше 500 пар.
details.fields перечисляет каждую проблему с её расположением.
payload_too_large — 413
Тело свыше 256 КБ. Разбейте батч.
internal_error — 500
Необработанное исключение. Сообщение намеренно обобщённое: неожиданное исключение может нести DSN или строку данных, так что оно идёт в лог, а не к вам.
Делайте: один ретрай с бэкоффом, затем сообщите с X-Correlation-Id из заголовков вашего ответа.
service_unavailable — 503
От /health/ready, когда сервис не способен отвечать — база недоступна или каталог не загружен.
Делайте: ретрай с бэкоффом. Если у вас есть закешированный ответ — берите его; именно от этого случая кеш и защищает.
Далее
- Errors and Conventions — форматы ответов и что стабильно