如何强制requests库发起HTTPS请求,即使传入HTTP格式URL?
解决方案
要强制requests发起HTTPS请求,不管传入的URL是http://开头还是其他,最直接可靠的方式是修改URL的协议方案为https,你当前的assert_https函数思路是正确的,还可以做一点优化让它更健壮。
优化后的URL转换方案
from urllib.parse import urlparse, urlunparse def enforce_https(url: str) -> str: parsed = urlparse(url) # 仅当原协议不是https时才替换,避免重复操作 if parsed.scheme != 'https': parsed = parsed._replace(scheme='https') return urlunparse(parsed)
这个函数会解析URL结构,将协议强制替换为https后重新拼接成完整URL,确保传入requests的始终是HTTPS地址。
关于verify参数的说明
verify参数的作用是验证SSL证书有效性,和强制使用HTTPS协议完全无关——哪怕你把verify设为True,如果传入的是http://开头的URL,requests依然会发起HTTP请求,所以这个参数解决不了你的问题。
全局拦截方案(进阶)
如果不想每次调用requests前都手动处理URL,可以通过自定义HTTPAdapter实现全局拦截,自动替换协议:
import requests from urllib.parse import urlparse, urlunparse from requests.adapters import HTTPAdapter class HTTPSForceAdapter(HTTPAdapter): def send(self, request, **kwargs): parsed_url = urlparse(request.url) if parsed_url.scheme != 'https': new_url = urlunparse(parsed_url._replace(scheme='https')) request.url = new_url return super().send(request, **kwargs) # 全局挂载适配器 session = requests.Session() session.mount('http://', HTTPSForceAdapter()) session.mount('https://', HTTPSForceAdapter()) # 测试:传入http开头的URL,实际发起HTTPS请求 response = session.get('http://example.com') print(response.url) # 输出: https://example.com
这种方案适合需要全局强制HTTPS的场景,无需修改每个请求的URL处理逻辑。
内容的提问来源于stack exchange,提问作者actual_panda
相关产品推荐
相关产品推荐

