如何用Python获取GraphQL schema?

whitzsjs  于 2023-10-21  发布在  Python
关注(0)|答案(5)|浏览(168)

有很多GUI客户端,如GraphQL Playground,GraphiQl等。可以从URL中获取GraphQL schema。如何使用Python获取schema?

bsxbgnwa

bsxbgnwa1#

从spec:
GraphQL服务器支持对其模式的内省。这个模式是使用GraphQL本身查询的,为工具构建创建了一个强大的平台。模式自省系统可以从Meta字段__schema和__type访问,这两个字段可以从查询操作的根的类型访问。
像GraphQL Playground和GraphiQL这样的工具利用内省来获取有关模式的信息。您不需要任何额外的工具或库来进行内省查询-因为它只是一个GraphQL查询,您将以向端点发出任何其他请求的方式发出请求(例如使用requests)。
下面是来自graphql-core的一个完整的内省查询:

introspection_query = """
  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
                }
              }
            }
          }
        }
      }
    }
  }
"""
kmpatx3s

kmpatx3s2#

graphql-core有一些实用程序可以获取查询并转换查询结果。下面是一个在sdl中打印结果模式的示例代码片段:

from graphqlclient import GraphQLClient
from pprint import PrettyPrinter
from graphql import get_introspection_query, build_client_schema, print_schema

def main():
    pp = PrettyPrinter(indent=4)
    client = GraphQLClient('http://swapi.graph.cool/')
    query_intros = get_introspection_query(descriptions=True)
    intros_result = client.execute(query_intros, variables=None, operationName=None)
    client_schema = build_client_schema(intros_result.get('data', None))
    sdl = print_schema(client_schema)
    print(sdl)
    pp.pprint(sdl)

我一直在寻找同样的东西,最后找到了上面的东西。

c0vxltue

c0vxltue3#

这将创建一个包含您的schema的json文件。

import json

introspection_dict = your_schema_object.introspect()

# Or save the schema into some file
with open("schema.json", "w") as fp:
    json.dump(introspection_dict, fp)
1u4esq0p

1u4esq0p4#

你可以使用sqglc library,内省模块。

1.创建json模式文件:

python3 -m sgqlc.introspection --exclude-deprecated --include-description ****-H "Authorization: Bearer {TOKEN}" http://yourgrapqlservice.com schema.json

--exclude-deprecated如果给定,将排除已弃用的字段和枚举值。
默认值:False
--exclude-description如果给出,将排除描述(文档)。

2.如果需要,将schema转换为.py格式:

sgqlc-codegen schema schema1.json schema.py
pu3pd22g

pu3pd22g5#

我遇到了同样的问题,直到我在python graphql repo中找到了答案,你可以使用这个代码片段示例来获取模式并将其保存在.json文件中

async def get_graphql_schema(endpoint, api_key):
    headers = {"X-API-KEY": api_key}
    transport = AIOHTTPTransport(url=endpoint, headers=headers)
    async with Client(transport=transport, fetch_schema_from_transport=True) as session:
        query_intros = get_introspection_query(descriptions=True)
        query = gql(query_intros)
        intros_result = await session.execute(query)
        schema = build_client_schema(intros_result)
        return schema

def save_schema_to_json(schema):
    schema_dict = introspection_from_schema(schema)
    output_file = 'schema.json'
    with open(output_file, 'w') as json_file:
        dump(schema_dict, json_file, indent=2)

schema = asyncio.run(get_graphql_schema(env_dev['url'], env_dev['key']))
save_schema_to_json(schema)

你要找的是introspection_from_schema(),我在源代码中引用了它的文档:
从GraphQLSchema构建IntrospectionQuery
IntrospectionQuery对于关心类型和字段关系但不需要遍历这些关系的实用程序很有用。
这与build_client_schema相反。主要用例在服务器上下文之外,例如在进行模式比较时。

相关问题