11

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: '[email protected]', 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

2
  • 1
    Try double quotes (") instead of single quotes for your strings, email and password. Commented Feb 9, 2018 at 7: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. Commented Apr 27, 2018 at 3:30

2 Answers 2

18

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 could also use a library such as python-graphql-client to make the same request:

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)
Sign up to request clarification or add additional context in comments.

2 Comments

what library is it?
@Ricky This answer features graphqlclient you can find it here: pypi.org/project/graphqlclient
2

I tracked the mutation request through my browser and copied exactly the json that was being sent, removing the line breaks. In the code I added { "query": json } and it worked

Example I used sending 2 parameters and receiving a token:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.