处理带有变量的 Graphql 查询时,Python 请求抛出 400

Posted

技术标签:

【中文标题】处理带有变量的 Graphql 查询时,Python 请求抛出 400【英文标题】:Python request throws 400 when handling Graphql queries with variables 【发布时间】:2020-07-16 17:47:21 【问题描述】:

我正在尝试使用 Python 中的内置请求模块来运行 graphql 查询。

# prepare the query with parameters
def get_user(by):
    try:
        variables = 
            "email": "test@test.com"
        

        user_query = """
        
          getUser($email:String) 
            userId
            email
            firstName
            lastName
            phoneNumber
            department
            officeLocation
            isAvailable
            updatedAt
          
        
        """

        path = resolve_url('users', site_id='hub')

        # Run gql query
        user_data = run_query(user_query, variables=variables, path=path, by=by)

        return user_data
    except Exception as ex:
        raise exc.BadRequest(
            'Could not parse the response. Following exception occurred :: '.format(ex)
        )

客户端运行 gql 查询

def run_query(query: str, variables: dict, path: str, by=None):
    token = 'some-token'

    headers = 'x-internal-api-key': 'Bearer '.format(token)

    json = dict('query': query)
    if variables:
        json['variables'] = variables

    response = requests.post(path, json=json, headers=headers) # Throws 400

    if response.status_code == 200:
        return response.json()
    else:
        raise Exception("Query failed to run:  - ".format(response.status_code, response.json()))

这会抛出400 - 'message': 'Syntax Error: Expected Name, found $'...。传递硬编码值时,查询工作得非常好,因此查询本身没有问题。

请帮助我了解问题所在或提出替代方案。我已经通过多个链接来弄清楚如何在查询中传递变量,但似乎没有一个有效。

【问题讨论】:

你的requests参数好像不对。 你为什么这么认为?你能再解释一下吗? 【参考方案1】:

好的,终于解决了问题。似乎必须先向查询声明变量,然后在 graphql 查询中的任何地方使用。这是修复:

    user_query = """
    >>>query($email: String!)<<<
      getUser(email: $email) 
        userId
        email
        firstName
        lastName
        phoneNumber
        department
        officeLocation
        isAvailable
        updatedAt
      
    
    """

希望它在某个地方有更好的记录。

【讨论】:

【参考方案2】:

好吧,如果你真的认为你的参数是对的。

您可以尝试两种方法(我不确定它是否能解决您的问题,但您可以尝试):

(尽量不要使用json作为变量,因为它与json模块同名) 更改您的发布代码:

json = dict('query': query)
response = requests.post(path, json=json, headers=headers)

到:

params = 'query':'''
  viewer 
     name
  
'''

response = requests.get(path,params=params)

可能是因为查询是get方法而不是post方法。(如果不是,你可以试试post

【讨论】:

好的,我做到了。我还在有效负载中添加了变量,因此有效负载看起来:payload = 'query': query, 'variables': variables 它仍然会引发相同的错误。如果我从查询和有效负载中删除变量,它会照常工作。 @saran3h 仔细看,你在代码中使用data而不是json吗? @saran3h 好的,我正在编辑我的帖子。尝试使用新方法。 hmmm..奇怪的是它的工作原理。当我用 Postman/insomnia 达到 gql 端点时,我使用 POST 并且它可以工作。无论如何,我的问题是如何在查询中包含变量?我可以通过删除 $email 变量来很好地运行我的查询,而无需更改给定示例中的任何内容。 @saran3h 抱歉,我不太了解 gql。我只是尽力帮助您...

以上是关于处理带有变量的 Graphql 查询时,Python 请求抛出 400的主要内容,如果未能解决你的问题,请参考以下文章

如何获取带有变量的graphql查询标签的打字稿定义?

带有错误“无法查询字段”的 Graphql 内容查询

GraphQL java:当请求有未使用的变量时抛出异常

将graphql查询响应与react-redux连接,得到ReferenceError:找不到变量

使用 Mock Service Worker 时如何对 graphql 查询变量进行断言?

如何从另一个 React / ReactNative 组件触发 GraphQL 查询