You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:33:36