@QueryParam 注解 同时为POST 请求会URL把url中的%2B类似的特殊字符错误处理

之前在做接口测试的时候发现了一个很奇葩的问题。相同的参数用POSTMAN请求可以拿到正确返回,用到SpringBoot里就会报错。

后来用fiddler抓包时候发现原来接口在请求过程中,已经把请求参数错误encoding替换了。

问题的解决思路:

1、先排查自己的接口测试代码,一步步断点debug,发现没有问题

2、排查开发的接口写法,发现了这个post请求方式的接口使用了 @QueryParam 注解(网上查了一下,好像是这个注解虽然是post请求但是不会以body里的内容传参,而是用parameter传参,也就是get请求的传参方式)。

3、这时我发现了参数值中存在特殊符号,先使用接口测试代码运行了一次,把本机环境加入和fiddler同一个环境的代理,加入了下面的代码

1        System.setProperty("http.proxyHost", "127.0.0.1");
2        System.setProperty("https.proxyHost", "127.0.0.1");
3        System.setProperty("http.proxyPort", "9999");
4        System.setProperty("https.proxyPort", "9999");`

发现了错误的请求入参参数

现在定位到了问题原因就是因为框架会对URL进行二次encoding,存在问题是对于Url的path参数存在特殊字符进行转换,导致后台无法返回正确结果

两个办法解决:

1、和开发商量改接口写法,post使用body传参,不使用@QueryParam 注解

2、在自己的接口测试代码里重新定义RestTemplate ,加入这行代码

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

成功解决encoding的问题

 

posted @ 2019-04-18 11:54  秦大帽tester  阅读(1562)  评论(0编辑  收藏  举报