RestTemplate访问阿里云OSS带签名的链接报错SignatureDoesNotMatch
RestTemplate访问阿里云OSS带签名的链接报错SignatureDoesNotMatch
·
程序中获取到带签名的OSS临时地址,使用RestTemplate直接访问的方式:
String url = "http://xxx/xxx/xxx.jpg?Expires=123&OSSAccessKeyId=xxx&Signature=X%2FtpHD%2BX%2Bvw%3D"";
RestTemplate restTemplate = new RestTemplate();
String object = restTemplate.getForObject(url, String.class);
System.out.println(object);
报错SignatureDoesNotMatch
完整报错信息:
org.springframework.web.client.HttpClientErrorException$Forbidden:
403 Forbidden:
[<?xml version="1.0" encoding="UTF-8"?>
<Error> <Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing... (1104 bytes)]
解决:使用URI.create(url)
String url = "http://xxx/xxx/xxx.jpg?Expires=123&OSSAccessKeyId=xxx&Signature=X%2FtpHD%2BX%2Bvw%3D"";
RestTemplate restTemplate = new RestTemplate();
String object = restTemplate.getForObject(URI.create(url), String.class);
System.out.println(object);
两种方式对比:
| 场景 | URI.create(url) | 直接传字符串url |
| 编码处理 | 按URI规范解析,不二次编码已合法编码的字符(如%3D) | 可能对整个字符串进行编码,导致双重编码(如%3D→%253D) |
| 特殊字符兼容性 | 适合已手动编码或包含保留字符(如=,&)的url | 适合未编码的原始字符串(框架自动编码未处理的特殊字符) |
| 参数解析准确性 | 严格遵循URI各部分语法,避免参数解析错误 | 依赖框架内部编码逻辑,可能因规则不一致导致错误 |
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)