Python GraphQL API 调用组合

Nat*_*ate 2 python graphql

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

我正在尝试设置一个循环以使用分页获取所有信息,并且我的第一个请求工作正常。

values = """
      {"query" : "{organizations(ids:) {pipes {id name phases {id name cards_count cards(first:30){pageInfo{endCursor hasNextPage} edges {node {id title current_phase{name} assignees {name} due_date createdAt finished_at fields{name value filled_at updated_at} } } } } }}}"}
    """
Run Code Online (Sandbox Code Playgroud)

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

到目前为止,这就是我所拥有的......

values = """
      {"query" : "{phase(id: """ + phaseID+ """ ){id name cards_count cards(first:30, after:"""\" + pointer + "\"""){pageInfo{endCursor hasNextPage} edges {node {id title assignees {name} due_date createdAt finished_at fields{name value datetime_value updated_at phase_field { id label }  } } } } } }"}
        """ 
Run Code Online (Sandbox Code Playgroud)

第二个因为它循环只返回一个 400 错误的请求。

任何帮助将不胜感激。

Dav*_*aze 5

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

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

query = """
  query MoreCards($phase: ID!, $cursor: String) {
    phase(id: $phase) {
      id, name, cards_count
      cards(first: 30, after: $cursor) {
        ... CardConnectionData
      }
    }
  }
"""
Run Code Online (Sandbox Code Playgroud)

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

variables = {
  "phase": phaseID,
  "cursor": pointer
}
Run Code Online (Sandbox Code Playgroud)

实际的请求正文是一个简单的 JSON 结构。您也可以将其构建为字典:

body = {
  "query": query,
  "variables": variables
}
Run Code Online (Sandbox Code Playgroud)

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

print(json.dumps(body))
Run Code Online (Sandbox Code Playgroud)

或者将它传递给requests可以直接接受对象并为您编码的包之类的东西。