You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:24:51