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

如何防止Python httpx对URL自动执行百分号编码

httpx保留未编码大括号查询字符串解决方案

以下是三种可行的实现方式,均不需要修改httpx私有属性:

方案1:直接拼接完整URL

httpx仅在通过params参数自动拼接查询字符串时会做百分号编码,直接传入带完整查询串的URL字符串时,不会二次编码已存在的查询内容,大括号会原样保留。

import httpx

# 直接构造带大括号查询参数的完整URL
url = "https://example.com/endpoint?filter={userId:1001,status:active}"
resp = httpx.get(url)

方案2:动态拼接查询字符串

如果查询参数是动态生成的,可以自行拼接查询串后再组装到URL中,跳过httpx的自动编码逻辑。

import httpx

params = {
    "filter": "{userId:1001,status:active}",
    "page": "2",
    "pageSize": "20"
}
# 自行拼接查询字符串,不做编码处理
query_str = "&".join([f"{key}={value}" for key, value in params.items()])
url = f"https://example.com/endpoint?{query_str}"
resp = httpx.get(url)

方案3:请求钩子全局替换

如果需要全局保留大括号,同时仍希望使用params参数传参,可以添加请求钩子,自动将已编码的大括号替换回原始字符。

import httpx

def restore_braces(request):
    # 替换编码后的大括号为原始字符
    raw_url = str(request.url).replace("%7B", "{").replace("%7D", "}")
    request.url = httpx.URL(raw_url)

# 初始化客户端时注册钩子
client = httpx.Client(event_hooks={"request": [restore_braces]})
# 正常通过params传参即可,大括号会自动保留
resp = client.get(
    "https://example.com/endpoint",
    params={"filter": "{userId:1001,status:active}"}
)

注意:未编码的大括号不符合RFC 3986 URL规范,仅在确认目标服务端支持接收未编码大括号时使用上述方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:45:03