webdav put 上传 xml 文件必须显式设置 content-type 为 text/xml 或 application/xml,否则服务端返回 415 错误;需用 utf-8 编码读取并转 bytes 传入 data,url 要完整且路径编码,认证用 basic,xml 需无 bom、顶格声明、正确转义。

WebDAV PUT 上传 XML 文件必须设对 Content-Type
requests 默认不发 Content-Type,但多数 WebDAV 服务(如 Nextcloud、OwnCloud、Apache mod_dav)会拒收没带 Content-Type: text/xml 或 application/xml 的 PUT 请求,返回 415 Unsupported Media Type 或静默失败。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 显式传
headers={'Content-Type': 'text/xml'},别依赖 requests 自动推断 - 如果 XML 含中文或特殊字符,用
encoding='utf-8'读取后转 bytes,再传给data=,避免 requests 自行编码出错 - 不要用
json=或files=——WebDAV PUT 不走表单,只认原始 body
requests.put() 的 auth 和 URL 要严格匹配 WebDAV 服务规则
常见错误是 URL 少了末尾斜杠、路径没 URL 编码,或认证方式错配(比如服务要求 Basic,却传了 Bearer Token)。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- URL 必须包含完整路径,例如
https://dav.example.com/remote.php/dav/files/user/folder/data.xml,注意大小写和斜杠 - 路径中含空格或中文时,用
urllib.parse.quote()处理文件名部分,不要手动改 - Basic 认证最通用:
auth=('username', 'app-password');若用 App Password(如 Nextcloud),不能填网页登录密码 - 某些服务(如自建 Apache)可能需额外 header:
headers['Depth'] = '0'
XML 内容本身引发 400 或 409 错误的典型原因
上传成功但返回 400 Bad Request 或 409 Conflict,往往不是网络或认证问题,而是 XML 格式触犯了服务端校验。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 确保 XML 声明顶格且无 BOM:
<?xml version="1.0" encoding="UTF-8"?>,开头不能有空格或空行 - 避免非法字符:如未转义的
&、、<code>]等,用xml.etree.ElementTree构建比手拼更安全 - 部分服务禁止外部 DTD 或实体引用,上传前删掉
/code> 或设 <code>parser = XMLParser(resolve_entities=False) - 检查目标路径是否已存在同名文件且被锁定(
409常见于此)
调试时别只看 status_code,要读 response.text 和 headers
WebDAV 错误响应常把真实原因藏在 body 或自定义 header 里,比如 X-OCS-RequestId 或 response.headers.get('X-WebDAV-Error')。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 始终打印
r.status_code和r.text[:200],哪怕返回 200/201——有些服务“成功”却写入空文件 - 加
timeout=(3, 30)防卡死,WebDAV 上传大 XML 时容易因服务端超时断连 - 小文件先试
curl -X PUT --data-binary @file.xml -H "Content-Type: text/xml" -u user:pass URL,确认服务本身没问题再切 Python










