Преобразование почтового запроса httpie в библиотеку запросов python

У меня возникли трудности с преобразованием почтового запроса с использованием htppie в python request.post. Этот вопрос в целом о том, как сделать такое преобразование, но я буду использовать конкретный запрос, который я делал, в качестве примера.

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

http post https://api.thegraph.com/subgraphs/name/graphprotocol/graph-network-mainnet query='{ indexers {
                id
               }
}'

Однако при попытке отправить тот же запрос с использованием библиотеки запросов python я попробовал следующее:

import requests

url = 'https://api.thegraph.com/subgraphs/name/graphprotocol/graph-network-mainnet'

query = """'{ indexers {
                id
                }
}'"""

print(requests.post(url, data = query).text)

Это дает ошибку сервера (я пробовал много вариантов этого, а также отправлял словарь для переменной данных, и все они дают одну и ту же ошибку). Ошибка сервера: GraphQL server error (client error): expected value at line 1 column 1.

Независимо от того, какая ошибка сервера (которая, вероятно, зависит от сервера), это, по крайней мере, означает, что два запроса явно не совпадают.

Итак, как мне преобразовать этот запрос httpie в использование библиотеки запросов python (или любой другой библиотеки python, если на то пошло)?


person Jonathan Lindgren    schedule 08.03.2021    source источник
comment
Похоже, в вашем коде Python слишком много кавычек. Вы включаете литерал ' в свой запрос Python, который вы не включаете при запуске команды оболочки.   -  person larsks    schedule 09.03.2021
comment
мне нравится использовать инспектор запросов для сравнения вещей, например. requestbin.net сделать один запрос из httpie и другой из python и сравнить, затем исправить различия   -  person Macattack    schedule 09.03.2021


Ответы (1)


Чтобы передать полезную нагрузку запроса, вам нужно передать json как строку (я использовал json.dumps() для преобразования). Чтобы передать тело как данные формы, передайте просто dict.

import json
import requests

url = 'https://api.thegraph.com/subgraphs/name/graphprotocol/graph-network-mainnet'

payload=json.dumps({'query': '{indexers {id}}'})
headers = {
  'Content-Type': 'application/json',
}

response = requests.post(url, headers=headers, data=payload)

Примечание. Я рекомендую вам попробовать сделать этот запрос в Postman, а затем вы сможете преобразовать код в Python прямо в Postman.

person Dzianis Talkachou    schedule 08.03.2021
comment
В вашем случае вы можете пропустить раздел заголовков. - person Dzianis Talkachou; 09.03.2021