Привет, я работаю над приложением для Android, и мне нужно использовать GraphQL. Сначала я пытаюсь использовать клиент Apollo от следуя этому руководству в качестве практики, но у меня возникают проблемы с его выполнением. Просто не хватает какой-то конкретной информации и деталей, которые были бы полезны.
В настоящее время я застрял в попытке создать файл .graphql. Я надеялся, по крайней мере, скомпилировать код и убедиться, что до этого момента все было в порядке, но, видимо, вы даже не можете скомпилировать его, не предоставив хотя бы один файл .graphql.
Я включил пример, приведенный в руководстве ниже, мое замешательство в основном связано с тем, что такое «FeedQuery» и «FeedType»? Являются ли они классами, определенными для этого конкретного примера, или это классы, созданные самим Apollo для определения любого запроса? Так должен ли я просто использовать эти два класса при определении своих собственных запросов или делать эквиваленты? И эти параметры также требуются в определении или что-то конкретное для структуры примеров?
Кажется, я не могу найти больше информации об этом в их учебнике или на веб-сайте. Попытка изучить GraphQL достаточно сложна, но отсутствие подробностей в этом руководстве еще больше разочаровывает. Если бы они поделились тем, как выглядит структура в этом руководстве, это было бы очень полезно, но, похоже, она не включена.
query FeedQuery($type: FeedType!, $limit: Int!) {
feedEntries: feed(type: $type, limit: $limit) {
id
repository {
name
}
postedBy {
login
}
}
}
Спасибо за вашу помощь, и если у кого-то есть ссылка на лучший учебник, я был бы очень признателен.
В контексте GraphQL DSL FeedQuery — это именованный запрос (подумайте об этом как о методе в терминах Java), который вы можете использовать для получения определенных данных (как описано во внутренних компонентах запроса) с сервера GraphQL.
Чтобы получить нужные данные, вам нужно передать два ненулевых аргумента (обозначаемых !
), feedType и limit. Первый — это настраиваемый тип, определяемый схемой GraphQL, реализованной сервером. Второй — скалярный тип GraphQL.
И FeedQuery, и FeedType будут преобразованы в объекты Java на этапе компиляции. Для запросов вам будет предоставлен соответствующий построитель, чтобы включить всю необходимую информацию для выполнения фактического вызова.
Вы можете прочитать полный пример Java здесь. Это более полная версия учебника, которому вы следуете.
По сути, меня немного смущает разница между запросом FeedQuery($type: FeedType!, $limit: Int!)" и "feedEntries: feed(type: $type, limit: $limit)". Например, с точки зрения того, как они связаны друг с другом и с запросом, определенным в схеме GraphQL.
Запрос — это то, что вы создаете сами. Он должен соблюдать схему GraphQL и правила языка DSL. Затем на этапе компиляции определяемые вами запросы GraphQL преобразуются в код Java. Конечно, если в вашем DSL есть ошибка, будет выдана ошибка компиляции. FeedQuery будет определен вами (вы должны описать, какие данные вы хотите, чтобы сервер возвращал). Часть feedEntries — это запрос, определяемый сервером для возврата определенных данных (во многом аналогично конкретному вызову REST). Надеюсь, это немного проясняет ситуацию.
Итак, «FeedQuery» определен для использования в Java, и хотя мы можем называть его как угодно и можем изменять запрашиваемые данные, он должен соответствовать запросу, определенному в схеме GraphQL, и этому запросу (определенному в самой схеме) в данном случае это "feedEntries: feed(...)". Я правильно понимаю?
Да, хотя технически не только для использования Java (хотя в данном случае это так, поскольку это проект Java). Вы можете повторно использовать тот же запрос, например, в своем приложении iOS.
Я не знаком с определенным соглашением об именах DSL. Однако фид определяется в соответствующей схеме.
Гоча, большое спасибо за всю вашу помощь! --- И извините, последний вопрос, в соглашении DSL кажется, что формат "variableOrFunctionName: variableOrFunctionType". Итак, когда у нас есть «feedEntries: feed(type: $type, limit: $limit)», разве это не должно быть отменено? Например, «канал (тип: $ type, лимит: $ лимит): feedEntries»? Таким образом, feedEntries будет определенным типом в схеме, а feed(....) будет определенным запросом? ---
Спасибо большое за Ваш ответ! Если бы вы могли немного помочь, как этот запрос, определенный на Java в Android Studio, связан с запросом, определенным в схеме сервера GraphlQL? Например, будет ли сервер иметь запрос, определенный как "FeedQuery" или как "канал" или "feedEntries"? И если я попытаюсь определить запрос на Java, которого нет в схеме GraphQL, это приведет к какой-то ошибке, верно? Еще раз спасибо, ваш ответ помог мне кое-что прояснить!