httpx/requests处理含加号GET请求时编码异常问题咨询
为什么httpx/requests不会自动编码URL查询参数里的加号?
核心原因:URL编码规则的歧义
在URL的查询参数规范中,加号(+)被RFC定义为空格的等价替代符,所以httpx和requests这类HTTP库默认不会对加号进行编码——它们认为这里的加号是符合规范的合法字符,或是代表空格的替代,不需要转义。而空格属于明确需要编码的字符,因此会被自动转换为%20。
你的场景特殊点:巴西PIX二维码的加号是业务有效字符
巴西PIX二维码内容里的加号是实际业务需要的真实字符,并非空格的替代,这种场景不在HTTP库的默认编码逻辑覆盖范围内,因此必须手动处理编码。
正确处理方式
不要直接拼接URL字符串,优先使用库提供的params参数传递查询值,结合手动编码确保特殊字符被正确转义:
用requests实现
from urllib.parse import quote import requests url = 'https://<bankAPI>/qrcode' qrcode_value = '00020101021126360014br.gov.bcb.pix0114+55489962650955204000053039865802BR5925TEREZINHA APARECIDA DEL S6008BRASILIA62070503***63040833' # safe='' 指定编码所有非安全字符,包括加号 params = {'qrcode': quote(qrcode_value, safe='')} response = requests.get(url, params=params)
用httpx实现
from urllib.parse import quote import httpx url = 'https://<bankAPI>/qrcode' qrcode_value = '00020101021126360014br.gov.bcb.pix0114+55489962650955204000053039865802BR5925TEREZINHA APARECIDA DEL S6008BRASILIA62070503***63040833' params = {'qrcode': quote(qrcode_value, safe='')} response = httpx.get(url, params=params)
总结
- HTTP库默认不编码加号是遵循RFC规范,将其视为空格的合法替代符
- 当加号是业务所需的真实字符时,必须用
urllib.parse.quote手动编码,safe=''参数可确保所有特殊字符被转义 - 避免直接拼接URL与参数,使用
params参数传递能减少其他潜在编码问题
内容的提问来源于stack exchange,提问作者Nicolas Enrique Bourbon
相关产品推荐
相关产品推荐

