Как использовать Apollo Android от Kotlin, но без Android? - PullRequest
0 голосов
/ 16 января 2020

Я хочу использовать Apollo Android для запроса API GitHub GraphQL, используя Kotlin с Gradle Kotlin DSL, но не на Android.

Сообщение об ошибке

Я сталкиваюсь с определенной проблемой c, но это, вероятно, потому, что в моей установке где-то что-то не так.

Подводя итог, у меня есть ViewLogin.graphql файл, из которого генерируется ViewLoginQuery, но когда я пытаюсь использовать ViewLoginQuery.builder(), возникает проблема unresolved reference: builder.

Настройка

Как упоминалось в https://github.com/apollographql/apollo-android/issues/1573, должно быть возможно использовать Apollo Android без Android.

Среда

Я использую Arch Linux и IntelliJ, с JS GraphQL Установленный плагин IntelliJ.

Gradle Kotlin Файл сборки DSL

При записи файла сборки я уже столкнулся с проблемой: мне не удалось избежать использования устарела buildscript блок.

Плагин, показанный в https://plugins.gradle.org/plugin/com.apollographql.apollo, по-видимому, является инкубационным плагином, как упомянуто в 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 , а затем, следуя 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. Я попытался настроить JS GraphQL, добавив файл src/main/graphql/nl/mypackage/myapplication/.graphqlconfig, содержащий

{
  "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 -код , но когда я пытаюсь использовать ViewLoginQuery.builder(), builder не распознается (IntelliJ, а также когда я пытаюсь его запустить).

Я пытался искать в суперклассах ViewLoginQuery, но я не смог найти ничего о сборщике.

1 Ответ

1 голос
/ 16 января 2020

Я не знаю, где должен быть builder, но вы можете напрямую создать экземпляр запроса и использовать его.

Это пример кода потребителя:

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, необходимо загрузить схему как schema.graphql вместо schema.json, см. https://github.com/jimkyndemeyer/js-graphql-intellij-plugin/issues/305 для отчета о проблеме. Вы также должны предоставить токен 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":. Вы получите всплывающее окно с запросом токена. К сожалению, плагин еще не поддерживает чтение переменной окружения из любого места, см., Например, https://github.com/jimkyndemeyer/js-graphql-intellij-plugin/issues/285

Однако для Apollo Android требуется schema.json, поэтому вам нужно сохранить тот, который вы скачали! Поскольку Apollo Android будет (по крайней мере для меня) ошибкой в ​​файле schema.graphql, скажите ему игнорировать этот файл, изменив конфигурацию задачи Gradle на

tasks.withType<com.apollographql.apollo.gradle.ApolloCodegenTask> {
    generateKotlinModels.set(true)
    exclude("**/schema.graphql")
}

Подводя итог: для JS Плагин GraphQL, который вы хотите, чтобы легко работать с файлами graphql, вам нужен schema.graphql, который вы загружаете из .graphqlconfig. Для Apollo Android вам потребуется schema.json, который вы загружаете с помощью интерфейса Apollo cli.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...