项目场景
一个基于tomcat的应用,提供了文件上传接口,通过Python程序调用上传文件接口,应用日志报错:
Failed to parse multipart servlet request
Invalid chunk header
No data available due to previous error
问题分析
看报错,都是提示请求体错误,所以我通过添加代码的方式挂了个BP代理:
//代理设置,先通过本地的8080端口,同时bp监听本地8080
fiddler_proxies = {'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}
//请求中添加proxies=fiddler_proxies
response = requests.post(url=url, headers=self.headers, files=files, proxies=fiddler_proxies)
但添加代理后,可正常发起请求;关闭代理后,无法正常发起请求;同时看代理抓取的请求头和请求体均正常。
故决定代码中同时将self.headers(请求头)给打印出来。
对照后发现,发送的请求头多了一个Transfer-Encoding: chunked
经查询,使用requests发起请求时不需要这个请求头,考虑是请求头异常,导致tomcat无法正常解析,故停止接收获取请求体,产生文件内容异常的报错,而通过代理时,包先在windows系统停留,对请求头进行了纠正,所以可以正常发起请求
解决方案
代码中注释掉Transfer-Encoding: chunked
请求体即可,若是其它报错,建议参照接口文档。