Типы union и interface
union
Тип union GraphQL представляет собой абстрактный тип, состоящий из одного или более объектных типов. При запросе узла с типом union возвращается объект одного из включенных в данный union подтипов. Это свойство позволяет при запросе узла возвращать тип объекта, определяемый бизнес логикой приложения. Например, запрос union Vacancy, состоящего из типов VacancyError, VacancyItem, VacancyPublicItem, может выглядеть следующим образом
- graphql
- cURL
query Vacancy {
vacancy(id: 50000) {
__typename
... on VacancyPublicItem {
title
}
... on VacancyItem {
salary {
from
to
}
}
... on VacancyError {
errorType
}
}
}
curl https://api.talantix.ru/graphql \
-X POST \
-H "Content-Type: application/json" \
-H "User-Agent: api-doc-agent" \
-H "Authorization: Bearer <your access token>" \
-d "{\"query\":\"query Vacancy {\\n vacancy(id: 50000) {\\n __typename\\n ... on VacancyPublicItem {\\n title\\n }\\n ... on VacancyItem {\\n salary {\\n from\\n to\\n }\\n }\\n ... on VacancyError {\\n errorType\\n }\\n }\\n}\"}"
__typename - метаполе, в котором возвращается имя полученного объектного типа;
... on VacancyPublicItem {
title
}
инлайн фрагмент, необходимая часть запроса узла с типом union, содержащая название подтипа и его поля.
Запрос вернет один из трех взаимоисключащих ответов
{
"errors": [],
"data": {
"vacancy": {
"__typename": "VacancyItem",
"salary": {
"from": 10000,
"to": 20000
}
}
},
"dataPresent": true
}
{
"errors": [],
"data": {
"vacancy": {
"__typename": "VacancyPublicItem",
"title": "Новая вакансия"
}
},
"dataPresent": true
}
{
"errors": [],
"data": {
"vacancy": {
"__typename": "VacancyError",
"errorType": "NOT_FOUND"
}
},
"dataPresent": true
}
interface
Так же можно встретить использование типа interface. Например, резюме кандидата имеют общие поля, вынесенные в interface ResumeItem. Запрос кандидатов с резюме может выглядеть следующим образом:
- graphql
- cURL
query PersonsWithResume {
persons {
items {
resumes {
items {
id
createdAt
source {
type
}
... on CustomResume {
text
}
... on StructuredResume {
driverLicenses
}
... on LandingResume {
education {
level {
name
}
}
}
}
}
}
}
}
curl https://api.talantix.ru/graphql \
-X POST \
-H "Content-Type: application/json" \
-H "User-Agent: api-doc-agent" \
-H "Authorization: Bearer <your access token>" \
-d "{\"query\":\"query PersonsWithResume {\\n persons {\\n items {\\n resumes {\\n items {\\n id\\n createdAt\\n source {\\n type\\n }\\n ... on CustomResume {\\n text\\n }\\n ... on StructuredResume {\\n driverLicenses\\n }\\n ... on LandingResume {\\n education {\\n level {\\n name\\n }\\n }\\n }\\n }\\n }\\n }\\n }\\n}\"}"
Общие поля для типов CustomResume, StructuredResume, LandingResume могут запрашиваться вне соответствующих фрагментов.