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

使用requests发POST请求返回400错误但对应cURL可正常运行问题排查

问题根源

  • 核心原因:你手动指定了Content-Type: multipart/form-data请求头,但没有携带boundary分隔符参数。requests库只要检测到你传递了files参数,会自动生成带正确随机boundary值的multipart相关请求头,手动写死这个头会覆盖自动生成的内容,导致服务端收到请求后无法正确拆分表单字段,直接返回解析Body失败的400错误。你从Postman导出的代码也自带了手动写死的Content-Type头,这是Postman导出Python requests代码的已知问题,所以导出的代码也无法正常运行。
  • 次要冗余问题:第一个版本的代码中url已经携带了Key=123testkey查询参数,同时又传了params参数重复携带Key,属于无效冗余代码。
  • 早期配置问题:最初版本的files字段key用了image,而curl里对应的表单字段名是file,不过你后续已经修正了这个配置,不再是报错原因。

解决办法

直接删除headers里手动填写的Content-Type: multipart/form-data配置项,其他参数保持正确配置即可。

正确可运行代码

import requests

url = 'http://localhost:8080/api/predict'
headers = {
    'accept': 'application/json'
}
params = {'Key': '123testkey'}
files = {
    'file': ('156ac81cde4b3f22faa4055b53867f38.jpg', open('156ac81cde4b3f22faa4055b53867f38.jpg', 'rb'), 'image/jpeg')
}

response = requests.post(url, headers=headers, params=params, files=files)
print(response.text)

验证方式

请求发起后打印response.request.headers查看实际发出的请求头,会看到requests自动生成了类似Content-Type: multipart/form-data; boundary=239f8a79d2e74c01b7f182ab3e7c89d1的内容,其中boundary值是随机生成的,用来分隔请求体里的不同表单字段,服务端可以正常解析。

内容的提问来源于stack exchange,提问作者NominalSystems

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:39:00