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

如何强制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:50:26