В GraphQL для поля любого объекта вы можете указать аргументы. А объект — это который определяется через ключевое слово type:
Однако обычно аргументы используют в запросах — query и mutation (это тоже объекты в схеме). Там всё логично:
- Получить конкретную книгу? Укажи её ID, вот тебе и аргумент.
- Создать книгу? Укажи её данные, снова через аргументы.
Для этих примеров схема будет выглядеть как-то так:
type Query {getBook(id: ID!): Book}type Mutation {createBook(id: ID!, title:String!): Book}
Здесь всё понятно и логично, это аргументы методов. Но так как методы — это те же объекты, то по сути эти аргументы — аргументы поля объекта (например, поля getBook объекта Query).
А вот для чего нужны аргументы у обычного объекта, который просто возвращается в ответе, на первый взгляд неочевидно. Отсюда и эта статья — чтобы разобраться в вопросе «зачем» 😼
Пример аргумента в объекте
Давайте разбираться на примере. Допустим, у нас есть список книг и их авторов. И метод получения конкретного автора по его идентификатору. В таком случае схема будет такая:
type Book {id: IDtitle: Stringauthor: Author}type Author {id: ID!name: Stringbooks: [Book]}type Query {getAuthor(id: ID!): [Author]!}
Что тут описано:
- У нас есть объект Book, у которого есть поля title и author
- Есть объект Author с полями name и books
- Есть запрос getAuthor, чтобы получить автора по его id.
Вызовем метод получения автора со списком его книг. Допустим, автором буду я (Ольга Назина), у меня сейчас выпущено три книги.
Запрос 1:
query {getAuthor(id: 1) {namebooks {idtitle}}}
Ответ 1:
{"data": {"getAuthor": {"name": "Ольга Назина","books": [{"id": "1","title": "Что такое тестирование. Курс молодого бойца"},{"id": "2","title": "Тест-дизайн. Практическое руководство для начинающих"},{"id": "3","title": "Баг-трекинг: локализация и оформление дефектов"}]}}}
Проблема в том, что книг может быть всё больше, и больше... Вон сколько книг у Дарьи Донцовой! А что делать, если мы не хотим получать слишком много информации в ответе? Если хотим получить максимум 5 или 10?
Вот тут то нам и помогут аргументы в самом объекте. Добавим лимит книг прямо в схему:
type Book {id: IDtitle: Stringauthor: Author}type Author {id: ID!name: Stringbooks(limit: Int): [Book]}type Query {getAuthor(id: ID!): [Author]!}
Разработчик делает нужную обвязку в коде и вуаля! Теперь мы можем ставить ограничения прямо в запросе! Допустим, мы хотим вернуть всего 1 книгу автора. Добавляем лимит в запрос!
Запрос 2:
query {getAuthor(id: 1) {namebooks(limit: 1) {idtitle}}}
И теперь в ответе будет всего одна моя книга, хотя по факту их 3.
Ответ 2:
{"data": {"getAuthor": {"name": "Ольга Назина","books": [{"id": "1","title": "Что такое тестирование. Курс молодого бойца"}]}}}
Как именно будут выбираться книги по лимиту — решает разработчик, прописывая условия выборки в коде. Это может быть приоритет по дате издания или просто идентификатору.
Если же нам не нужно ставить ограничения, мы можем просто не указывать limit! То есть запрос будет выглядеть как запрос 1, несмотря на то, что в схеме аргумент у поля books имеется. Но так как у него не стоит восклицательный знак (поле обязательное для заполнения), то его можно просто не указывать.
Итого
Чаще всего аргументы используются в запросах и мутациях. Тем не менее, они могут быть и внутри простого объекта, если это нужно по бизнес-логике.
PS — статья написана в помощь студентам моего курса по GraphQL.
Комментариев нет:
Отправить комментарий