@QueryParam 注解 同时为POST 请求会URL把url中的%2B类似的特殊字符错误处理
Posted hongweitester
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@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的问题
以上是关于@QueryParam 注解 同时为POST 请求会URL把url中的%2B类似的特殊字符错误处理的主要内容,如果未能解决你的问题,请参考以下文章