curl请求亚马逊广告API返回的S3预签名URL报格式非法是什么原因?
问题原因
你遇到的报错核心是shell对URL的解析错误,和URL本身有效性、WSL2的curl功能无关,具体原因对应你使用的三个错误curl写法分别如下:
- 第一种写法
curl -o $REPORT_DATA_FILE_GZ "$REPORT_DOWNLOAD_URL\":字符串末尾多了转义双引号,导致引号未正常闭合,curl拿到的URL会带上多余的转义字符,无法识别格式。 - 第二种写法
curl -o $REPORT_DATA_FILE_GZ "\"$REPORT_DOWNLOAD_URL\"":额外给URL前后拼接了双引号字符,curl实际请求的是带双引号的地址,自然判定格式非法。 - 第三种写法
curl -o $REPORT_DATA_FILE_GZ $REPORT_DOWNLOAD_URL:没有给URL变量加双引号包裹,亚马逊S3预签名URL里的&参数分隔符会被shell识别为后台运行指令,直接将URL从&位置截断,curl只能拿到不完整的路径片段,触发报错。
如果按正确写法调整后依然报错,大概率是URL变量中携带了不可见的Windows回车符\r:WSL2和Windows交互时,换行格式默认是Windows的CRLF,多余的\r会被当成URL的一部分,导致curl识别失败。
解决步骤
- 先使用正确的curl命令格式,所有变量都用双引号包裹,不要加额外的转义或引号:
curl -o "$REPORT_DATA_FILE_GZ" "$REPORT_DOWNLOAD_URL"
- 如果执行后依然报错,先检查变量是否存在不可见字符:
echo "$REPORT_DOWNLOAD_URL" | cat -A
如果输出末尾出现^M标识,就说明存在回车符,执行以下命令清理后再调用curl即可:
REPORT_DOWNLOAD_URL=$(echo "$REPORT_DOWNLOAD_URL" | sed 's/\r$//')
- 仍有问题可以给curl加上
-v参数,打印完整请求日志,确认curl实际拿到的URL是否完整、是否有多余字符:
curl -v -o "$REPORT_DATA_FILE_GZ" "$REPORT_DOWNLOAD_URL"
内容的提问来源于stack exchange,提问作者Hans
相关产品推荐
相关产品推荐

