Python Проблема с запросом GraphQL - PullRequest
2 голосов
/ 04 февраля 2020

Я использую Python для отправки запросов в Pipefy GraphQL API. Я уже прочитал документацию и выполнил поиск на форуме pipefy, но я не мог понять, что не так с запросом ниже:

pipeId = '171258'
query ="""
        {
            "query": "{allCards(pipeId: %s, first: 30, after: 'WyIxLjAiLCI1ODAuMCIsMzI0OTU0NF0'){pageInfo{endCursor hasNextPage}edges{node{id title}}}}"
        }
        """%(pipeid)

Запрос работал довольно хорошо, пока я не добавил параметр after. Я уже пробовал варианты, такие как:

after: "WyIxLjAiLCI1ODAuMCIsMzI0OTU0NF0"

after: \"WyIxLjAiLCI1ODAuMCIsMzI0OTU0NF0\"

after: \n"WyIxLjAiLCI1ODAuMCIsMzI0OTU0NF0\n"

Я знаю, что проблема связана с побегом, потому что возвращаемые сообщения API выглядят следующим образом:

'{"errors":[{"locations":[{"column":45,"line":1}],"message":"token recognition error at: \'\'\'"},{"locations":[{"column":77,"line":1}],"message":"token recognition error at: \'\'\'"}]}\n'

(это сообщение возвращается, когда запрос сделан с помощью after: 'WyIxLjAiLCI1ODAuMCIsMzI0OTU0NF0')

Любая помощь здесь будет очень полезной! Спасибо

Ответы [ 3 ]

1 голос
/ 10 февраля 2020

С помощью приведенного ниже фрагмента кода вы можете вызвать функцию get_card_list, передав токен аутентификации (как String) и pipe_id (как целое число), и получить весь список карт вашего канала.

Функция get_card_list будет вызывать функцию request_card_list, пока для страницы hasNextpage не будет задано значение False, обновляя курсор при каждом вызове.

# Function responsible to get cards from a pipe using Pipefy's GraphQL API
def request_card_list(auth_token, pipe_id, hasNextPage=False, endCursor=""):    
    url = "https://api.pipefy.com/graphql"
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer %s' %auth_token
    }
    if not hasNextPage:
        payload = '{"query": "{ allCards(pipeId: %i, first: 50) { edges { node { id title  phases_history { phase { name } firstTimeIn lastTimeOut } } cursor } pageInfo { endCursor hasNextPage } } }"}' %pipe_id
    else:
        payload = '{"query": "{ allCards(pipeId: %i, first: 50, after: \\"%s\\") { edges { node { id title  phases_history { phase { name } firstTimeIn lastTimeOut } } cursor } pageInfo { endCursor hasNextPage } } }"}' % (pipe_id, endCursor)

    response = requests.request("POST", url, data=payload, headers=headers)
    response_body = response.text
    response_body_dict = json.loads(response_body)
    response_dict_list = response_body_dict['data']['allCards']['edges']

    card_list = []
    for d in response_dict_list:
        for h in d['node']['phases_history']:
            h['firstTimeIn'] = datetime.strptime(h['firstTimeIn'], date_format)
            if h['lastTimeOut']:
                h['lastTimeOut'] = datetime.strptime(h['lastTimeOut'], date_format)
        card_list.append(d['node'])

    return_list = [card_list, response_body_dict['data']['allCards']['pageInfo']['hasNextPage'], response_body_dict['data']['allCards']['pageInfo']['endCursor']]
    return return_list

# Function responsible to get all cards from a pipe using Pipefy's GraphQL API and pagination
def get_card_list(auth_token, pipe_id):
    card_list = []
    response = request_card_list(auth_token, pipe_id)
    card_list = card_list + response[0]

    while response[1]:
        response = request_card_list(auth_token, pipe_id, response[1], response[2])
        card_list = card_list + response[0]

    return(card_list)
1 голос
/ 06 февраля 2020

У меня была та же проблема, что и у вас сегодня (и я увидел ваш пост на странице поддержки Pipefy). Я лично вступил в контакт с разработчиками Pipefy, но они не помогли вообще.

Я решил это, правильно обработав запрос.

Попробуйте так:

query = '{"query": "{ allCards(pipeId: %s, first: 30, after: \\"WyIxLjAiLCI1ODAuMCIsMzI0OTU0NF0\\"){ pageInfo{endCursor hasNextPage } edges { node { id title } } } }"}'

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

0 голосов
/ 10 февраля 2020

Спасибо за ответ Лоди, я смог сделать следующий шаг. Как использовать переменную для передачи параметра "after" для запроса Поскольку это было довольно сложно, я решил поделиться этим здесь для тех, кто столкнулся с той же проблемой.

end_cursor = 'WyIxLjAiLCI2NTcuMCIsNDgwNDA2OV0'
end_cursor = "\\" + "\"" + end_cursor  + "\\" + "\""
# desired output: end_cursor = '\"WyIxLjAiLCI2NTcuMCIsNDgwNDA2OV0\"'
query ="""
       {
        "query": "{allCards(pipeId: %s, first: 50, after: %s){pageInfo{endCursor hasNextPage}edges{node{id title}}}}"
        }
       """%(pipeid, end_cursor)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...