使用requests.get调用REST API超时,浏览器可正常访问的问题排查
问题分析与解决建议
可能被忽略的点
- 浏览器与requests的环境差异:浏览器会自动带上系统代理、已保存的Cookie等会话信息,而
requests.get默认是无上下文的干净请求。如果API需要代理才能访问,或者依赖浏览器中的Cookie才能正常连接,直接用requests就会触发超时。 - 未设置超时参数:你的代码里没指定
timeout,requests默认没有超时限制,可能导致请求无限等待。建议添加timeout参数(比如timeout=10),既能避免长时间挂起,也能更快排查问题。 - HTTPS证书验证问题:部分内部API的证书不被requests默认信任,浏览器可能因为你之前手动信任过证书而正常访问,但requests会因证书验证失败间接出现类似超时的异常。可以临时关闭验证测试(
verify=False),但生产环境要替换成指定可信证书路径。 - 缺失必要请求头:浏览器会自动发送User-Agent、Accept等标准请求头,有些API会校验这些字段,缺失的话可能拒绝连接或延迟响应,最终表现为超时。
URL传递JWT的影响
- 安全层面:JWT放在URL参数里会被记录到服务器日志、浏览器历史,比放在
Authorization请求头里风险高,不建议这么做。 - 兼容性:部分API只识别请求头中的JWT(格式为
Bearer <token>),不支持URL参数传递,这会导致API拒绝请求,表现为连接超时或权限错误。 - 格式问题:你的示例URL里是
?JWT-token,没有正确的键值对格式(应该是?jwt=<你的令牌内容>或API约定的参数名),API无法解析的话会引发请求处理异常,进而导致超时。
修正后的示例代码
import requests url = "https://www.restapi.com/content" # 替换成你的实际JWT令牌,同时添加浏览器风格的User-Agent headers = { "Authorization": "Bearer 你的JWT令牌", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } try: # 添加超时参数,避免无限等待 response = requests.get(url, headers=headers, timeout=10) print(response.status_code) print(response.json()) except requests.exceptions.ConnectTimeout: print("连接超时,请检查网络、代理或API地址是否正确") except requests.exceptions.SSLError: print("证书验证失败,测试阶段可临时加verify=False,但生产环境要指定可信证书")
内容的提问来源于stack exchange,提问作者Mike Curtis
相关产品推荐
相关产品推荐

