代码之家  ›  专栏  ›  技术社区  ›  Daniel Visca

从python代码中进行graphQL变异,得到错误

  •  8
  • Daniel Visca  · 技术社区  · 7 年前

    我正在尝试从python对我的Shopify商店进行修改。 我是graphQL新手,我已经能够使用graphiQL进行变异,但我不确定如何直接从代码中进行变异。

    这是我的生成查询文件,它已成功用于简单查询

    `import requests 
     def make_query(self, query, url, headers):
        """
        Return query response
        """
        request = requests.post(url, json={'query': query}, headers=headers)
        if request.status_code == 200:
            return request.json()
        else:
            raise Exception("Query failed to run by returning code of {}. {}".format(request.status_code, query))`
    

    现在,在graphiQL中起作用的突变示例如下:

    "mutation {customerCreate(input: {email: 'wamblamkazam@send22u.info', password: 'password'}) {userErrors { field message}customer{id}}}"

    但当我将其传递到make\u查询函数时,它会给出以下错误

    {'errors': [{'message': 'Parse error on "\'" (error) at [1, 41]', 'locations': [{'line': 1, 'column': 41}]}]}
    

    如何修复此问题? 另外,我正在进行的一个突变使用变量,我还无法从我的代码中找到如何直接实现这一点的示例

    2 回复  |  直到 7 年前
        1
  •  15
  •   UrbanConor elpddev    3 年前

    GraphQl提供了一种用JSON发送数据的方法。您可以在查询中使用变量,并将JSON对象作为变量值发送:

    def make_query(self, query, variables, url, headers):
        """
        Make query response
        """
        request = request.post(url, json={'query': query, 'variables': variables}, headers=headers)
        if request.status_code == 200:
            return request.json()
        else:
            raise Exception("Query failed to run by returning code of {}. {}".format(request.status_code, query))
    

    查询如下所示:

    query = """
        mutation CreateCustomer($input:CustomerInput){
            customerCreate(customerData: $input){
                customer{
                    name
                }
            }
        }
    """
    variables = {'input': customer}
    

    您还可以使用库,例如 python-graphql-client 要提出相同的请求,请执行以下操作:

    client = GraphQLClient('http://127.0.0.1:5000/graphql')
    
    query = """
    mutation CreateCustomer($input:CustomerInput){
        customerCreate(customerData: $input){
            customer{
                name
            }
        }
    }
    """
    
    variables = {'input': customer}
    
    client.execute(query, variables)
    
        2
  •  2
  •   Mithsew    3 年前

    我通过浏览器跟踪了变异请求,并准确复制了发送的json,去掉了换行符。在代码中,我添加了{“query”:json},它起了作用

    示例我使用发送2个参数和接收令牌:

    mutation = """mutation {  
        login(    username: "myusername",    password: "mypassword",  ) 
            {   
                token 
            }
        }"""
        
    res = requests.post(url, json={"query": mutation} )