Преобразование CURL в python скрипт - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь преобразовать запрос Curl POST в python скрипт, и я не получаю желаемый вывод, пожалуйста, дайте мне знать, что я делаю не так здесь.

CURL request
 curl -s -w '%{time_starttransfer}\n' --request POST \
       --url http://localhost:81/kris/execute \
       --header 'content-type: application/json' \
       --data '{"command":["uptime"], "iplist":["10.0.0.1"], "sudo":true}'

Это выполняется команда uptime в узле, для которого предоставляется ip, и возвращает вывод JSON:

{"command":"uptime","output":["{\"body\":\" 17:30:06 up 60 days, 11:23,  1 user,  load average: 0.00, 0.01, 0.05\\n\",\"host\":\"10.0.0.1\"}"]}0.668894

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

Код:

import urllib3
import json

http = urllib3.PoolManager()

payload = '{"command":["uptime"], "iplist":["10.0.0.1"], "sudo":true}'
encoded_data = json.dumps(payload)

resp = http.request(
     'POST',
     'http://localhost:81/kris/execute ',
     body=encoded_data,
     headers={'Content-Type': 'application/json'})
print(resp)

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Это онлайн-утилита, которую вы можете использовать для преобразования запросов curl в python код.

Curl в python конвертер

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

Очень хорошая практика проверять, работают ли api-запросы, запустив curl в postman.

А для вашего случая вот код, использующий библиотеку запросов python.

    import requests

headers = {
    'content-type': 'application/json',
}

data = '{"command":["uptime"], "iplist":["10.0.0.1"], "sudo":true}'

response = requests.post('http://localhost:81/kris/execute', headers=headers, data=data)

Надеюсь, это поможет! Удачного кодирования!

1 голос
/ 19 апреля 2020

Я бы порекомендовал вам использовать библиотеку requests . Это более высокий уровень, чем urllib, и его проще использовать. (Список причин, по которым это замечательно, см. в этом ответе .)

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

import requests

payload = '{"command":["uptime"], "iplist":["10.0.0.1"], "sudo":true}'

resp = requests.post(
     'http://localhost:81/kris/execute',
     data=payload,
     headers={'Content-Type': 'application/json'})
print(resp.text)

Обратите внимание, что метод POST является функцией вместо параметра и использует именованный параметр data вместо body. Он также возвращает объект Response, поэтому вам необходимо получить доступ к его свойству text, чтобы получить фактическое содержимое ответа.


Кроме того, вам не нужно json.dumps ваша строка. Эта функция используется для преобразования Python объектов в JSON строки. Используемая вами строка уже действительна JSON, поэтому вам нужно просто отправить ее напрямую.

...