Python使用requests获取OAuth2 access token连接报错如何解决
问题原因说明
- 未触发NameError的原因:你预想的NameError应该是认为
api_call_response定义在while循环内部,外部访问会抛出变量未定义错误,但由于你的while是无终止条件的无限死循环,程序永远不会执行到循环外的if判断逻辑,因此不会触发该报错。 - ConnectionError直接成因:报错信息显示程序实际请求的是
www.webapi.com的80端口,和你代码中写的webapi.comHTTPS(默认443端口)地址不一致,说明要么你实际运行的代码和贴出的示例不一致,要么目标域名配置了强制跳转,跳转到了带www前缀的HTTP地址,你的网络环境无法和该地址建立连接,常见触发场景包括:- 本地网络防火墙、代理规则限制了对该域名的访问
- 目标域名解析错误、对应服务未部署、端口未对外开放
- 你代码中填写的域名是测试占位地址,没有实际可用的服务
- 代码隐藏的缩进错误:
api_call_response的状态码判断逻辑完全写在while True循环外部,就算网络正常,程序也会无限调用业务API,永远不会执行token刷新和响应打印逻辑。
修复方案
- 先修正代码缩进、添加超时和请求间隔,避免语法逻辑问题:
import sys import requests import json import logging import time logging.captureWarnings(True) # 确认该地址为实际可用的业务接口地址 api_url = "https://webapi.com/api/v1/data" def get_new_token(): # 确认该地址为实际可用的token获取接口地址 acc_token_url = "https://webapi.com/connect/accesstoken" client_id = '替换为实际的client_id' client_secret = '替换为实际的client_secret' token_req_payload = {'grant_type': 'client_credentials'} # 添加超时参数避免长时间无响应 token_response = requests.post( acc_token_url, data=token_req_payload, verify=False, allow_redirects=False, auth=(client_id, client_secret), timeout=10 ) if token_response.status_code != 200: print("从OAuth2服务器获取token失败", file=sys.stderr) sys.exit(1) print("成功从OAuth2服务器获取新token") tokens = json.loads(token_response.text) return tokens['access_token'] token = get_new_token() while True: api_call_headers = {'Authorization': 'Bearer ' + token} api_call_response = requests.get( api_url, headers=api_call_headers, verify=False, timeout=10 ) # 状态判断逻辑缩进调整到循环内部 if api_call_response.status_code == 401: token = get_new_token() else: print(api_call_response.text) # 添加调用间隔,避免请求频率过高被服务端拦截 time.sleep(1)
- 排查网络连接问题:
- 先使用curl、Postman等工具手动调用token接口和业务接口,确认接口本身可以正常访问
- 检查本地是否开启了代理、防火墙是否拦截了对应域名的请求
- 确认接口服务商是否要求将你的出口IP添加到白名单才能正常访问
内容的提问来源于stack exchange,提问作者paone
相关产品推荐
相关产品推荐

