将 CURL 转换为 python 脚本

Converting a CURL into python script

我正在尝试将 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}'

此 运行s 提供 ip 的节点中的正常运行时间命令和 returns 一个 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)

我建议您使用 requests library. It's higher level than urllib and simpler to use. (For a list of reasons why it's awesome, see this answer。)

此外,它只需要对您的代码进行少量更改即可工作:

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。它还 returns 一个 Response 对象,所以你必须访问它的 text 属性 才能获得实际的响应内容。


此外,您不需要 json.dumps 您的字符串。该函数用于将 Python 对象转换为 JSON 字符串。您使用的字符串已经有效 JSON,因此您应该直接发送它。

这是一个在线实用程序,您可以查看它以将 curl 请求转换为 python 代码。

Curl to python converter

另一种选择是 Postman 应用程序。在代码部分,您可以选择将 curls 转换为各种语言的代码。

通过 运行 postman 中的 curl 检查 api 请求是否工作是一个很好的做法。

对于您的情况,这里是使用 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)

希望对您有所帮助!编码愉快!