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
相关产品推荐
相关产品推荐

