Перейти к основному содержимому

Ошибки

Ошибки предвалидации запроса, внутренние ошибки сервера​

Ошибки возвращаются в формате json

{
"type": "...",
"detail": "..."
}
HTTP codetypedetailОписание
400invalid_requestневалидный запрос (например, заголовок Authorization отсутствует либо прислан в невалидном формате, невалидное тело запроса)
400invalid_requestgraphql_query_not_foundв теле запроса отсутствует обязательное поле "query"
401invalid_tokentoken_not_foundне найден токен доступа
401invalid_tokentoken_expiredтокен доступа просрочен
403api_accessinsufficient_permissionsотсутствует право использования API
403api_accessauthorisation_not_foundавторизация в Talantix истекла или была отозвана, авторизируйтесь в системе Talantix
403api_accessaccess_blockedдоступ к API заблокирован, обратитесь в службу поддержки
404not_foundзапрос несуществующего ресурса
413request_entity_too_largeтело запроса превышает установленный лимит
429too_many_requestsпревышено допустимое количество запросов в единицу времени
500internal_server_errorвнутренняя ошибка сервера

Ошибки выполнения запроса GraphQL​

Результаты выполнения операций query и mutation возвращаются с HTTP-кодом 200, 210 или 269 и JSON-телом фиксированного формата. Статус относится ко всему ответу и определяется по типам ошибок в итоговом массиве errors.

HTTP-кодУсловие
200В errors нет INTERNAL и EXTERNAL_SYSTEM_ERROR. Возможны ошибки валидации запроса и предметные ошибки в data.
210В errors есть хотя бы одна ошибка с extensions.errorType = INTERNAL, в том числе вместе с EXTERNAL_SYSTEM_ERROR.
269В errors есть хотя бы одна ошибка с extensions.errorType = EXTERNAL_SYSTEM_ERROR и нет INTERNAL.

Клиент должен разбирать тело ответа для всех трёх статусов. Код семейства 2xx сам по себе не означает, что все поля получены или действие выполнено успешно: необходимо проверять errors и предметный результат в data. Для распознавания системных и внешних ошибок используйте extensions.errorType, а не текст message. При наличии ошибок сохраняйте доступные частичные данные из data.

{
"errors": [
{
"message": ...,
"locations": [
{
"line": ...,
"column": ...
}
],
"path": ...,
"extensions": {
"errorType": ...
}
}
],
"data": ...,
"dataPresent": ...
}

где

  • errors - список технических ошибок, произошедших в процессе выполнения запроса (ошибки в коде, отказы внешних систем, таймауты походов, ошибка валидации данных запроса и т.д.). Пустой список означает отсутствие таких ошибок; предметные ошибки могут возвращаться в data;
  • message - текст и описание ошибки;
  • locations - массив расположения невалидных полей запроса либо полей, получении которых вызывало ошибку;
  • path - путь к узлу, получение которого вызвало ошибку;
  • extensions - дополнительная информация об ошибке;
  • data - полученные данные либо null;
  • dataPresent - true или false в зависимости от того, были получены какие-либо данные в результате запроса или нет.

Ошибки валидации запроса​

Запрос, содержащий в поле query невалидные данные (ошибки в синтаксисе, несуществующие поля), возвращает ответ

{
"errors": [
{
"message": "Validation error (FieldUndefined@[me/idd]) : Field 'idd' in type 'Me' is undefined",
"locations": [
{
"line": 5,
"column": 5
}
],
"path": null,
"extensions": {}
}
],
"data": null,
"dataPresent": false
}

Ошибки сложности запроса​

Запрос с обходом большого количества узлов (в т.ч. вложенных списков узлов и их комбинаций) может создавать значительную нагрузку на систему. Поэтому сложность каждого запроса анализируется перед выполнением и, в случае превышения порогового значения, возвращается ответ с ошибкой

{
"errors": [
{
"message": "Requested operation exceeds the permitted complexity limit: 2650 > 2499",
...
}
],
...
}

Ошибки числа корневых полей​

В одном запросе внешнего API допускается не более одного корневого поля (root selection) на operation. Алиасы одного и того же поля считаются отдельно; повторы одного ключа (в том числе через фрагменты) — нет. Служебные поля __typename, __schema и __type в лимит не входят.

{
"errors": [
{
"message": "Requested operation exceeds the permitted root selection limit of 1",
...
}
],
...
}

Ошибки выполнения запроса технического характера​

Необработанное исключение в резолвере query или mutation, не классифицированное как внешний отказ, возвращается в errors с extensions.errorType = INTERNAL и HTTP-кодом 210. Сообщение Internal error не содержит деталей исходного исключения. Доступные частичные данные возвращаются в data с учётом правил GraphQL для полей non-null.

{
"errors": [
{
"message": "Internal error",
"locations": [
{
"line": 2,
"column": 3,
"sourceName": null
}
],
"path": ["persons.items.personalDataAgreement"],
"extensions": {
"errorType": "INTERNAL"
}
}
],
"data": {
"persons": {
"items": [
{
"id": 1
}
]
}
},
"extensions": null,
"dataPresent": true
}

Ошибки внешних систем​

Распознанный отказ внешней системы возвращается в errors с extensions.errorType = EXTERNAL_SYSTEM_ERROR. Если в итоговом errors нет INTERNAL, HTTP-код ответа — 269. Фрагмент элемента массива errors:

{
"message": "External system error",
"extensions": {
"errorType": "EXTERNAL_SYSTEM_ERROR"
}
}

Как и для INTERNAL, поле path связывает ошибку с узлом ответа, а доступные частичные данные остаются в data. При одновременном наличии INTERNAL и EXTERNAL_SYSTEM_ERROR возвращается HTTP 210 независимо от порядка ошибок; сведения о внешнем отказе сохраняются в errors.

Этот тип обозначает классификацию отказа внешнего вызова и не гарантирует отсутствие ошибки на стороне Talantix. Сообщение не содержит исходного текста ошибки внешней системы.

Ошибки бизнес логики​

Иноформация об ошибках бизнес логики (отсутствие прав доступа к сущности, отсутствие сущности) для запрашиваемого узла отдается в виде объекта кастомной типизированной ошибки. Такая подмена достигается за счет использования в узле абстрактного типа union GraphQL. Например, запрос менеджера по id с получением ошибки выглядит следующим образом

query ManagerWithError {
manager(id: 5) {
__typename
... on CompanyManager {
id
}
... on ManagerError {
errorType
message
}
}
}

Посмотреть в playground

с ответом

{
"errors": [],
"data": {
"manager": {
"__typename": "ManagerError",
"errorType": "NOT_FOUND",
"message": null
}
},
"dataPresent": true
}

Таким образом, ошибки бизнес логики возвращаются вместе с остальными данными в поле data, в то время как поле errors содержит только технические ошибки выполнения запроса.