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

