处理带有变量的 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查询响应与react-redux连接,得到ReferenceError:找不到变量