如何在没有 Android 的情况下使用 Kotlin 的 Apollo Android?
How to use Apollo Android from Kotlin, but without Android?
我想使用 Apollo Android 查询 GitHub GraphQL api,使用 Kotlin 和 Gradle Kotlin DSL,但 不是 在 Android.
错误信息
我运行解决了一个特定的问题,但这可能是因为我在其他地方的设置有问题。
总而言之,我有一个 ViewLogin.graphql
文件,从中生成了 ViewLoginQuery
,但是当我尝试使用 ViewLoginQuery.builder()
时,unresolved reference: builder
就是问题所在。
设置
正如https://github.com/apollographql/apollo-android/issues/1573中提到的,应该可以在没有Android的情况下使用Apollo Android。
环境
我正在使用 Arch Linux 和 IntelliJ,安装了 JS GraphQL IntelliJ 插件。
Gradle Kotlin DSL 构建文件
在编写构建文件时,我已经 运行 遇到了一个问题:我没有设法避免使用 deprecated buildscript
块。
https://plugins.gradle.org/plugin/com.apollographql.apollo is apparently the incubating plugin as mentioned at https://github.com/apollographql/apollo-android/issues/1573#issuecomment-575613238 处显示的插件尚未就绪。
以下构建文件似乎正确应用了插件:
buildscript {
repositories {
maven {
url = uri("https://plugins.gradle.org/m2/")
}
jcenter()
}
dependencies {
classpath("com.apollographql.apollo:apollo-gradle-plugin:1.2.2")
}
}
apply(plugin = "com.apollographql.android")
plugins {
val kotlinVersion = "1.3.60"
application
kotlin("jvm") version kotlinVersion
java
idea
}
dependencies {
implementation(kotlin("stdlib"))
// Apollo and dependencies
implementation("com.apollographql.apollo:apollo-runtime:1.2.2")
implementation("com.squareup.okio:okio:2.4.3")
implementation("org.jetbrains:annotations:13.0")
testImplementation("org.jetbrains:annotations:13.0")
}
repositories {
mavenCentral()
mavenLocal()
jcenter()
}
tasks.withType<com.apollographql.apollo.gradle.ApolloCodegenTask> {
generateKotlinModels.set(true)
}
所以同步后,我有可用的 apollo Gradle 任务。
正在下载架构
我安装了Apollo cli interface and then, following the Apollo docs,我运行
apollo schema:download --endpoint=https://api.github.com/graphql --header="Authorization: Bearer mytoken"
这给了我一个 schema.json
我把它放在 src/main/graphql/nl/mypackage/myapplication/schema.json
.
示例查询
我有一个文件 src/main/graphql/nl/mypackage/myapplication/ViewLogin.graphql
,其中包含 query ViewLogin { viewer { login }}
。
IntelliJ 在 viewer
和 login
上显示错误,说 Unknown field "viewer" on object type "Query". Did you mean "viewer"?
。但这可能是 JS GraphQL 插件的错误配置。
我尝试通过添加包含
的文件 src/main/graphql/nl/mypackage/myapplication/.graphqlconfig
来配置 JS GraphQL
{
"name": "GitHub GraphQL Schema",
"schemaPath": "schema.json",
"extensions": {
"endpoints": {
"Default GraphQL Endpoint": {
"url": "https://api.github.com/graphql",
"headers": {
"user-agent": "JS GraphQL"
},
"introspect": true
}
}
}
}
但错误依然存在。
然后我执行了 Gradle 任务 generateApolloClasses
生成了一个 build/generated/source/apollo/classes/main/nl/mypackage/myapplication/ViewLoginQuery.kt
文件。
当我打开该文件时,没有显示任何错误并且一切正常。
执行查询
在文件 src/main/kotlin/nl/mypackage/myapplication/GraphqlExample.kt
中,我尝试按照 https://www.apollographql.com/docs/android/essentials/get-started/#consuming-code 中的文档使用查询
但是当我尝试使用 ViewLoginQuery.builder()
时 builder
无法识别(IntelliJ 以及当我尝试使用 运行 时)。
我尝试在 ViewLoginQuery 的超类中搜索,但找不到有关构建器的任何信息。
我不知道 builder
应该在哪里,但是您可以直接实例化查询并使用它。
这是消费者代码的示例(最后使用 2.1.0 版测试):
import com.apollographql.apollo.ApolloCall
import com.apollographql.apollo.ApolloClient
import com.apollographql.apollo.api.Response
import com.apollographql.apollo.exception.ApolloException
import okhttp3.OkHttpClient
fun main(args: Array<String>) {
val serverUrl = "https://api.github.com/graphql"
val authHeader = args[0]
// Add authentication header for GitHub
val okHttpClient = OkHttpClient.Builder()
.addInterceptor { chain ->
val builder = chain.request().newBuilder()
builder.header("Authorization", "Bearer $authHeader")
chain.proceed(builder.build())
}
.build()
val apolloClient = ApolloClient.builder()
.serverUrl(serverUrl)
.okHttpClient(okHttpClient)
.build()
val query = ViewLoginQuery()
apolloClient.query(query).enqueue(object : ApolloCall.Callback<ViewLoginQuery.Data?>() {
override fun onResponse(dataResponse: Response<ViewLoginQuery.Data?>) {
val data = dataResponse.data
if (data == null) {
println("No data received")
println(dataResponse.errors)
} else {
println(dataResponse.data?.viewer?.login)
}
}
override fun onFailure(e: ApolloException) {
println(e.message)
}
})
}
要修复 .graphql 文件中的 'unknown field' 错误,您必须将架构下载为 schema.graphql
而不是 schema.json
,请参阅 https://github.com/jimkyndemeyer/js-graphql-intellij-plugin/issues/305 了解问题报告。
您还必须在 header 中提供 github 标记。将您的 .graphqlconfig
更改为以下内容:
{
"name": "GitHub GraphQL Schema",
"schemaPath": "./schema.graphql",
"extensions": {
"endpoints": {
"Default GraphQL Endpoint": {
"url": "https://api.github.com/graphql",
"headers": {
"user-agent": "JS GraphQL",
"Authorization": "Bearer ${env:GITHUB_GRAPHQL_TOKEN}"
},
"introspect": true
}
}
}
}
您现在可以通过单击 "url":
行旁边的 'run introspection query' 装订线图标轻松下载新架构。
您将收到一个弹出窗口,要求提供令牌。不幸的是,该插件还不支持从任何地方读取环境变量,例如 https://github.com/jimkyndemeyer/js-graphql-intellij-plugin/issues/285
但是,Apollo Android需要一个schema.json
,所以你需要保留你下载的那个!
由于 Apollo Android 将(至少对我而言)在 schema.graphql
文件上出错,通过将 Gradle 任务配置更改为
告诉它忽略该文件
apollo {
generateKotlinModels.set(true)
graphqlSourceDirectorySet.srcDir("src/main/graphql")
graphqlSourceDirectorySet.include("**/*.graphql")
graphqlSourceDirectorySet.exclude("**/schema.graphql")
}
有关这些选项的文档,请参阅 https://www.apollographql.com/docs/android/essentials/plugin-configuration/
总而言之:对于 JS GraphQL 插件,您需要它以便轻松地使用 graphql 文件,您需要从 .graphqlconfig
下载的 schema.graphql
。对于 Apollo Android,您需要使用 Apollo cli 界面下载的 schema.json
。
[Edit June 2020]对于ApolloAndroid2,可以使用新的Gradle插件,所以完整的build.gradle.kts变成如下:
请记住在使用前始终检查依赖项更新,例如使用 use-latest-versions Gradle 插件中的 help/useLatestVersions Gradle 任务。
plugins {
val kotlinVersion = "1.3.72"
application
kotlin("jvm") version kotlinVersion
java
idea
// Plugin which checks for dependency updates with help/dependencyUpdates task.
id("com.github.ben-manes.versions") version "0.28.0"
// Plugin which can update Gradle dependencies, use help/useLatestVersions
id("se.patrikerdes.use-latest-versions") version "0.2.14"
id("com.apollographql.apollo") version "2.1.0"
}
dependencies {
implementation(kotlin("stdlib"))
// Apollo and dependencies
implementation("com.apollographql.apollo:apollo-runtime:2.1.0")
implementation("com.squareup.okio:okio:2.4.3")
implementation("org.jetbrains:annotations:19.0.0")
testImplementation("org.jetbrains:annotations:19.0.0")
}
repositories {
mavenCentral()
mavenLocal()
jcenter()
}
apollo {
generateKotlinModels.set(true)
graphqlSourceDirectorySet.srcDir("src/main/graphql")
graphqlSourceDirectorySet.include("**/*.graphql")
graphqlSourceDirectorySet.exclude("**/schema.graphql")
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.jvmTarget = "1.8"
}
我想使用 Apollo Android 查询 GitHub GraphQL api,使用 Kotlin 和 Gradle Kotlin DSL,但 不是 在 Android.
错误信息
我运行解决了一个特定的问题,但这可能是因为我在其他地方的设置有问题。
总而言之,我有一个 ViewLogin.graphql
文件,从中生成了 ViewLoginQuery
,但是当我尝试使用 ViewLoginQuery.builder()
时,unresolved reference: builder
就是问题所在。
设置
正如https://github.com/apollographql/apollo-android/issues/1573中提到的,应该可以在没有Android的情况下使用Apollo Android。
环境
我正在使用 Arch Linux 和 IntelliJ,安装了 JS GraphQL IntelliJ 插件。
Gradle Kotlin DSL 构建文件
在编写构建文件时,我已经 运行 遇到了一个问题:我没有设法避免使用 deprecated buildscript
块。
https://plugins.gradle.org/plugin/com.apollographql.apollo is apparently the incubating plugin as mentioned at https://github.com/apollographql/apollo-android/issues/1573#issuecomment-575613238 处显示的插件尚未就绪。
以下构建文件似乎正确应用了插件:
buildscript {
repositories {
maven {
url = uri("https://plugins.gradle.org/m2/")
}
jcenter()
}
dependencies {
classpath("com.apollographql.apollo:apollo-gradle-plugin:1.2.2")
}
}
apply(plugin = "com.apollographql.android")
plugins {
val kotlinVersion = "1.3.60"
application
kotlin("jvm") version kotlinVersion
java
idea
}
dependencies {
implementation(kotlin("stdlib"))
// Apollo and dependencies
implementation("com.apollographql.apollo:apollo-runtime:1.2.2")
implementation("com.squareup.okio:okio:2.4.3")
implementation("org.jetbrains:annotations:13.0")
testImplementation("org.jetbrains:annotations:13.0")
}
repositories {
mavenCentral()
mavenLocal()
jcenter()
}
tasks.withType<com.apollographql.apollo.gradle.ApolloCodegenTask> {
generateKotlinModels.set(true)
}
所以同步后,我有可用的 apollo Gradle 任务。
正在下载架构
我安装了Apollo cli interface and then, following the Apollo docs,我运行
apollo schema:download --endpoint=https://api.github.com/graphql --header="Authorization: Bearer mytoken"
这给了我一个 schema.json
我把它放在 src/main/graphql/nl/mypackage/myapplication/schema.json
.
示例查询
我有一个文件 src/main/graphql/nl/mypackage/myapplication/ViewLogin.graphql
,其中包含 query ViewLogin { viewer { login }}
。
IntelliJ 在 viewer
和 login
上显示错误,说 Unknown field "viewer" on object type "Query". Did you mean "viewer"?
。但这可能是 JS GraphQL 插件的错误配置。
我尝试通过添加包含
src/main/graphql/nl/mypackage/myapplication/.graphqlconfig
来配置 JS GraphQL
{
"name": "GitHub GraphQL Schema",
"schemaPath": "schema.json",
"extensions": {
"endpoints": {
"Default GraphQL Endpoint": {
"url": "https://api.github.com/graphql",
"headers": {
"user-agent": "JS GraphQL"
},
"introspect": true
}
}
}
}
但错误依然存在。
然后我执行了 Gradle 任务 generateApolloClasses
生成了一个 build/generated/source/apollo/classes/main/nl/mypackage/myapplication/ViewLoginQuery.kt
文件。
当我打开该文件时,没有显示任何错误并且一切正常。
执行查询
在文件 src/main/kotlin/nl/mypackage/myapplication/GraphqlExample.kt
中,我尝试按照 https://www.apollographql.com/docs/android/essentials/get-started/#consuming-code 中的文档使用查询
但是当我尝试使用 ViewLoginQuery.builder()
时 builder
无法识别(IntelliJ 以及当我尝试使用 运行 时)。
我尝试在 ViewLoginQuery 的超类中搜索,但找不到有关构建器的任何信息。
我不知道 builder
应该在哪里,但是您可以直接实例化查询并使用它。
这是消费者代码的示例(最后使用 2.1.0 版测试):
import com.apollographql.apollo.ApolloCall
import com.apollographql.apollo.ApolloClient
import com.apollographql.apollo.api.Response
import com.apollographql.apollo.exception.ApolloException
import okhttp3.OkHttpClient
fun main(args: Array<String>) {
val serverUrl = "https://api.github.com/graphql"
val authHeader = args[0]
// Add authentication header for GitHub
val okHttpClient = OkHttpClient.Builder()
.addInterceptor { chain ->
val builder = chain.request().newBuilder()
builder.header("Authorization", "Bearer $authHeader")
chain.proceed(builder.build())
}
.build()
val apolloClient = ApolloClient.builder()
.serverUrl(serverUrl)
.okHttpClient(okHttpClient)
.build()
val query = ViewLoginQuery()
apolloClient.query(query).enqueue(object : ApolloCall.Callback<ViewLoginQuery.Data?>() {
override fun onResponse(dataResponse: Response<ViewLoginQuery.Data?>) {
val data = dataResponse.data
if (data == null) {
println("No data received")
println(dataResponse.errors)
} else {
println(dataResponse.data?.viewer?.login)
}
}
override fun onFailure(e: ApolloException) {
println(e.message)
}
})
}
要修复 .graphql 文件中的 'unknown field' 错误,您必须将架构下载为 schema.graphql
而不是 schema.json
,请参阅 https://github.com/jimkyndemeyer/js-graphql-intellij-plugin/issues/305 了解问题报告。
您还必须在 header 中提供 github 标记。将您的 .graphqlconfig
更改为以下内容:
{
"name": "GitHub GraphQL Schema",
"schemaPath": "./schema.graphql",
"extensions": {
"endpoints": {
"Default GraphQL Endpoint": {
"url": "https://api.github.com/graphql",
"headers": {
"user-agent": "JS GraphQL",
"Authorization": "Bearer ${env:GITHUB_GRAPHQL_TOKEN}"
},
"introspect": true
}
}
}
}
您现在可以通过单击 "url":
行旁边的 'run introspection query' 装订线图标轻松下载新架构。
您将收到一个弹出窗口,要求提供令牌。不幸的是,该插件还不支持从任何地方读取环境变量,例如 https://github.com/jimkyndemeyer/js-graphql-intellij-plugin/issues/285
但是,Apollo Android需要一个schema.json
,所以你需要保留你下载的那个!
由于 Apollo Android 将(至少对我而言)在 schema.graphql
文件上出错,通过将 Gradle 任务配置更改为
apollo {
generateKotlinModels.set(true)
graphqlSourceDirectorySet.srcDir("src/main/graphql")
graphqlSourceDirectorySet.include("**/*.graphql")
graphqlSourceDirectorySet.exclude("**/schema.graphql")
}
有关这些选项的文档,请参阅 https://www.apollographql.com/docs/android/essentials/plugin-configuration/
总而言之:对于 JS GraphQL 插件,您需要它以便轻松地使用 graphql 文件,您需要从 .graphqlconfig
下载的 schema.graphql
。对于 Apollo Android,您需要使用 Apollo cli 界面下载的 schema.json
。
[Edit June 2020]对于ApolloAndroid2,可以使用新的Gradle插件,所以完整的build.gradle.kts变成如下:
请记住在使用前始终检查依赖项更新,例如使用 use-latest-versions Gradle 插件中的 help/useLatestVersions Gradle 任务。
plugins {
val kotlinVersion = "1.3.72"
application
kotlin("jvm") version kotlinVersion
java
idea
// Plugin which checks for dependency updates with help/dependencyUpdates task.
id("com.github.ben-manes.versions") version "0.28.0"
// Plugin which can update Gradle dependencies, use help/useLatestVersions
id("se.patrikerdes.use-latest-versions") version "0.2.14"
id("com.apollographql.apollo") version "2.1.0"
}
dependencies {
implementation(kotlin("stdlib"))
// Apollo and dependencies
implementation("com.apollographql.apollo:apollo-runtime:2.1.0")
implementation("com.squareup.okio:okio:2.4.3")
implementation("org.jetbrains:annotations:19.0.0")
testImplementation("org.jetbrains:annotations:19.0.0")
}
repositories {
mavenCentral()
mavenLocal()
jcenter()
}
apollo {
generateKotlinModels.set(true)
graphqlSourceDirectorySet.srcDir("src/main/graphql")
graphqlSourceDirectorySet.include("**/*.graphql")
graphqlSourceDirectorySet.exclude("**/schema.graphql")
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.jvmTarget = "1.8"
}