7

I am trying to make a mutation to my Shopify store from python. I am new to graphQL, I have been able to make the mutation using graphiQL but I am not certain how to do it directly from my code.

This is my make query file, it has worked successfully for a simple query

`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))`

Now an example of the mutation that worked in graphiQL is this:

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

But when I pass it into my make_query function it gives this error

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

How do I fix this? Also one of the mutations I am making uses variables, and I haven't been able to find an example of how to do this directly from my code

Daniel Visca
  • 117
  • 1
  • 5
  • 1
    Try double quotes (") instead of single quotes for your strings, email and password. – Tal Z Feb 09 '18 at 07:50
  • Same issue. Queries work but not mutations and i've tried naming the mutation and still same syntax error. Wondering if the requests lib is doing something funny with the string passed as the val. – mjd2 Apr 27 '18 at 03:30

1 Answers1

12

GraphQl gives a way to send data in JSON. You can use variables in the query, and send the JSON object as the variable value:

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))

With the query looking like this:

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

You can also use a small library a just found to look like this:

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)
Eradash
  • 352
  • 6
  • 14