如何将指定Curl REST请求转换为Python urllib2/requests实现?
当然可以!我来帮你把这个curl命令转换成正确的Python实现,不管是用urllib2还是更简洁的requests库都没问题。先梳理下原curl命令的核心要求:
- POST请求,自定义Content-Type为
application/knd.com.ns.systembackup+json - Basic认证(对应
--basic --user $uname:$pwd) - 请求体是单个JSON对象,不是数组
- 忽略SSL证书验证(对应
-k参数) - URL带查询参数
?action=create
你的原urllib2代码有几个需要调整的地方:比如data被定义成了列表(curl里是单个对象)、没有将数据序列化为JSON字符串并传入请求、缺少异常处理。下面是修正后的实现:
用urllib2实现
import urllib2 import json # 替换为你的实际参数 uname = "your_username" pwd = "your_password" ip = "your_server_ip" url = f'http://{ip}/nit/v1/config/systembackup?action=create' # 注意这里是字典,和curl的请求体完全匹配,不是列表 data = {"systembackup":{"filename":"test_backup","level":"basic"}} def encode_user_data(uname, pwd): # Python 2中Basic认证的编码方式,rstrip()去掉base64编码后的换行符 return "Basic " + (uname + ":" + pwd).encode("base64").rstrip() # 将字典序列化为JSON字符串 json_data = json.dumps(data) # 构建请求对象,传入序列化后的JSON数据 req = urllib2.Request(url, data=json_data) # 设置自定义的Content-Type,和curl一致 req.add_header("Content-type", "application/knd.com.ns.systembackup+json") # 添加Basic认证头 req.add_header('Authorization', encode_user_data(uname, pwd)) # 可选:如果服务端要求Accept头,保留这一行 req.add_header('Accept', 'application/json') try: # 若需要对应curl的-k参数(忽略SSL错误),需添加SSL上下文(Python 2.7.9+支持) # import ssl # context = ssl._create_unverified_context() # res = urllib2.urlopen(req, context=context) res = urllib2.urlopen(req) print(res.read()) except urllib2.HTTPError as e: print(f"HTTP错误:{e.code} - {e.read()}") except urllib2.URLError as e: print(f"连接错误:{e.reason}")
用requests实现(更简洁推荐)
requests库比urllib2更易用,能自动处理很多细节,比如认证、异常捕获,下面是匹配原curl的实现:
import requests import json # 替换为你的实际参数 uname = "your_username" pwd = "your_password" ip = "your_server_ip" url = f'http://{ip}/nit/v1/config/systembackup?action=create' data = {"systembackup":{"filename":"test_backup","level":"basic"}} json_data = json.dumps(data) headers = { # 必须设置和curl一致的自定义Content-Type "Content-type": "application/knd.com.ns.systembackup+json", "Accept": "application/json" # 可选,根据服务端需求调整 } try: response = requests.post( url, data=json_data, headers=headers, auth=(uname, pwd), # 自动处理Basic认证 verify=False # 对应curl的-k参数,忽略SSL证书验证 ) # 触发HTTP错误(比如4xx/5xx状态码) response.raise_for_status() print(response.text) except requests.exceptions.RequestException as e: print(f"请求失败:{e}")
关键说明
- 如果你用的是Python 3,
urllib2已经被拆分到urllib.request模块,代码需要做对应调整,推荐直接用requests库更省心 verify=False仅用于测试或内部环境,生产环境建议配置正确的SSL证书
内容的提问来源于stack exchange,提问作者Jacky
相关产品推荐
相关产品推荐

