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

使用Python Requests传递含'+'字符的邮箱遇到编码问题

解决Requests库处理含'+'字符邮箱的URL编码问题

我之前也踩过这个坑!当你用Requests向application/x-www-form-urlencoded接口传递带'+'的邮箱时,默认的参数处理逻辑会跟Postman不一样,导致编码不符合预期,服务端解析出错。下面给你讲清楚原因和解决方案:

为什么会出现这个问题?

Postman会严格按照URL编码标准处理所有特殊字符:把邮箱里的'+'转成%2B,'@'转成%40。但Requests的data参数如果传字典的话,默认的编码逻辑是遵循旧版表单编码规则——它把空格替换成'+',但不会主动编码原本就存在的'+'字符,这就导致你的test+user@gmail.com被原样发送,服务端很可能把'+'当成空格解析,自然就出错了。

两种亲测有效的解决方案

方案1:用urllib.parse.urlencode手动编码参数

直接用Python标准库的urlencode方法处理参数字典,它会把所有需要编码的特殊字符(包括'+'和'@')转换成标准的URL编码格式,然后把编码后的字符串传给requests.post的data参数:

import requests
from urllib.parse import urlencode

# 定义要传递的参数
payload = {'username': 'test+user@gmail.com'}
# 手动编码参数
encoded_payload = urlencode(payload)
# 发起请求,记得指定Content-Type头(可选但更稳妥)
response = requests.post(
    'https://你的接口地址.com',
    data=encoded_payload,
    headers={'Content-Type': 'application/x-www-form-urlencoded'}
)

# 打印编码后的内容验证,应该输出 username=test%2Buser%40gmail.com
print(encoded_payload)

方案2:手动准备请求对象强制编码

如果你想保留字典传参的方式,可以用requests.Request和PreparedRequest来手动构建请求,这样能确保参数被正确编码:

import requests

# 创建请求对象
req = requests.Request(
    'POST',
    'https://你的接口地址.com',
    data={'username': 'test+user@gmail.com'}
)
# 准备请求(这一步会完成编码)
prepped = req.prepare()

# 可以先检查编码后的请求体,确认是正确的格式
print(prepped.body)  # 应该输出 username=test%2Buser%40gmail.com

# 发送请求
response = requests.Session().send(prepped)

验证结果

不管用哪种方案,你都可以打印编码后的请求体,确认'+'被转成了%2B,'@'被转成了%40,这样服务端就能正确解析你的邮箱参数了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:24:34