requests模块是否会截断请求头?长Bearer令牌请求报错求助
问题解决:长Bearer令牌请求的编码与截断问题
先明确:requests不会默认截断请求头里的Bearer令牌,你看到的省略号大概率是错误提示或日志显示时的截断,而非实际请求中的令牌被截断。
核心原因分析
报错里的…是错误信息里的占位符,不是你令牌本身的内容。latin-1编码只能处理0-255范围的字符,你的令牌里可能包含了latin-1无法编码的Unicode字符(比如特殊符号、非ASCII字符),当requests用默认的latin-1编码处理请求头时就会触发这个错误。
具体解决方法
1. 强制指定请求头编码为UTF-8
requests默认用latin-1编码请求头,你可以手动设置编码为UTF-8,确保令牌里的所有字符都能被正确处理:
import requests url = "你的API地址" token = "你的长Bearer令牌" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" # 按需调整 } # 创建Session并设置默认编码为UTF-8 session = requests.Session() session.headers.update(headers) session.request_encode = "utf-8" response = session.post(url, json={"请求体数据": "示例内容"})
2. 排查令牌的字符合法性
检查你的Bearer令牌是否包含非URL安全的字符,比如特殊符号、emoji或者编码错误的字符。如果有,尝试重新生成令牌,确保它只包含Base64允许的字符(A-Z、a-z、0-9、+、/、=)。
3. 手动编码令牌适配latin-1
如果令牌里必须保留Unicode字符,可以先手动用UTF-8编码再转成latin-1兼容格式:
token_encoded = token.encode("utf-8").decode("latin-1") headers = { "Authorization": f"Bearer {token_encoded}" } response = requests.post(url, headers=headers, json=...)
4. 验证实际发送的请求头
用抓包工具(比如Charles、Fiddler)或者代码打印日志,确认令牌是否真的被截断:
from requests.adapters import HTTPAdapter class DebugAdapter(HTTPAdapter): def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): print("实际发送的Authorization头:", request.headers.get("Authorization")) return super().send(request, stream, timeout, verify, cert, proxies) session = requests.Session() session.mount("https://", DebugAdapter()) # 发送请求...
总结
requests不会自动截断长令牌,问题根源是编码不兼容。优先尝试指定UTF-8编码,再排查令牌本身的字符问题,抓包验证可以帮你彻底确认请求内容是否正常。
内容的提问来源于stack exchange,提问作者NoBullsh1t
相关产品推荐
相关产品推荐

