Android Retrofit Kotlin中URL斜杠双重编码致API请求400错误
解决URL编码重复导致的400错误问题
问题根源
你获取到的X-Amz-Credential=0XCA1HQW6NU67Z1FP3U1%2F20221011%2Fus-east-1%2Fs3%2Faws4_request中,%2F已经是斜杠(/)的URL编码结果。当你把这个值作为查询参数传递给下一个API时,请求库或框架会自动对所有特殊字符(包括%)再次编码,将%转为%25,最终%2F变成%252F,导致目标API无法识别正确的凭证格式,返回400错误。
可行解决方案
先解码再传递
在发送请求前,对拿到的凭证值做一次URL解码,把%2F还原成原始的/。之后让请求库自动编码,就能得到正确的%2F格式。
Python示例:import urllib.parse # 从API获取的编码后凭证 encoded_cred = "0XCA1HQW6NU67Z1FP3U1%2F20221011%2Fus-east-1%2Fs3%2Faws4_request" # 解码还原原始格式 decoded_cred = urllib.parse.unquote(encoded_cred) # 此时decoded_cred为:0XCA1HQW6NU67Z1FP3U1/20221011/us-east-1/s3/aws4_request # 将解码后的值作为查询参数传入请求,库会自动把/编码为%2F手动构造查询字符串
直接将拿到的完整凭证参数拼接进URL,跳过请求工具的自动编码逻辑。
Python requests库示例:import requests credential_param = "X-Amz-Credential=0XCA1HQW6NU67Z1FP3U1%2F20221011%2Fus-east-1%2Fs3%2Faws4_request" # 手动拼接完整请求URL url = f"https://your-target-api.com?{credential_param}" response = requests.get(url)注意:如果还有其他查询参数,要确保它们已经正确编码,避免格式混乱。
调整请求工具编码配置
部分HTTP客户端工具支持关闭全局自动编码,或针对特定参数跳过编码。查看你使用工具的文档,找到对应配置,对X-Amz-Credential参数禁用自动编码。
内容的提问来源于stack exchange,提问作者Prasanth J
相关产品推荐
相关产品推荐

