@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的问题

原文地址:https://www.cnblogs.com/hongweitester/p/10728750.html

时间: 2024-11-10 15:18:37

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

【spring springmvc】springmvc使用注解声明控制器与请求映射

目录 概述 壹:注解说明 贰:实现注解声明控制器与请求映射 一:使用controller 二:配置包扫描与视图解析器 1.配置包扫描 2.配置试图解析器 三:配置部署描述符 1.读取spring-mvc.xml文件 2.配置匹配映射 四:建立html文件 叁:配置tomcat 一:配置本地tomcat 二:配置maven内置tomcat 肆:结果及问题 一:tomcat启动示意图: 二:结果 三:问题 伍:结构及源码 一:目录结构 二:源码 作者有话 概述 注解: 在Spring中尽管使用XML

post可以直接把get请求代入到目标url中

Feigong --非攻 非攻 取自<秦时明月>--非攻,针对不同情况自由变化的武器 Feigong,针对各种情况自由变化的mysql注入脚本 Feigong,In view of the different things freely change the mysql injection script 什么是非攻? 在sqlmap的使用过程中,常常碰到很普通的绕过过滤方式,例如空格-->%0b.%0a,但是却没办法使用sqlmap来获取数据的情况,于是花了很长时间来完善脚本,让非攻可以

cnzz 模拟请求登录(传入url get data ) demo

/** * * @Title: init * @Description: TODO 初始化httpclien * @param url * cnzz对应的链接 * @param password * cnzz 对应的密码 * @return * * @return: HttpClient */ public static String init(HttpClient httpclient, String url, String password) { // 建立 httpPost对象 HttpP

请求网络数据的url中带有汉字的解决办法

原来的url是:@"http://ibaby.ipadown.com/api/food/food.show.list.php?keywords=靓汤&p=5&pagesize=10" 这样的url在oc中识别不出来,会报错.换做如下的方式进行请求,将请求头的参数分离出来就可以了: #define kurl @"http://ibaby.ipadown.com/api/food/food.show.list.php" .................

【JavaScript】新浪微博ajax请求后改变地址栏url,但页面不跳转的方案解析

新浪微博当你弹出一个视频的时候再点下一页时,原视频还在,而且地址栏的url的页数变了.对于这种网上讨论最多的方案有以下几种: 一.通过锚点Hash实现在这方面其实国内很早就有做了,比如淘宝画报,通过的是在地址栏后面加#锚点实现的,浏览器是可以识别锚点为单位的历史记录的.但不 是说页面本身有这个锚点,锚点的Hash只是起到一个引导浏览器将这次的记录推入历史记录栈顶的作用. 二.通过HTML5加强型的History对象实现(类Pjax)可以通过window.history.pushState这个方法

CORS跨域请求规则以及在Spring中的实现

CORS: 通常情况下浏览器禁止AJAX从外部获取资源,因此就衍生了CORS这一标准体系,来实现跨域请求. CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制. 跨域请求在java spring MVC中的实现: Spring MVC HandlerMapping 接口对CORS提供了一个内部支持,

ajax请求返回数据,模板中的数据处理

/*ajax请求返回数据,模板中的数据处理*/ function QueryGameAsset(){ var new_start_time=$('#new_start_time').val();//开始时间 var new_end_time=$('#new_end_time').val();//结束时间 if(!new_start_time||!new_end_time){ alert("时间不能为空"); return false; } $.ajax({ url:'/Statisti

【转】关于URL编码/javascript/js url 编码/url的三个js编码函数

来源:http://www.cnblogs.com/huzi007/p/4174519.html 关于URL编码/javascript/js url 编码/url的三个js编码函数escape(),encodeURI(),encodeURIComponent() 本文为您讲述关于js(javascript)编码url的相关问题.(js中url编码&符号后传值给其它页面,多参数网址作为整体编码后传值.如:http://www.ilcng.com/index.html?id=http://ilcng

URL之 URL的语法

一.URL的语法 协议 - URL 的完整格式 - SCHEME: 方案,指定以哪种协议从服务器获取指定资源;方案名不区分大小写.常见方案: HTTP.HTTPS.FTP.MAILTO.RTSP.FILE.NEWS.TELNET等 主机/端口号 - HOST: 主机名,资源所在服务器的IP地址或者域名(需要DNS转换为IP地址) - PORT: 端口号,每项服务在服务器上都对应一个监听端口号 - 严格来说,计算机中对外提供的服务程序可以绑定到任一空闲端口上,从而实现监听客户端连接请求的任务. -