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

Python Requests:避免URL编码适配含大括号的遗留后端

保留URL查询字符串中的大括号(适配遗留设备)

需要与一台存在后端问题的遗留设备交互,该设备要求查询字符串必须包含大括号,示例格式:
http://example.com/thing/page?{item1}{item2}{item3}

requests和urllib3的默认URL编码行为会自动转义大括号,导致请求不符合设备要求。尝试过覆盖_encode_invalid_chars函数、使用requests预请求方案均无效,即使参考GitHub旧议题和Stack Overflow帖子的预请求方法也没用。

以下是两种可行的解决方法:

import requests
import urllib3.util.url

def hook_invalid_chars(component, allowed_chars):
    # 此处可自定义URL编码逻辑,或直接返回原内容不编码
    return component

# 方法1:覆盖urllib3的无效字符编码函数
# 注意:这是一种hack方案
# urllib3.util.url._encode_invalid_chars = hook_invalid_chars

# 方法2(要求urllib3版本约为2.0.7):
# 注意:这是一种hack方案,让urllib3允许原本被视为无效的字符
urllib3.util.url._QUERY_CHARS.add('{')
urllib3.util.url._QUERY_CHARS.add('}')

url_base = 'http://127.0.0.1:5470/thing/page'
url_query = '{item1}{item2}{item3}'

with requests.Session() as sess:    
    # 注意:需配合上述任意一种hack方案,同时使用预请求
    req = requests.Request(method='GET', url=url_base)
    prep = req.prepare()
    prep.url += f'?{url_query}'
    
    resp = sess.send(prep)

更新说明

  • 更新:将代码块修改为可运行示例
  • 更新2:移除代码块中的导入别名
  • 更新3:新增两种可行方法到代码块

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:05:02