既存のGraphQLサービスからSchemaを取得する
GitHub API v4のドキュメントをみていたのですが、自分が慣れしたんでるツールであるGraphQL Playgroundのdocsでschemaを確認したかったのですが、さくっとやり方が分からなかったので、さくっとやる方法をまとめてみました!
まずはGraphQLのSchemaの種類
- GraphQL SDL(Schema Definition Language)
- 拡張子は.graphql
- 人間がSchemaを書く場合はほとんどの人はこれ
- Introspection Result
- 拡張子は.json
- IntrospectionQuery という長いqueryの結果が書き出されたもの
- 人間には読み書きしにくい
GraphQLのSchemaを取得する方法
1. 対象のGraphQLサービス
今回はGitHub API v4からschemaを取得してみます。
2. アクセストークンの発行
こちらに従ってアクセストークンを発行してください。
権限は最低限で大丈夫です。3. get-graphql-schemaをインストール
今回はGrapgQLのdatabase clientが提供しているパッケージを使います。
次のコマンドでインストールしてください
npm install -g get-graphql-schema
4. schemaの取得
get-graphql-schemaを使うと、.graphql形式でも.json形式でもどちらのschemaでも取得することができます。
.graphql形式で取得する場合
get-graphql-schema -h 'Authorization=Bearer <②で取得したAccessToken>' https://api.github.com/graphql > schema.graphql
.json形式で取得する場合
get-graphql-schema -j -h 'Authorization=Bearer <②で取得したAccessToken>' https://api.github.com/graphql > schema.json
GraphQLのSchemaの使い道
僕はローカルでGraphQL Playgroundのmockサーバーを立ち上げるのに使いました。
GraphQL Playgroundを使い慣れてるので、
- ドキュメントがみやすいこと
- queryやmutationを書きやすいこと
が僕にとっては好都合でした。
ローカルでGraphQL Playgroundのmockサーバーを立ち上げるには、以下を実行してください。
npm install -g graphql-playground-mock
graphql-playground-mock <④で取得したschemaのファイル名>
mockサーバーが起動したら、http://localhost:4000/ にアクセスするとGraphQL Playgroundにアクセスできます。
他の使い道としては、PostmanでGraphQLのqueryを書く時にも使えるようです。
難しいSchemaの取得方法
GraphQLのSchemaは、IntrospectionQueryを使うことで確認することが可能です。
しかし、全てのSchema定義を取得しようと思うと次のようなクエリをPOSTする必要があります。
curl https://api.github.com/graphql \
-H 'Authorization: Bearer 7af842efa2f2c92676759f97dbeb4ef7d3635909' \
-H 'content-type: application/json' \
--data-binary '{"operationName":"IntrospectionQuery","variables":{},"query":"query IntrospectionQuery {\n __schema {\n queryType {\n name\n }\n mutationType {\n name\n }\n subscriptionType {\n name\n }\n types {\n ...FullType\n }\n directives {\n name\n description\n locations\n args {\n ...InputValue\n }\n }\n }\n}\n\nfragment FullType on __Type {\n kind\n name\n description\n fields(includeDeprecated: true) {\n name\n description\n args {\n ...InputValue\n }\n type {\n ...TypeRef\n }\n isDeprecated\n deprecationReason\n }\n inputFields {\n ...InputValue\n }\n interfaces {\n ...TypeRef\n }\n enumValues(includeDeprecated: true) {\n name\n description\n isDeprecated\n deprecationReason\n }\n possibleTypes {\n ...TypeRef\n }\n}\n\nfragment InputValue on __InputValue {\n name\n description\n type {\n ...TypeRef\n }\n defaultValue\n}\n\nfragment TypeRef on __Type {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n }\n }\n }\n }\n }\n }\n }\n}\n"}' \
--compressed
スキーマを取得するのにこんなに長いクエリをいちいち書いてられないので、是非 get-graphql-schema
を使ってみてください。
Discussion