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

httpx库POST文件返回412错误,如何将正常工作的curl请求转换为正确的httpx调用?

httpx库POST文件返回412错误,如何将正常工作的curl请求转换为正确的httpx调用?

我帮你分析一下问题所在,你的Python脚本和curl请求之间有几个关键差异,导致了412预条件失败的响应:

1. 手动设置Content-Type头导致解析错误

当使用httpx发送包含files的请求时,完全不需要手动指定Content-Type: multipart/form-data。httpx会自动生成这个请求头,并且会添加必要的boundary参数(用于分隔multipart表单里的各个字段)。如果手动设置这个头,会覆盖httpx自动生成的带boundary的版本,导致服务端无法正确解析你的表单数据。

2. 布尔值参数的序列化差异

你的Python代码里notify的值是布尔类型False,httpx会把它序列化为首字母大写的字符串"False";但在curl请求中你传递的是小写的"false"。很多API对这类参数的大小写敏感,会把"False"判定为无效值。

3. 确认请求URL是否一致

另外注意到你的Python脚本中的请求URL是https://some.api.domain/Api/1/documents/mandant,而curl命令里的URL是http://www.some.domain/,这大概率是示例笔误,请务必确保两者的请求地址完全一致,否则也会引发参数不匹配的问题。


修改后的Python脚本

#!/usr/bin/python3
import httpx

files = {'file': ('Test.pdf', open('Test.pdf', 'rb'), 'application/pdf')}

# 请确认此处URL和curl中的请求地址完全一致
url='https://some.api.domain/Api/1/documents/mandant'
headers= {
        'accept': 'application/json',
        'APPLICATION-ID': '42fxxxxxxx',
        'USER-TOKEN': '167axxxxx',
        # 移除手动设置的Content-Type头
        }
data={
        'year': 2024,
        'month': 1,
        'folder': 3,
        'notify': 'false'  # 改为字符串小写的"false",和curl保持一致
        }

response = httpx.post(url, headers=headers, data=data, files=files)
print(response.status_code)
print(response.text)  # 可以打印响应内容,帮助排查剩余潜在问题

额外调试建议

如果修改后还是有问题,可以开启httpx的调试日志,查看发送的实际请求内容,和curl的请求详情做对比:

import logging
logging.basicConfig(level=logging.DEBUG)
# 之后再发送请求,会打印出详细的请求头和表单数据

这样调整后,你的请求行为就会和curl完全一致,应该能得到200的成功响应。

备注:内容来源于stack exchange,提问作者Christian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 08:44:34