如何让Python Requests发送的HTTP请求保持HTTP而非自动转为HTTPS?
问题描述
我正在向http://my-local-server:80/apistuff/user发送POST请求创建用户。调试时确认,直到执行requests.post()之前,URL始终是HTTP协议,但查看Response.url时,它已变成https://my-local-server/apistuff/user——Requests自动将URL转为了HTTPS协议。
这引发了一系列问题:
- 之前查到的解决方案是在
post调用中添加, verify=False参数,但这仅跳过证书验证,无法阻止URL和端口被修改(端口从80变为443)。 - 应用配置的运行端口为80,代码其他模块依赖该配置。API执行操作后会向配置的URL返回响应,但实际请求从443端口发出,导致API尝试从443(请求来源)向80(目标地址)回调,进而出现308(重定向)、400(错误请求)或500(服务器错误)等不同错误。
核心需求:如何让Requests发送请求时保持HTTP协议,不自动转为HTTPS?
解决方案
1. 直接禁用自动重定向
Requests默认会自动跟随服务器返回的重定向响应,大概率是服务器返回了HTTP转HTTPS的重定向(如301/308永久重定向)导致URL被修改。禁用自动重定向即可保留原HTTP URL和端口:
response = requests.post("http://my-local-server:80/apistuff/user", allow_redirects=False)
2. 修改服务器重定向配置(根源解决)
如果是服务器端强制将HTTP请求重定向到HTTPS,直接修改服务器的重定向规则(比如Nginx、Apache的配置),取消对该接口的HTTP转HTTPS重定向,就能彻底解决问题。
3. 自定义重定向逻辑(按需使用)
如果需要跟随部分重定向但必须保留HTTP协议,可以自定义重定向回调函数,拦截并重写重定向目标URL:
def keep_http_redirect(response, **kwargs): # 将重定向目标的HTTPS协议改回HTTP,同时保留原端口80 if response.next.url.startswith("https://"): http_url = response.next.url.replace("https://", "http://") # 确保端口是80,避免被自动替换 if ":80" not in http_url: url_parts = http_url.split("/") http_url = f"{url_parts[0]}:80/{'/'.join(url_parts[3:])}" response.next.url = http_url return response response = requests.post("http://my-local-server:80/apistuff/user", hooks={"response": keep_http_redirect})
内容的提问来源于stack exchange,提问作者MivaScott
相关产品推荐
相关产品推荐

