Python发送POST请求失败:脚本冻结且报Socket错误求助
看起来你的脚本卡在了等待服务器响应的环节,这种情况通常和网络连通性、服务器状态或者请求配置有关,咱们一步步来排查:
1. 先确认服务器是否正常可达
首先得验证http://localhost:3000/oauth2/token这个端点是不是真的能正常响应。你可以试试用curl命令测试:
curl -X POST http://localhost:3000/oauth2/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials&client_id=ClientCredentialsClient&client_secret=Ultrasecretstuff"
如果curl也卡住没响应,那问题大概率出在服务器端——比如服务没启动、端口配置错了,或者服务器处理请求时发生了死锁。
2. 给请求添加超时时间
requests库默认没有超时限制,这就意味着如果服务器不返回响应,你的脚本会无限挂着。赶紧给post请求加上timeout参数,比如设置10秒超时:
r = requests.post(url, data=data, headers=headers, timeout=10)
这样即使服务器没响应,脚本也会在10秒后抛出超时错误,不会一直冻结,还能帮你定位问题类型。
3. 检查Authorization头的格式
你当前的Authorization: 'auth'明显不符合规范。对于client_credentials模式,绝大多数OAuth2服务要求使用Basic认证格式:把client_id和client_secret用冒号拼接,再做Base64编码。修正后的代码应该是这样:
import requests import base64 url = "http://localhost:3000/oauth2/token" data = {'grant_type': 'client_credentials', 'client_id': 'ClientCredentialsClient', 'client_secret': 'Ultrasecretstuff'} # 生成正确的Basic认证头 auth_str = f"{data['client_id']}:{data['client_secret']}" auth_base64 = base64.b64encode(auth_str.encode('utf-8')).decode('utf-8') headers = {'Content-type': 'application/x-www-form-urlencoded', 'Authorization': f'Basic {auth_base64}'} # 添加超时 r = requests.post(url, data=data, headers=headers, timeout=10) print(r.status_code) print(r.json())
如果服务器期望Basic认证,你之前的无效头会导致服务器无法处理请求,进而让脚本一直等待响应。
4. 验证请求参数的正确性
再核对下data里的参数:grant_type是不是client_credentials(拼写别错),client_id和client_secret是不是和服务器配置的完全一致。参数错误有时候会导致服务器静默无响应,而不是返回错误码。
5. 考虑升级Python版本
你用的是Python2.7,这个版本已经停止维护好几年了,配套的requests旧版本可能存在一些兼容性bug。如果条件允许,升级到Python3.8+,再安装最新版的requests(pip install --upgrade requests),说不定能解决一些隐藏的问题。
内容的提问来源于stack exchange,提问作者uiguyf ufdiutd

