用Requests POST XML数据需设Content-Type为text/xml或application/xml,XML作为字符串或bytes传入data参数;禁用json参数;推荐三重引号写多行XML并声明UTF-8编码;注意格式合法与标签闭合。

用Requests库POST XML数据,核心是设置正确的请求头(Content-Type: text/xml 或 application/xml),并将XML内容作为字符串或字节传入data参数,不能用json参数。
准备XML数据
XML可以是字符串、bytes或文件读取的内容。推荐先构造好格式正确的XML,避免因语法错误导致服务端拒绝解析。
- 用三重引号写多行XML字符串,注意缩进不影响内容,但需确保标签闭合
- 若含中文或特殊字符,建议统一用UTF-8编码,并在XML声明中注明
<?xml version="1.0" encoding="UTF-8"?> - 避免手动拼接XML,复杂结构可用
xml.etree.ElementTree生成后转为字符串
设置Headers并发送POST请求
必须显式指定Content-Type为text/xml或application/xml,否则服务端可能无法识别XML体。
-
data参数接收字符串(自动编码为UTF-8)或bytes;传字符串时Requests默认按UTF-8编码 - 不要用
json=...——那是为JSON设计的,会自动加application/json头并序列化字典,不适用于XML - 如需认证,可添加
Authorization等其他header字段
处理响应与常见问题
成功发送后,检查response.status_code和response.text确认服务端是否正常接收并解析。
立即学习“Python免费学习笔记(深入)”;
- 返回400/415:大概率是
Content-Type没设对,或XML格式非法(如未闭合标签、编码声明与实际不符) - 返回200但内容异常:用
response.headers.get('Content-Type')确认响应类型,再检查response.text是否为预期的XML或错误提示 - 调试时可先用
print(xml_string.encode('utf-8'))确认发送内容,或用Wireshark/Fiddler抓包比对
完整示例代码
注意替换URL和实际XML内容:
import requests
xml_data = '''<?xml version="1.0" encoding="UTF-8"?>
<request>
<user id="123">
<name>张三</name>
<email>zs@example.com</email>
</user>
</request>'''
headers = {
'Content-Type': 'text/xml; charset=utf-8',
}
response = requests.post(
url='https://api.example.com/submit',
data=xml_data,
headers=headers,
timeout=10
)
print(response.status_code)
print(response.text)


















