如何使用 Python 获取 GraphQL 架构?

Posted

技术标签:

【中文标题】如何使用 Python 获取 GraphQL 架构?【英文标题】:How to get GraphQL schema with Python? 【发布时间】:2019-05-11 22:03:54 【问题描述】:

有很多 GUI 客户端,如 GraphQL Playground、GraphiQl 等,它们能够从 URL 获取 GraphQL 架构。如何使用 Python 获取架构?

【问题讨论】:

【参考方案1】:

来自规范:

GraphQL 服务器支持对其架构进行自省。该模式使用 GraphQL 本身进行查询,为工具构建创建了一个强大的平台......模式自省系统可从元字段 __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
                
              
            
          
        
      
    
  
"""

【讨论】:

非常感谢,此查询有效并返回所有字段!【参考方案2】:

graphql-core 具有实用程序来获取查询并转换查询结果。这是一个在 sdl 中打印结果模式的示例 sn-p:

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)

我一直在寻找相同的内容,最后找到了上述内容。

【讨论】:

这给了我以下错误:TypeError: execute() got an unexpected keyword argument 'operationName' 好的。只需从通话中取出“operationName=None”即可。它适用于“graphql.org/swapi-graphql”。它适用于 intro_result。但是下一行创建模式将失败,需要将“数据”元素替换为有效元素。环境:python 3.8、graphql-core 3.0.3、graphqlclient 0.2.4、urllib3 1.25.8。您可以从github.com/APIs-guru/graphql-apis 中选择一个公共 api 不允许获取方法。尝试了其他一些链接,每个链接都给出了不同的错误。不确定。

以上是关于如何使用 Python 获取 GraphQL 架构?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 GraphQLSchema javascript 对象获取 .graphql 文件?

如何使用 GraphQL POST 请求进行授权获取?

如何将graphql模式导入graphene-python程序?

AWS AppSync GraphQL - 如何使用 PK/SK 查询而不是扫描整个 dynamoDB 表以获取 graphql 列表 API

如何将 Graphql 查询转换为 python 字典?

Python - 如何从 GraphQL api 获取 JSON?