Python GraphQL API 调用组合

Posted

技术标签:

【中文标题】Python GraphQL API 调用组合【英文标题】:Python GraphQL API call composition 【发布时间】:2020-05-29 06:12:00 【问题描述】:

我最近开始学习如何使用 python,但我在调用 graphQL api 时遇到了一些问题。

我正在尝试设置一个循环来使用分页获取所有信息,我的第一个请求运行良好。

values = """
      "query" : "organizations(ids:) pipes id name phases id name cards_count cards(first:30)pageInfoendCursor hasNextPage edges node id title current_phasename assignees name due_date createdAt finished_at fieldsname value filled_at updated_at     "
    """

但是使用结束光标作为变量的第二次调用对我不起作用。我认为这是因为我不了解如何正确转义变量的字符串。但是对于我的一生,我无法理解应该如何去做。

这是我到目前为止所得到的......

values = """
      "query" : "phase(id: """ + phaseID+ """ )id name cards_count cards(first:30, after:"""\" + pointer + "\""")pageInfoendCursor hasNextPage edges node id title assignees name due_date createdAt finished_at fieldsname value datetime_value updated_at phase_field  id label        "
        """ 

第二个循环只会返回 400 错误请求。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我遇到过类似的情况,我必须通过从 GraphQL 端点分页来聚合数据。尝试上述解决方案对我来说效果不佳。

开始我的 graphql 标头配置是这样的:

 headers = 
        "Authorization":f"Bearer token",
        "Content-Type":"application/graphql"

对于我的查询字符串,我使用了带有变量占位符的三引号:

  user_query = 
   """
         
           user(
                limit:100,
                page:$page,
                sort:[field:"email",order:"ASC"]
            )
                list
                    email, 
                    count
                 
            
   """

基本上,我在这里为页面设置了循环:

for page in range(1, 9):
    formatted_query = user_query.replace("$page",f'page')
    response = requests.post(api_url, data=formatted_query, 
    headers=headers)
    status_code, json = response.status_code, response.json()

【讨论】:

【参考方案2】:

作为一般规则,您应该避免使用这样的字符串操作来构建查询。

在 GraphQL 查询本身中,GraphQL 允许 variables 可以作为查询中的占位符,用于稍后插入的值。您需要在查询顶部声明变量,然后可以在查询中的任何位置引用它们。没有 JSON 包装器的查询本身看起来像

query = """
  query MoreCards($phase: ID!, $cursor: String) 
    phase(id: $phase) 
      id, name, cards_count
      cards(first: 30, after: $cursor) 
        ... CardConnectionData
      
    
  
"""

要实际提供变量值,它们会作为普通字典传递

variables = 
  "phase": phaseID,
  "cursor": pointer

实际的请求正文是a straightforward JSON structure。您也可以将其构建为字典:

body = 
  "query": query,
  "variables": variables

现在您可以使用标准的json 模块将其格式化为字符串

print(json.dumps(body))

或将其传递给类似requests 的包,它可以直接接受对象并为您编码。

【讨论】:

啊,太好了,谢谢!由于我遇到的问题或我应该注意的其他原因,是否建议不要使用字符串操作? 如果您通过字符串连接构建查询,则可能发生诸如xkcd.com/327 之类的事件。那是 SQL,但同样的原则也适用于 GraphQL、XML、JSON……

以上是关于Python GraphQL API 调用组合的主要内容,如果未能解决你的问题,请参考以下文章

当 ref 随 vue 组合 api 发生变化时,如何触发 graphql 查询?

使用和组合另一个公共 apollo graphql api 的最佳方式:federation v 模式拼接

如何使用 Swagger\OpenAPI 记录 GraphQL?

无法在单个 GraphQL 查询中组合本地和远程数据(Next.js + Apollo)

如何调用graphql API

通过 GraphQL 应用从 REST api 调用返回的 cookie