Spring Boot でGraphQLで構築された外部のAPIを利用するため、GraphQLクライアントを用意する
GraphQLクライアントには Apollo や Relay が思いつくが、RelayはどちらかというとReact特化でApolloのようにさまざまな言語で使えるようになっていないとのこと
参考記事
最高のGraphQLクライアントを求めて Apollo vs Relay - nakamoriのblog
そのため Apollo でGraphQLクライアントをセットアップすることにした
セットアップ
Spring Boot のバージョンは 2.5.12(理由があって上げられない)、Apollo クライアントは v2系を使う(理由は別記事に書く)
以下の公式ドキュメントと
4. Execute your first query - Apollo GraphQL Docs
以下の記事が大変参考になったのでこれらを見ながら進める
Java × Spring Boot × Apollo で GraphQL クライアントを実装する #Java - Qiita
pom.xml に記載
まず、pom.xml に必要とするライブラリ記載する
この時、同期通信を簡単に書くために RxJava で書けるライブラリも記載する
<dependency> <groupId>com.apollographql.apollo</groupId> <artifactId>apollo-runtime</artifactId> <version>2.5.14</version> </dependency> <dependency> <groupId>com.apollographql.apollo</groupId> <artifactId>apollo-rx3-support</artifactId> <version>2.5.14</version> </dependency>
また、Apollo による Query モデルクラスの自動生成を行うため、以下のプラグインも記載する
GitHub - aoudiamoncef/apollo-client-maven-plugin at support/apollo-2
<plugins> <plugin> <groupId>com.github.aoudiamoncef</groupId> <artifactId>apollo-client-maven-plugin</artifactId> <version>4.0.6</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <services> <example-api> <compilationUnit> <name>example</name> <compilerParams> <rootPackageName>com.example.graphql.client</rootPackageName> </compilerParams> </compilationUnit> </example-api> </services> </configuration> </execution> </executions> </plugin> </plugins>
Query モデルクラスの自動生成
先ほど入れたpluginのintrospectionの箇所に、利用する外部APIの情報や出力先を記載する
mvn コマンドで generate-sources
を実行すると、src/main/graphql/example
に schema.json が生成されている
さらに、その同フォルダに GraphQLクエリファイルを置き、再度プラグインを実行すると target 配下に Query モデルクラスが自動生成されているので、このフォルダにクラスパスを通しておく
クライアントインスタンスの生成
以下のようにApolloクライアントのインスタンスを生成する
final ApolloClient apolloClient = ApolloClient.builder() .serverUrl("http://localhost:5000/graphql/endpoint") .build();
このクライアントと先ほど生成したクエリを使って実行する
MyQuery query = MyQuery.builder().build();
ApolloQueryCall<Data> apolloQueryCall = apolloClient.query(query);
return Rx3Apollo.from(apolloQueryCall)
.map(Response::getData)
.map(MyQuery.Data::getOffers)
.blockingFirst();
これで一旦、単純なセットアップは完了した
リクエスト時にヘッダーにAuth情報を含めたい場合はどうするかなど、詰まったところは別記事にする
ApolloクライアントをつかないGraphQLクライアントのセットアップ
試していないが spring-boot-starter-graphql
でGraphQLクライアントをセットアップすることも可能みたい
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-graphql</artifactId> </dependency>
簡単に始められそうだが、スキーマ情報はない中でクエリを書くみたいで後々苦労しそう?