Python中如何强制使用纯HTTP发起REST请求而非HTTPS?
我来帮你搞定这个问题!看起来你的Python库在请求http://bot时,莫名其妙被强制转到HTTPS了,这大概率是请求被重定向、DNS解析或者本地配置搞的鬼。不过没关系,咱们直接从代码层面入手,让requests和httplib2老老实实用纯HTTP连接。
针对requests库的解决方案
你遇到的SSLError,本质是请求被自动重定向到HTTPS了,哪怕你写的是http://。咱们有两种处理方式:
方法1:直接禁用自动重定向
不让requests跟着服务的重定向指令走,直接访问你指定的HTTP地址:
import requests url = 'http://bot' # 禁用自动重定向,避免被跳转到HTTPS r = requests.get(url, allow_redirects=False) # 可以打印状态码看看,如果是3xx开头,说明服务确实在发重定向 print(r.status_code)
方法2:必须跟随重定向?那就跳过SSL验证(仅限开发环境)
如果你的本地服务非要把HTTP请求重定向到HTTPS,但你又不想折腾证书,那可以临时关闭SSL验证——注意:这只适合开发环境,生产环境绝对不能这么干!
import requests url = 'http://bot' # 关闭SSL验证,同时允许重定向 r = requests.get(url, verify=False, allow_redirects=True) # 万一重定向后的URL是HTTPS,咱们手动改回HTTP再请求一次 if r.url.startswith('https://'): r = requests.get(r.url.replace('https://', 'http://'), verify=False)
针对httplib2库的解决方案
httplib2默认会严格验证SSL证书,一旦请求被重定向到HTTPS,就会触发证书验证失败的错误。咱们同样有两种办法:
方法1:直接关闭SSL证书验证
创建Http对象时,加上disable_ssl_certificate_validation=True参数,跳过证书检查:
import httplib2 url = 'http://bot' # 禁用SSL证书验证 http = httplib2.Http(disable_ssl_certificate_validation=True) response, content = http.request(url, "GET")
方法2:手动处理重定向,强制用HTTP
如果是重定向导致的问题,咱们可以自己接管重定向逻辑,把HTTPS的跳转地址改回HTTP:
import httplib2 url = 'http://bot' http = httplib2.Http(disable_ssl_certificate_validation=True) # 先禁用自动跟随重定向,看看是不是有跳转 response, content = http.request(url, "GET", follow_redirects=False) # 检查状态码,3xx都是重定向 if response.status in [301, 302, 303, 307, 308]: redirect_url = response['location'] # 把HTTPS开头的地址改成HTTP if redirect_url.startswith('https://'): redirect_url = redirect_url.replace('https://', 'http://') # 再请求修改后的HTTP地址 response, content = http.request(redirect_url, "GET")
额外排查小技巧
- 先用
curl -v http://bot看看请求全过程,确认是不是服务本身在发HTTPS重定向。 - 试试直接用服务的IP访问(比如
http://127.0.0.1),排除bot域名解析的问题。 - 检查本地有没有代理、防火墙或者VPN,这些工具可能会偷偷把HTTP转成HTTPS。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

