restTemplate.getForObject方法第三方接口请求URL转义异常java.lang.IllegalArgumentException:Invalid character

今天自己写的一个小demo,使用RSA非对称算法加解密数据进行第三方接口测试。然后过程中出现了各种各样的bug,特别是下面这个错误,花了楼主大半天的时间去解决。。。
主要是使用 restTemplate.getForObject 方法去请求第三方接口请求参数的时候,带有+=这种类似的字符他会进行转义,然后解密失败。

下面是出错之前的代码:

ResponseResult object = restTemplate.getForObject("http://localhost:8080/test?result={1}", ResponseResult.class,encrypt);

restTemplate.getForObject方法第三方接口请求URL转义异常java.lang.IllegalArgumentException:Invalid character_第1张图片
在这里插入图片描述
楼主先是尝试了 UriComponentsBuilder 这个类里的方法把URL转换成URI,然后进行编码,结果发现这种方法转义的字符不全,+号没转,=号反而转了(# ̄~ ̄#)。

URI uri = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/test").queryParam("result", encrypt).build(true).encode().toUri();
            ResponseResult object = restTemplate.getForObject(uri, ResponseResult.class);

在这里插入图片描述

java.lang.IllegalArgumentException: Invalid character '=' for QUERY_PARAM in

后面还是楼主开始疯狂度娘,各种论坛什么的,最后终于在一个英文网站找到了类似的案例,果然还是国外大神牛批。
就是使用URLEncoder这个类进行编码你要传的value值
URLEncoder.encode(“value值”,“UTF-8”)

URI uri = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/test").queryParam("result", URLEncoder.encode(encrypt,"UTF-8")).build().toUri();

然后另外一端就要使用相对的URLDecoder类来进行解码。
String decode = URLDecoder.decode(result, “UTF-8”);

String decode = URLDecoder.decode("接收到的name", "UTF-8");

And last 。。。成功
restTemplate.getForObject方法第三方接口请求URL转义异常java.lang.IllegalArgumentException:Invalid character_第2张图片

你可能感兴趣的:(springboot)