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

Ошибки

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

Ошибки возвращаются в формате 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

Прошедшие авторизацию запросы GraphQL возвращают HTTP ответ с кодом 200 или 210 и json телом фиксированного формата. Код 210 возвращается при возникновении внутренних технических ошибок (семантический аналог 500-х ошибок HTTP), во всех остальных случая возвращается код 200.

{
"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",
...
}
],
...
}

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

Ответ на запрос с технической ошибкой времени выполнения содержит поле errors с элементом, имеющим значением INTERNAL в поле extensions.errorType. Ошибки получения одного (или более) узлов не отменяют получение данных для узлов одного с ними уровня и выше по иерархии. Успешно полученные данные возвращаются в поле data.

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

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

Иноформация об ошибках бизнес логики (отсутствие прав доступа к сущности, отсутствие сущности) для запрашиваемого узла отдается в виде объекта кастомной типизированной ошибки. Такая подмена достигается за счет использования в узле абстрактного типа 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 содержит только технические ошибки выполнения запроса.