web-dev-qa-db-ja.com

GraphQLスキーマ全体のクエリを取得する

サーバーからスキーマを取得したい。タイプを持つすべてのエンティティを取得できますが、プロパティを取得できません。

すべてのタイプを取得する:

query {
  __schema {
    queryType {
      fields {
        name
        type {
          kind
          ofType {
            kind
            name
          }
        }
      }
    }
  }
}

タイプのプロパティを取得する方法:

__type(name: "Person") {
    kind
    name
    fields {
      name
      type {
        kind
        name
        description
      }
    }
  }

1つのリクエストでプロパティを持つすべてのタイプを取得するにはどうすればよいですか?またはもっと良い方法:ミューテーター、列挙、型でスキーマ全体を取得するにはどうすればよいですか...

47
Aleksandrenko

更新

graphql-cli を使用することが、スキーマを取得および更新するための推奨ワークフローです。

次のコマンドを使用すると、開始できます。

# install via NPM
npm install -g graphql-cli

# Setup your .graphqlconfig file (configure endpoints + schema path)
graphql init

# Download the schema from the server
graphql get-schema

次のコマンドを実行して、スキーマの変更をリッスンし、スキーマを継続的に更新することもできます。

graphql get-schema --watch

GraphQLスキーマをダウンロードするだけの場合は、次のアプローチを使用します。

GraphQLスキーマを取得する最も簡単な方法は、CLIツール get-graphql-schema を使用することです。

NPM経由でインストールできます。

npm install -g get-graphql-schema

スキーマを取得するには2つの方法があります。 1) GraphQL IDL formatまたは2)JSONイントロスペクションクエリ形式。

GraphQL IDL形式

get-graphql-schema ENDPOINT_URL > schema.graphql

JSONイントロスペクション形式

get-graphql-schema --json ENDPOINT_URL > schema.json

または

get-graphql-schema -j ENDPOINT_URL > schema.json

詳細については、次のチュートリアルを参照できます。 GraphQL IDLスキーマのダウンロード方法

67
schickling

これは GraphiQL が使用するクエリです(ネットワークキャプチャ):

query IntrospectionQuery {
  __schema {
    queryType {
      name
    }
    mutationType {
      name
    }
    subscriptionType {
      name
    }
    types {
      ...FullType
    }
    directives {
      name
      description
      locations
      args {
        ...InputValue
      }
    }
  }
}

fragment FullType on __Type {
  kind
  name
  description
  fields(includeDeprecated: true) {
    name
    description
    args {
      ...InputValue
    }
    type {
      ...TypeRef
    }
    isDeprecated
    deprecationReason
  }
  inputFields {
    ...InputValue
  }
  interfaces {
    ...TypeRef
  }
  enumValues(includeDeprecated: true) {
    name
    description
    isDeprecated
    deprecationReason
  }
  possibleTypes {
    ...TypeRef
  }
}

fragment InputValue on __InputValue {
  name
  description
  type {
    ...TypeRef
  }
  defaultValue
}

fragment TypeRef on __Type {
  kind
  name
  ofType {
    kind
    name
    ofType {
      kind
      name
      ofType {
        kind
        name
        ofType {
          kind
          name
          ofType {
            kind
            name
            ofType {
              kind
              name
              ofType {
                kind
                name
              }
            }
          }
        }
      }
    }
  }
}
31
James Carnegie

GraphQL-JSのイントロスペクションクエリを使用して、スキーマに関するすべての情報を取得できます。

import { introspectionQuery } from 'graphql';

タイプの情報だけが必要な場合は、これを使用できます。

{
    __schema: {
        types: {
            ...fullType
        }
    }
}

イントロスペクションクエリからの次のフラグメントを使用します。

fragment FullType on __Type {
    kind
    name
    description
    fields(includeDeprecated: true) {
      name
      description
      args {
        ...InputValue
      }
      type {
        ...TypeRef
      }
      isDeprecated
      deprecationReason
    }
    inputFields {
      ...InputValue
    }
    interfaces {
      ...TypeRef
    }
    enumValues(includeDeprecated: true) {
      name
      description
      isDeprecated
      deprecationReason
    }
    possibleTypes {
      ...TypeRef
    }
  }
  fragment InputValue on __InputValue {
    name
    description
    type { ...TypeRef }
    defaultValue
  }
  fragment TypeRef on __Type {
    kind
    name
    ofType {
      kind
      name
      ofType {
        kind
        name
        ofType {
          kind
          name
          ofType {
            kind
            name
            ofType {
              kind
              name
              ofType {
                kind
                name
                ofType {
                  kind
                  name
                }
              }
            }
          }
        }
      }
    }
  }
`;

それが複雑に思えるのは、フィールドが非Nullとリストに深くwrapped意的に包まれている可能性があるためです)。

IntrospectionQuery here のソースコードを確認できます。

10
helfer

apollo cli を使用

apollo schema:download --endpoint=http://localhost:4000/graphql schema.json
3
has19

IntelliJプラグインJS GraphQLを使用すると、IDEAは2つのファイル「graphql.config.json」と「graphql.schema.json」の作成を要求します。

次に、「graphql.config.json」を編集して、ローカルまたはリモートのGraphQLサーバーを指すようにします。

"schema": {
"README_request" : "To request the schema from a url instead, remove the 'file' JSON property above (and optionally delete the default graphql.schema.json file).",
"request": {
  "url" : "http://localhost:4000",
  "method" : "POST",
  "README_postIntrospectionQuery" : "Whether to POST an introspectionQuery to the url. If the url always returns the schema JSON, set to false and consider using GET",
  "postIntrospectionQuery" : true,
  "README_options" : "See the 'Options' section at https://github.com/then/then-request",
  "options" : {
    "headers": {
      "user-agent" : "JS GraphQL"
    }
  }
}

その後、IDEAプラグインは、GraphQLサーバーからスキーマを自動的にロードし、次のようにコンソールにスキーマjsonを表示します。

Loaded schema from 'http://localhost:4000': {"data":{"__schema":{"queryType":{"name":"Query"},"mutationType":{"name":"Mutation"},"subscriptionType":null,"types":[{"kind":"OBJECT","name":"Query","description":"","fields":[{"name":"launche
2
sendon1982

自分でやりたい場合は、次のコードを読んでください。

モジュール式の最先端ツール「graphql-cli」がありますので、ご覧ください。パッケージ「graphql」のbuildClientSchemaを使用して、イントロスペクションデータからIDL .graphqlファイルを構築します。

0
林东吴

apollo codegen:clientを使用できます。 https://github.com/apollographql/apollo-tooling#apollo-clientcodegen-output を参照してください

0
Klas Mellbourn

次のコマンドを使用して、リモートGraphQLサーバーのスキーマをダウンロードできます。コマンドが成功すると、現在の作業ディレクトリにschema.jsonという名前の新しいファイルが表示されます。

~$ npx apollo-cli download-schema $GRAPHQL_URL --output schema.json

0
Wil Moore III