Python запрос генерирует 400 при обработке запросов Graphql с переменными - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь выполнить запросы graphql с помощью встроенного модуля запросов в Python.

# 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 $'...}. Запрос отлично работает, когда передается жестко закодированное значение, поэтому никаких проблем в самом запросе нет.

Пожалуйста, помогите мне понять причину проблемы или предложить альтернативы. Я просмотрел несколько ссылок, чтобы выяснить, как передавать переменные в запросе, но ни одна из них не работает.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Хорошо, наконец-то разобрался с проблемой. Кажется, что переменные должны быть сначала объявлены в запросе, а затем использованы в любом месте внутри запроса graphql. Это исправление:

    user_query = """
    >>>query($email: String!){<<<
      getUser(email: $email) {
        userId
        email
        firstName
        lastName
        phoneNumber
        department
        officeLocation
        isAvailable
        updatedAt
      }
    }
    """

Wi sh это было где-то лучше задокументировано.

0 голосов
/ 05 апреля 2020

Ну, если вы действительно считаете, что ваш параметр верен.

Есть два метода, которые вы можете попробовать (я не уверен, что это решит вашу проблему, но вы можете попробовать):

(старайтесь не использовать 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)

...