获取GraphQL整个架构查询


72

我想从服务器获取架构。我可以获取具有类型的所有实体,但是无法获取属性。

获取所有类型:

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

如何获取类型的属性:

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

如何仅通过1个请求即可获得具有属性的所有类型?或更妙的是:我如何获得带有变异子,枚举,类型的整个架构...


我结束了使用来自“ graphql”的introspectionQuery;如底部所述。没关系。
亚历山德连科

Answers:


93

更新资料

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

有两种获取架构的方法。1)GraphQL IDL格式或2)JSON自省查询格式。

GraphQL IDL格式

get-graphql-schema ENDPOINT_URL > schema.graphql

JSON内省格式

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

要么

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

有关更多信息,您可以参考以下教程:如何下载GraphQL IDL模式


1
标记为解决方案的答案无法在我尝试使用的GraphQL服务器上实现,但是该库确实完成了生成完整模式所需的操作。可能应该将其标记为解决方案。
ml242

3
--json应该在>
konsumer '18

2
@Catharz:在任何地方都没有问题表明OP不想使用Node或JavaScript。此外,此答案不需要使用JavaScript;它提供了一个碰巧是JavaScript编写的命令行工具。
wchargin

1
我遵循了该步骤,graphql get-schema并且未写入schema.graphql文件。但是,它输出到屏幕。我不知道为什么
Tan Duong

如何将身份验证标头传递给 graphql get-schema
Luk Aron,

60

这是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
              }
            }
          }
        }
      }
    }
  }
}

Postwoman使用相同的查询,但是当您单击“获取模式”按钮时,UI仅显示相关类型。
Flogex

15

您可以使用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
                }
              }
            }
          }
        }
      }
    }
  }
`;

如果这看起来很复杂,那是因为可以将字段的任意性深深地包装在nonNulls和List中,这意味着从技术上讲,如果您的字段被包裹在7层以上,则即使是上面的查询也不能反映完整的架构(可能不是这种情况) )。

您可以在此处查看introspectionQuery的源代码。


这应该在顶部!
安迪·理查森

在较新的版本中,graphql该函数现在称为getIntrospectionQuery()
Luke


3

您可以使用IntelliJ插件,JS GraphQL然后IDEA会要求您创建两个文件“ 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
该插件的版本2即将发布(现在是beta版:github.com/jimkyndemeyer/js-graphql-intellij-plugin/releases/…)。代替graphql.config.json文件,而是.graphqlconfig文件。您必须将字段设置schemaPath为不存在的文件(下载架构后将自动创建)和urlGraphQL远程服务器。接下来,在“模式和项目结构”选项卡中(在“ GraphQL”选项卡中),双击所选的“端点”,然后单击“从端点(自省)获取GraphQL模式”。在前面提到的文件中将下载架构。
mkczyk


2

您可以使用以下命令下载远程GraphQL服务器的架构。命令执行成功后,您应该schema.json在当前工作目录中看到一个新文件。

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


2

请参阅https://stackoverflow.com/a/42010467/10189759

想要指出的是,如果需要身份验证,您可能不能仅使用从生成的配置文件 graphql init

您可能必须执行以下操作,例如,使用github graphql API

{
  "projects": {
    "graphqlProjectTestingGraphql": {
      "schemaPath": "schema.graphql",
      "extensions": {
        "endpoints": {
          "dev": {
            "url": "https://api.github.com/graphql",
            "headers": {
              "Authorization": "Bearer <Your token here>"
            }
          }
        }
      }
    }
  }
}

0

如果您想自己做,请阅读以下代码:

有一个模块化的最新工具“ graphql-cli”,请考虑一下。它使用包“ graphql”的buildClientSchema从自省数据构建IDL .graphql文件。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.