为何Python requests模块调用API返回504,Postman却正常返回200?
解决Python请求API返回504而Postman正常的问题
以下是针对企业应用场景的排查和解决步骤:
1. 配置企业代理
企业网络通常强制使用代理,Postman可能自动拾取系统代理,但requests默认不会。可以手动指定代理,或者自动读取系统代理:
- 手动设置代理:
import requests proxies = { "http": "http://企业代理地址:端口", "https": "http://企业代理地址:端口" } response = requests.post("目标API地址", json=请求体, proxies=proxies, verify=False)
- 自动读取系统代理:
import requests url = "目标API地址" proxies = requests.utils.get_environ_proxies(url) response = requests.post(url, json=请求体, proxies=proxies, verify=False)
2. 完全匹配Postman的请求头
Postman的请求头可能包含企业服务要求的特殊字段(如User-Agent、Authorization、Cookie或自定义头部),requests生成的代码可能遗漏这些字段。直接复制Postman中所有请求头到代码:
import requests headers = { "User-Agent": "PostmanRuntime/7.32.3", "Content-Type": "application/json", "Cookie": "xxx=xxx; yyy=yyy", # 粘贴Postman中显示的所有其他请求头 } response = requests.post("目标API地址", headers=headers, json=请求体, verify=False)
3. 对齐请求体格式
确认Postman的请求体类型(form-data/x-www-form-urlencoded/raw JSON),确保requests使用对应参数:
- 如果是
raw JSON:用json=请求体字典 - 如果是
x-www-form-urlencoded:用data=请求体字典 - 如果是
form-data:用files参数(含文件时)或data参数(键值对)
4. 调整超时时间
504是网关超时,可能Python默认超时(15秒)比Postman短。延长超时时间:
response = requests.post("目标API地址", json=请求体, timeout=30) # 设置30秒超时
5. 处理企业证书
企业环境可能使用自签名证书,除了关闭verify=False,也可以指定证书路径:
response = requests.post("目标API地址", json=请求体, verify="/path/to/企业根证书.pem")
或者设置环境变量REQUESTS_CA_BUNDLE指向证书文件,避免每次代码中指定。
6. 使用会话保持请求状态
Postman可能维持了登录会话(如Cookie),而requests每次请求是独立会话。用requests.Session()保持会话:
import requests session = requests.Session() # 先执行登录请求,获取会话Cookie session.post("登录API地址", data={"username": "xxx", "password": "xxx"}) # 用同一个会话请求目标API response = session.post("目标API地址", json=请求体)
内容的提问来源于stack exchange,提问作者The Masked CS Intern
相关产品推荐
相关产品推荐

