Python Requests实现客户端凭证流程:GET获取Access Token正常但POST请求失败求助
POST方式调用OAuth获取Access Token失败的常见原因
- 接口地址完全不匹配,这是最突出的问题
你GET请求使用的有效地址是https://api.ebanking.com/oauth/access_token,但POST的地址写错了两处:- 域名从生产环境的
ebanking.com换成了开发环境的ebanking.dev,两套环境的client_id、client_secret配置不通用,开发环境没有录入你这组凭证,自然无法通过校验 - 请求路径错误,你POST写的
/oauth一般是OAuth授权页的入口,不是获取Token的接口,正确的POST路径应该和GET对应为/oauth/access_token,按你现在的路径请求,大概率直接返回404错误页
- 域名从生产环境的
- 参数格式校验不匹配
标准OAuth2客户端凭证模式要求POST请求必须用application/x-www-form-urlencoded格式传参,虽然requests传字典给data参数默认就是这个格式,但部分服务端校验严格,可以显式加上对应请求头重试:headers = {'Content-Type': 'application/x-www-form-urlencoded'} response = requests.post(url="https://api.ebanking.com/oauth/access_token", data=data, headers=headers) - 报错定位方式不对,看不到真实错误原因
现在代码直接对响应取.json()["access_token"],如果接口返回的是404、401、参数错误的提示,要么触发JSON解析错误,要么报KeyError,根本定位不到问题。建议先打印响应基础信息:
根据返回的错误提示就能快速判断,是路由不存在、密钥不匹配还是参数格式不对response = requests.post(url="正确的接口地址", data=data) print(f"状态码:{response.status_code}") print(f"返回内容:{response.text}") # 确认返回正常后再取值 access_token = response.json()["access_token"] - 环境配置差异问题
银行类接口的开发环境一般会加IP白名单校验,你GET请求用的是生产环境,已经配置了对应IP的访问权限,但如果开发环境没配置你的IP,哪怕参数全对,也会直接拒绝请求
内容的提问来源于stack exchange,提问作者ThePooh
相关产品推荐
相关产品推荐

