Spring怎么又 bug 了,响应结果居然乱码了?_原力计划
换个方式访问该接口,示例如下:
Spring怎么又 bug 了,响应结果居然乱码了?_面试_02
期待"JavaEdge:dev 666",但是运行上述代码后,你会发现结果却是下面这样:
Spring怎么又 bug 了,响应结果居然乱码了?_面试_03
why?

解析

这就要求精通 URL 的处理:
Spring怎么又 bug 了,响应结果居然乱码了?_算法_04

UriComponentsBuilder#toUriString:

Spring怎么又 bug 了,响应结果居然乱码了?_调用栈_05

URL Encode

Spring怎么又 bug 了,响应结果居然乱码了?_原力计划_06
调用栈如下:
Spring怎么又 bug 了,响应结果居然乱码了?_面试_07
Spring怎么又 bug 了,响应结果居然乱码了?_原力计划_08
至此,都还是正常的,但是当我们把 URL 转化成 String,再通过如下语句发送请求时:
Spring怎么又 bug 了,响应结果居然乱码了?_原力计划_09
会发现,它会再进行一次编码:
Spring怎么又 bug 了,响应结果居然乱码了?_算法_10
至此,你应该理解为啥出问题了:依案例代码会执行 2 次编码(Encode),所以最终获取意外惊喜!
2 次编码后:
Spring怎么又 bug 了,响应结果居然乱码了?_面试_11

修正

避免多次转化而发生多次编码:
Spring怎么又 bug 了,响应结果居然乱码了?_调用栈_12