为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 RestTemplate 不对“+”符号进行 urlencode,而是对其他所有内容进行

为什么 RestTemplate 不对“+”符号进行 urlencode,而是对其他所有内容进行

慕标琳琳 2022-12-28 14:20:28
我发现了一个奇怪的问题,即 urlencoding 的行为不一致。更新Spring MVC 4.3 和 5.1 版本之间存在差异:// FAIL in MVC 4.x @Testpublic void test2() {    rt.getForObject("http://localhost/expr={expr}", String.class, "x/y");    Assert.assertEquals("http://localhost/expr=x%2Fy", savedUri.toString());}// FAIL in MVC 4 or 5@Testpublic void test3() {    rt.getForObject("http://localhost/expr={expr}", String.class, "x+y");    Assert.assertEquals("http://localhost/expr=x%2By", savedUri.toString());}// ok in MVC 4.x, FAIL in MVC 5@Testpublic void test4() {    rt.getForObject("http://localhost/expr={expr}", String.class, "x+y");    Assert.assertEquals("http://localhost/expr=x+y", savedUri.toString());}这可能是 Spring MVC 更大重构的一部分,因为它也出现在一个完全不同的地方问题详情以下独立测试最能说明我的问题。不要被ClientHttpRequestFactory- 重要的部分是最后 2 种测试方法所吓倒。发生了什么:除法符号/正确编码为%2F- test2() 通过添加符号+未编码为 a %2B- 它仍然存在+并且 test3() 失败应该发生什么:test3() 应该通过。+应编码为 %2B,因为它+是 URL 中的特殊字符,并且被许多服务器端 Web 框架解释为空白。这是怎么回事,是否有通用修复程序?
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

不确定是否+应该编码。旧的 RFC 说是,新的说也许。

尝试按如下方式设置编码模式:

  DefaultUriBuilderFactory builderFactory = new DefaultUriBuilderFactory();
  builderFactory.setEncodingMode(EncodingMode.VALUES_ONLY);
  restTemplate.setUriTemplateHandler(builderFactory);

请参阅SPR- 19394和SPR-20750进行讨论。


查看完整回答
反对 回复 2022-12-28
  • 1 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号