如何防止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
相关产品推荐
相关产品推荐

