Python requests.post调用始终返回400 Bad Request但Postman可正常请求
问题排查与解决方案
1. 基础参数校验
- 打印拼接后的
url变量,确认和Postman中请求的目标URL完全一致,避免base_url末尾多斜杠导致拼接出//screenshot这类错误路径。 - 确认Postman中上传文件的字段名、普通参数名是否和代码完全一致,注意大小写敏感,比如如果服务端要求文件字段是
image而非imagefile,会直接返回400。 - 检查
date参数的格式是否符合服务端要求,比如是时间戳、yyyy-mm-dd还是其他格式,将Postman中的参数值和代码中date变量的输出做对比校验,确认完全一致。
2. 修复文件读取逻辑
当前代码未显式关闭打开的文件句柄,在Mac系统下可能出现文件占用导致读取内容异常,修改为上下文管理器方式读取文件,同时校验文件格式:
token = 'Bearer {}'.format(auth_token) url = "{}/screenshot".format(base_url) payload = {'date': date} headers = {'Authorization': token} try: # 上下文管理器自动管理文件句柄,避免文件读取异常 with open(image_path, 'rb') as f: # 若Mac截图为默认png格式,将Content-Type修改为image/png files = {'imagefile': ('imagefile', f, 'image/jpeg')} log.debug("file : {0}".format(files)) response = requests.post( url, headers=headers, data=payload, files=files, timeout=30 ) except Exception as e: log.error("Request ERROR: {0}".format(e))
3. 补全请求头字段
Postman会默认携带User-Agent、Accept等头字段,部分服务端会校验这些头的存在,可将Postman中正常请求的所有头字段复制到代码的headers配置中,示例:
headers = { 'Authorization': token, 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36', 'Accept': '*/*' }
4. 打印请求日志定位差异
开启urllib3的调试日志,输出完整的请求头、请求体内容,和Postman的请求报文做对比,快速定位差异点:
import requests.packages.urllib3 as urllib3 urllib3.add_stderr_logger()
内容的提问来源于stack exchange,提问作者Remya
相关产品推荐
相关产品推荐

