GraphQL IRL (Android Makers)

GraphQL IRL (Android Makers)

6923bdeb363961b064d2cdb6329982d6?s=128

Roberto Orgiu

April 22, 2019
Tweet

Transcript

  1. film character species homeworld episode

  2. film character species homeworld episode GR APHQL IN REAL L

    IFE ROBERTO ORGIU - @_TIWIZ
  3. Fun fact GraphQL.replace(REST) usually returns false

  4. Architectural Pattern Query Language

  5. Leverage Protocol Use own Conventions

  6. Full request Client Performances

  7. Multiple Endpoints Single Endpoint

  8. What is GraphQ What is GraphQL? D E E P

    D I V E I N T O
  9. None
  10. WHY APOLLO? Compile time safety Caching Community Code generation

  11. buildscriptT{ repositoriesT{ google()T }A dependenciesT{ classpathA"com.android.tools.build:gradle:$tools_version" classpathB"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" }B }C allprojectsT{

    repositoriesB{ google()B }D }E
  12. buildscriptT{ repositoriesT{ google()T jcenter() }A dependenciesT{ classpathA"com.android.tools.build:gradle:$tools_version" classpathB"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.apollographql.apollo:gradle-plugin:$apollo_version"

    }B }C allprojectsT{ repositoriesB{ google()B jcenter() }D }E
  13. buildscriptT{ repositoriesT{ google()T jcenter() }A dependenciesT{ classpathA"com.android.tools.build:gradle:$tools_version" classpathB"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.apollographql.apollo:gradle-plugin:$apollo_version"

    }B }C allprojectsT{ repositoriesB{ google()B jcenter() }D }E
  14. apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android

    { ... }
  15. apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply

    plugin: 'com.apollographql.android' android { ... }
  16. dependencies { ... implementation "com.apollographql.apollo:apollo-runtime:$apollo_version" implementation "com.apollographql.apollo:apollo-rx2-support:$apollo_version" ... }

  17. DOWNSIDES Apollo-plugin schema.json *.graphql X X

  18. testing

  19. testing Compile time safety MockWebServer

  20. > Task :apollo:generateDebugApolloIR FAILED .../android/apollo/Query.graphql: Cannot query field "nam" on

    type "YourType". Did you mean "name"? error: Validation of GraphQL query document failed FAILURE: Build failed with an exception.
  21. @get:Rule val mockWebServer = MockWebServerRule() mockWebServer.enqueueResponse("/response.json") val testApolloClient = ApolloClient.builder()

    .serverUrl(mockWebServer.url) .okHttpClient(client) .build()
  22. SHRINK IT

  23. query filmById($filmId: ID){ film(filmID :$filmId){ title episodeID characterConnectionT{ charactersT{ name

    homeworldT{ name }A speciesT{ name classification }B filmConnectionT{ filmsT{ title episodeID }C }D }E }F }G }H A u t o m a t i c P e r s i s t e d Q u e r i e s
  24. query filmById($filmId: ID){ film(filmID :$filmId){ title episodeID characterConnectionT{ charactersT{ name

    homeworldT{ name }A speciesT{ name classification }B filmConnectionT{ filmsT{ title episodeID }C }D }E }F }G }H A u t o m a t i c P e r s i s t e d Q u e r i e s variables { "filmId" : 1 }A query: query filmById($filmId: ID) { film(filmId :$filmId) { title episodeID characterConnection { name homeworld{ name }B species { name classification }C filmConnection { films { title episodeID }D }E }F }G }H operationName: filmById
  25. query filmById($filmId: ID){ film(filmID :$filmId){ title episodeID characterConnectionT{ charactersT{ name

    homeworldT{ name }A speciesT{ name classification }B filmConnectionT{ filmsT{ title episodeID }C }D }E }F }G }H A u t o m a t i c P e r s i s t e d Q u e r i e s variables { "filmId" : 1 }A query: query filmById($filmId: ID) { film(filmId :$filmId) { title episodeID characterConnection { name homeworld{ name }B species { name classification }C filmConnection { films { title episodeID }D }E }F }G }H operationName: filmById operationName: filmById variables { "filmId" : 1 }T
  26. query filmById($filmId: ID){ film(filmID :$filmId){ title episodeID characterConnectionT{ charactersT{ name

    homeworldT{ name }A speciesT{ name classification }B filmConnectionT{ filmsT{ title episodeID }C }D }E }F }G }H A u t o m a t i c P e r s i s t e d Q u e r i e s variables { "filmId" : 1 }A query: query filmById($filmId: ID) { film(filmId :$filmId) { title episodeID characterConnection { name homeworld{ name }B species { name classification }C filmConnection { films { title episodeID }D }E }F }G }H operationName: filmById operationName: filmById variables { "filmId" : 1 }T
  27. A u t o m a t i c P

    e r s i s t e d Q u e r i e s operationName: filmById variables { "filmId" : 1 }T extensions: { persistedQuery: { "version": 1, "sha256Hash": "queryHash" } }
  28. Android Back end Query Hash Query Hash Not Found Whole

    Query + Query Hash Response
  29. @get:Rule valTmockWebServerT=TMockWebServerRule() mockWebServer.enqueueResponse(“/response.json") valTurlT=TmockWebServer.url valßapolloClientT= ApolloClient.builder() .serverUrl(url) .okHttpClient(client) .build()

  30. valßapolloClientT= ApolloClient.builder() .serverUrl(url) .okHttpClient(client) .build()

  31. valßapolloClientT= ApolloClient.builder() .serverUrl(url) .okHttpClient(client) .enableAutoPersistedQueries(true) .build()

  32. Tricks Tricks J U S T S O M E

    query SampleQuery { assetID: sourceId fingerprint: modified headlineInfo: headline { __typename headline: default }A lastUpdated: lastModification }B
  33. Tricks Tricks L A B E L F I E

    L D S C A N G O A L O N G D I S T A N C E J U S T S O M E query SampleQuery { assetID: sourceId fingerprint: modified headlineInfo: headline { __typename headline: default }A lastUpdated: lastModification }B
  34. Tricks Tricks A P O L L O A D

    D S T Y P E N A M E E V E R Y W H E R E J U S T S O M E query SampleQuery { assetID: sourceId fingerprint: modified headlineInfo: headline { __typename headline: default }A lastUpdated: lastModification }B
  35. Tricks Tricks S C H E M A A N

    D Q U E R I E S C A N B E M O V E D J U S T S O M E apollo { schemaFilePath = "/path/my-schema.json" outputPackageName = "pkg.graphql.api" }
  36. Tricks Tricks S U P P O R T S

    F O R J A V A B E A N S E M A N T I C S J U S T S O M E class Type { public Another getAnother() { ... } } //build.gradle apollo { useJavaBeansSemanticNaming = true }
  37. Tricks Tricks R E M E M B E R

    T O B E O N L I N E ¯ \ _ ( ツ ) _ / ¯ J U S T S O M E
  38. THANK YOU!