Python调用API出现WRONG_VERSION_NUMBER错误的解决方法
问题描述
在PySpark环境中执行Python脚本调用API,代码如下:
proxy = { "http": "http://proxy_url:port", "https": "https://proxy_url:port" } proxy_auth = requests.auth.HTTPProxyAuth("username", "password") token_value = "access_token" url = "https://host/endpoint/" headers = {"Content-Type": "application/json", "Authorization": f"Bearer {token_value}"} data = {"id": "123456", "type": "ALL"} response = requests.post(url, headers=headers, json=data, proxies=proxy, auth=proxy_auth) print(response.json())
运行时抛出SSL错误:
HTTPSConnectionPool(host='host', port=443): Max retries exceeded with url: /endpoint/ (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1056)'))) Traceback (most recent call last): File "/env/lib/python3.7/site-packages/requests/api.py", line 117, in post return request('post', url, data=data, json=json, **kwargs) File "/env/lib/python3.7/site-packages/requests/api.py", line 61, in request return session.request(method=method, url=url, **kwargs) File "/env/lib/python3.7/site-packages/requests/sessions.py", line 542, in request resp = self.send(prep, **send_kwargs) File "/env/lib/python3.7/site-packages/requests/sessions.py", line 655, in send r = adapter.send(request, **kwargs) File "/env/lib/python3.7/site-packages/requests/adapters.py", line 514, in send raise SSLError(e, request=request) requests.exceptions.SSLError: HTTPSConnectionPool(host='host', port=443): Max retries exceeded with url: /endpoint/ (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1056)')))
环境信息:
- Python版本:3.7.3
- requests版本:2.26.0
- 相同代理配置在Postman中可正常请求,但Python脚本调用失败。
解决方法
1. 修正HTTPS代理协议配置
HTTPS请求通过代理时,需先建立HTTP连接到代理,再通过CONNECT方法建立目标HTTPS连接,因此将HTTPS代理的协议改为http://:
proxy = { "http": "http://proxy_url:port", "https": "http://proxy_url:port" # 替换原https://协议为http:// }
2. 指定SSL协议版本
强制指定与目标服务器兼容的SSL版本(如TLSv1.2或TLSv1.3),通过自定义adapter实现:
import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager import ssl class SSLAdapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1_2 # 可替换为ssl.PROTOCOL_TLSv1_3 ) # 创建session并挂载自定义adapter session = requests.Session() session.mount("https://", SSLAdapter()) session.proxies = proxy session.auth = proxy_auth response = session.post(url, headers=headers, json=data) print(response.json())
3. 更换代理认证方式
若代理不支持HTTPProxyAuth,尝试将用户名密码直接嵌入代理URL:
proxy = { "http": "http://username:password@proxy_url:port", "https": "http://username:password@proxy_url:port" } # 移除proxy_auth参数,直接使用上述proxy配置 response = requests.post(url, headers=headers, json=data, proxies=proxy)
4. 临时跳过SSL证书验证(仅调试用)
如果是代理或目标服务器证书问题导致版本错误,可临时关闭验证,但生产环境禁止使用:
response = requests.post(url, headers=headers, json=data, proxies=proxy, auth=proxy_auth, verify=False)
5. 清理PySpark环境代理变量
PySpark可能继承系统代理环境变量导致冲突,先清空相关变量再执行请求:
import os # 清空大小写形式的代理环境变量 os.environ.pop('HTTP_PROXY', None) os.environ.pop('HTTPS_PROXY', None) os.environ.pop('http_proxy', None) os.environ.pop('https_proxy', None) # 执行原请求代码
内容的提问来源于stack exchange,提问作者Marcos Guimaraes
相关产品推荐
相关产品推荐

