使用Apollo库学习实现GraphQL Client的章节
首先
这篇文章是参考@ruwatana先生的文章《使用Java×Spring Boot×Apollo实现GraphQL客户端》而创建的。
与@ruwatana的文章主要不同之处是
-
- IntellJ IDEAを利用した実装を前提とする
-
- Spring Bootを利用しない
- Kotlinで実装する
是的。
本文介绍了如何使用IntelliJ IDEA、Apollo库、Kotlin和gradle在Mac上开发GraphQL客户端环境的方法。
在本文中,我们将IntelliJ IDEA项目发布在https://github.com/kobunhada/GraphQLClientExample上。如果您愿意的话,请提供参考和任何不加掩饰的评论。
关于文章创作时的开发环境
本文所使用的开发环境如下所示。关于版本号,我想应该是截至2021年8月29日(可能)最新的。
IDEIntelliJ IDEA2020.3.4gradle, KotlinSDK等は当IDEに依存IDE PluginJS GraphQL3.0.0IntelliJ IDEAでGraphQLファイルを扱うのに便利なPluginGraphQL ClientApollo Client2.3.5build.gradleに設定GraphQL Server環境構築Node.jsv16.8.0local環境にGraphQL Serverを構築する為に必要GraphQL Server環境構築yarn1.22.11同上Terminal任意のTerminalアプリ-
准备GraphQL服务器
由于本文旨在创建GraphQL客户端,因此GraphQL服务器将使用广为人知的“GraphQL Pokemon”,这对GraphQL学习者来说是有名的。
构建GraphQL 的服务器需要Node.js和yarn。关于构建的方法,推荐参考@thesugar的文章《Mac に Node.js 環境をさくっと整えるための最短ルート》。
完成Node.js和yarn的安装后,将GraphQL 克隆到任意目录下。
对GraphQL 进行克隆,并将其复制到本地。
您可以使用任何Git客户端应用程序(例如GitHub Desktop),将其克隆到任意目录中。
git clone git@github.com:lucasbento/graphql-pokemon.git
如果克隆无法成功(不清楚如何操作),请打开GraphQL 的网站,下载zip文件也是可以的。这种情况下,请解压缩下载的zip文件到任意目录。
开启 GraphQL
在终端应用程序中运行。
1. 将克隆的GraphQL 目录移动到根目录中。
cd [あなたがClone(or zipファイルを展開したDirectory)]/graphql-pokemon
2. 使用GraphQL构建和启动Pokemon。
yarn
yarn run build-app
yarn start
一旦启动成功
GraphQL-Pokemon started on http://localhost:5000/
经过输出后,您将能够访问GraphQL 服务器。
成功了,如果访问 http://localhost:5000/ 并显示以下网站。
关于GraphQL Pokemon服务器
在画面的左侧编写并执行Graph QL的查询(点击圆圈中的三角箭头按钮),执行结果将会在右侧输出。
此外,该网站右上角有一个“DOCs”按钮,您可以从这里查看GraphQL 的模式。
引入JS GraphQL插件
这是一个在使用IntelliJ IDEA处理GraphQL文件时非常方便的插件。同时,本文将在假定已安装此插件的前提下进行说明。
安装方法与其他插件相同。
安装JS GraphQL
请从菜单中选择“偏好设置”。
请点击左侧的插件,然后选择右上角的市场。在市场中搜索GraphQL等关键词,并安装JS GraphQL插件。
创建新项目
请使用以下设置,在IntelliJ IDEA中创建一个新项目。
-
- 言語: Kotlin/JVM
- Build Tool: Gradle
项目成果示例
请在创建项目后打开build.gradle文件。
引入Apollo库
Applo库是一个GraphQL的客户端库。
-
- 以下pluginをbuild.gradleのpluginsに追加して下さい。
‘com.apollographql.apollo’ version ‘2.5.3’
plugins {
id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.5.30'
id 'com.apollographql.apollo' version '2.5.3'
}
-
- 以下、3つのライブラリをbuild.gradleのdependenciesに追加して下さい。
com.apollographql.apollo:apollo-runtime:2.5.3
com.apollographql.apollo:apollo-coroutines-support:2.5.3″
com.apollographql.apollo:apollo-rx3-support:2.5.3
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib"
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
//Apollo client library for read GraphQL web server
implementation("com.apollographql.apollo:apollo-runtime:2.5.3")
implementation("com.apollographql.apollo:apollo-coroutines-support:2.5.3")
implementation("com.apollographql.apollo:apollo-rx3-support:2.5.3")
}
请在追加后,确保不要忘记执行gradle的同步。
添加GraphQL的各种文件
要从GraphQL服务器获取数据
-
- Schama定義ファイル
- GraphQL Queryファイル
需要。
添加GraphQL的Schema定义文件
我认为在以后的终端上,通过IntelliJ IDEA的终端进行操作可能会更方便。以下是有关IntelliJ终端显示方式的说明。
显示IntelliJ的终端
2. 在Schama中定义的文件输出目录创建到项目中。
在项目/src/main/目录下,使用任意名称创建一个目录。
mkdir -p src/main/graphql/graphqlpokemon
生成schema.json文件(即输出Schema定义文件)。
指定前准备好的GraphQL Server的终端点并生成schema.json。
./gradlew downloadApolloSchema \
--endpoint="http://localhost:5000/graphql/endpoint" \
--schema="src/main/graphql/graphqlpokemon/schema.json"
BUILD SUCCESSFUL in 584ms
1 actionable task: 1 executed
如果构建失败,请重新检查build.gradle的设置。
添加一个GraphQL查询
接下来,我们将添加一个查询。
创建查询文件
实现查询功能。
最好先访问 http://localhost:5000/ ,确保查询功能正常运行,然后再进行实现,这样可能会更加轻松。
query Example {
pokemons(first: 10) {
number,
name,
maxHP,
maxHP,
image
}
}
3. 重建
重新构建,Apollo库可以生成2中新增的查询模型类(graphqlpokemon.ExampleQuery)。
客户端应用的实现
请将以下内容进行实施。
-
- graphqlpokemon.Example・・・GraphQLからデータを取得する為のクラス
- graphqlpokemon.Main・・・mainメソッド。Example.get()メソッドをcallして、dataを標準出力する
package graphqlpokemon
import com.apollographql.apollo.ApolloClient
import com.apollographql.apollo.coroutines.await
import java.lang.Exception
class Example {
suspend fun get(): MutableIterator<ExampleQuery.Pokemon>? {
val apolloClient = ApolloClient.builder()
.serverUrl("http://localhost:5000/graphql/endpoint")
.build()
val query = ExampleQuery.builder().build()
val result: MutableIterator<ExampleQuery.Pokemon>? = try {
apolloClient.query(query).await().data?.pokemons?.iterator()
} catch (e: Exception) {
null
}
return result
}
}
package graphqlpokemon
import kotlinx.coroutines.*
import kotlin.jvm.JvmStatic
import kotlin.system.exitProcess
object Main {
private var isExit = false
@JvmStatic
fun main(args: Array<String>) {
GlobalScope.launch {
val pokemons = Example().get()
if (pokemons == null) {
println("no pokemon")
isExit = true
} else {
pokemons.forEach { pokemon ->
delay(100)
println(
"number:%s, name:%s, hp:%s, cp:%s, image url:%s".format(
pokemon.number,
pokemon.name,
pokemon.maxHP,
pokemon.maxCP,
pokemon.image
)
);
}
isExit = true
}
}
while (true) {
Thread.sleep(100)
if (isExit) exitProcess(0)
}
}
}
如果成功,将会输出如下:
number:001, name:Bulbasaur, hp:1071, cp:951, image url:https://img.pokemondb.net/artwork/bulbasaur.jpg
number:002, name:Ivysaur, hp:1632, cp:1483, image url:https://img.pokemondb.net/artwork/ivysaur.jpg
number:003, name:Venusaur, hp:2580, cp:2392, image url:https://img.pokemondb.net/artwork/venusaur.jpg
number:004, name:Charmander, hp:955, cp:841, image url:https://img.pokemondb.net/artwork/charmander.jpg
number:005, name:Charmeleon, hp:1557, cp:1411, image url:https://img.pokemondb.net/artwork/charmeleon.jpg
number:006, name:Charizard, hp:2602, cp:2413, image url:https://img.pokemondb.net/artwork/charizard.jpg
number:007, name:Squirtle, hp:1008, cp:891, image url:https://img.pokemondb.net/artwork/squirtle.jpg
number:008, name:Wartortle, hp:1582, cp:1435, image url:https://img.pokemondb.net/artwork/wartortle.jpg
number:009, name:Blastoise, hp:2542, cp:2355, image url:https://img.pokemondb.net/artwork/blastoise.jpg
number:010, name:Caterpie, hp:443, cp:367, image url:https://img.pokemondb.net/artwork/caterpie.jpg
Process finished with exit code 0
最后
我之前对GraphQL和Kotlin都没有经验,而且已经有很久没有用过(事实上,编码本身已经差不多半年没有碰了),所以我的内容可能有些拙劣。但如果对某人有所帮助就让我感到幸福。
请参阅
-
- Java × Spring Boot × Apollo で GraphQL クライアントを実装する
-
- Mac に Node.js 環境をさくっと整えるための最短ルート
- GraphQL