Создание мутации graphQL из моего кода Python, получение ошибки

Я пытаюсь внести изменения в свой магазин Shopify из python. Я новичок в graphQL, мне удалось сделать мутацию с помощью graphiQL, но я не уверен, как сделать это прямо из моего кода.

Это мой файл запроса make, он успешно работал с простым запросом

`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: '[email protected]', password: 'password'}) {userErrors { field message}customer{id}}}"

Но когда я передаю его в свою функцию make_query, он выдает эту ошибку

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

Как это исправить? Также одна из мутаций, которые я делаю, использует переменные, и я не смог найти пример того, как это сделать прямо из моего кода.


person Daniel Visca    schedule 08.02.2018    source источник
comment
Попробуйте использовать двойные кавычки () вместо одинарных кавычек для ваших строк, адреса электронной почты и пароля.   -  person Tal Z    schedule 09.02.2018
comment
Та же проблема. Запросы работают, но не мутации, и я попытался назвать мутацию и все еще ту же синтаксическую ошибку. Интересно, не делает ли библиотека запросов что-нибудь забавное со строкой, переданной как val.   -  person mjd2    schedule 27.04.2018


Ответы (2)


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}

Вы также можете использовать небольшую библиотеку, которая выглядит так:

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)
person Eradash    schedule 24.05.2018

Я отследил запрос на изменение через свой браузер и скопировал именно тот json, который был отправлен, удалив разрывы строк. В код я добавил {query: json}, и это сработало.

Пример Я использовал отправку 2 параметров и получение токена:

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