AWS API Gateway要求URL两次编码 路径参数带空格请求报错如何解决?
问题根因
该报错是URL双重编码导致的签名不匹配:报错中出现的%2520是空格被两次编码的结果——空格第一次编码为%20,第二次编码时%被转义为%25,最终得到%2520。AWS API Gateway的签名校验会比对前端请求的实际路径和签名用的规范字符串(Canonical String),二者编码不一致就会抛出该错误。
另外你配置的$util.urlDecode()属于集成请求阶段的参数处理逻辑,签名校验在该步骤之前执行,所以这个配置不会解决签名匹配的问题。
解决步骤
1. 修复Angular前端编码逻辑
Angular的HttpClient默认会自动对URL路径做编码,如果你手动调用了encodeURI()/encodeURIComponent()处理路径参数,就会触发双重编码:
- 常规场景下直接删掉手动编码的逻辑,使用Angular默认的自动编码即可
- 特殊场景必须手动编码时,要关闭
HttpClient的自动编码开关,示例代码:
import { HttpClient, HttpContext } from '@angular/common/http'; import { ENCODE_URL } from '@angular/common/http'; // 手动编码路径参数后关闭默认编码 const requestUrl = `/data/${id}/hello/${encodeURIComponent(message)}`; this.http.get(requestUrl, { context: new HttpContext().set(ENCODE_URL, false) }).subscribe(res => { /* 处理响应 */ });
如果项目使用AWS Amplify对接API Gateway,额外检查Amplify的API模块配置,关闭自动编码路径的配置项。
2. 调整API Gateway参数配置
进入API Gateway对应接口的「路径参数」配置页:
- 关闭
{Some message with a space}参数的自动URL解码开关,避免API Gateway收到请求后先解码参数再生成规范字符串,导致和前端签名的字符串不一致
3. 验证效果
改完后抓包确认实际发请求的URL中空格编码为%20,此时签名用的规范字符串和实际请求路径一致,报错即可解决。
内容的提问来源于stack exchange,提问作者user7225419
相关产品推荐
相关产品推荐

