Как мне разрешить передачу параметров функции в запрос cURL с использованием запросов в Python

#python #curl #python-requests #rpc #bitcoin

#python #curl #python-запросы #rpc #биткойн

Вопрос:

Я пытаюсь преобразовать биткойн-вызовы RPC в функции для использования в python, некоторые вызовы API RPC имеют такие параметры, как высота блока для команды getblockhash.

У меня есть функция, которая работает и возвращает блок генезиса, передавая [0] в ключевое слово params:

 def getblockhash():
    headers = {
        'content-type': 'text/plain;',
    }
    data = '{"jsonrpc": "1.0", "id":"curltest", "method": "getblockhash", "params": [0]}'
    response = requests.post('http://127.0.0.1:8332/', headers=headers, data=data,
                             auth=(USERNAME, PASSWORD))
    response = response.json()
    return response
 

Я получаю такой ответ:

{‘результат’: ‘000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f’, ‘ошибка’: Нет, ‘идентификатор’: ‘curltest’}

Я хочу иметь возможность передавать переменную в это место вместо ее жесткого кодирования, например:

 def getblockhash(height):
    headers = {
        'content-type': 'text/plain;',
    }
    data = {"jsonrpc": "1.0", "id":"curltest", "method": "getblockhash", "params": [height]}
    data = str(data)
    response = requests.post('http://127.0.0.1:8332/', headers=headers, data=data,
                             auth=(USERNAME, PASSWORD))
    response = response.json()
    return response
 

Я получаю этот результат:

«{‘результат’: нет, ‘ошибка’: {‘код’: -32700, ‘сообщение’: ‘Ошибка синтаксического анализа’}, ‘идентификатор’: нет}»

Я пробовал тестировать различные вещи и обнаружил, что ошибка появляется при добавлении

data = str(данные)

Итак, как я могу передать параметр функции в это без получения ошибки синтаксического анализа?

Комментарии:

1. По какой-либо причине вы предпочитаете не использовать существующий модуль json-rpc?

Ответ №1:

Вы непосредственно отправляете строковое представление словаря на сервер. Однако строковое представление словаря не является допустимым JSON. Пример:

 >>> example = {"hello": "world"}
>>> str(example)
"{'hello': 'world'}"
 

Обратите внимание, что ключ и значение в строковом представлении заключены в одинарные кавычки. Однако JSON требует, чтобы строки были заключены в двойные кавычки.

Возможные решения: используйте json kwarg вместо data того, чтобы разрешать requests преобразовывать словарь в действительный JSON, вручную преобразуйте словарь в данные JSON с помощью json модуля или (как предлагает jordanm в своем комментарии) используйте модуль JSON-RPC.

Комментарии:

1. Спасибо за помощь, я смог заставить его работать, импортировав JSON и используя data = json.dumps(данные)