文档章节

RestTemplate 查询参数有特殊字符

learn_more
 learn_more
发布于 2016/07/02 16:58
字数 590
阅读 3316
收藏 5

前面说到如何使用 Spring 的 RestTemplate 进行数据请求,如何避免乱码问题,在项目开发中还遇到了文件上传和下载,所以也写了使用 RestTemplate 包装文件下载的组件。同样,项目越大遇到的问题就会越多,当使用 GET 请求时,如果URL中的参数有特殊字符,比如 '#' ,就会导致查询错误。

1、RestTemplate 下载组件

http://my.oschina.net/heweipo/blog/683233

2、RestTemplate 乱码解决

http://my.oschina.net/heweipo/blog/611514

 

重现步骤,如下代码 

public static void main(String[] args) {

        RestTemplate restTemplate = new RestTemplate();

        HttpHeaders headers = new HttpHeaders();

        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);

        String url = "http://localhost:8180/workbench/questionBank/paper?search=#&query=123";

        HttpEntity<?> entity = new HttpEntity<>(headers);

   HttpEntity<String> response = restTemplate.exchange(url,HttpMethod.GET,entity,String.class); 

        System.out.println(response.getBody());

    }   

本来请求中是有参数 search 和 query ,就因为 search 中使用了特殊字符 # , 然而在服务端获取参数时得到的参数只有 search =  ;

调试结果:

 

问题出现的原因,查看 RestTemplate 的如下代码 

@Override

 public <T> T execute(String url, HttpMethod method, RequestCallback requestCallback,

   ResponseExtractor<T> responseExtractor, Object... urlVariables) throws RestClientException {



   // 这里进行网络转码,因为我们传递的URL是字符串,最后都要统一转为URL,而且对于字符都应该进行网络编码,

   // 问题就出现在这里,我们如果自己手动把参数进行网络编码,那么问题就不会出现

  URI expanded = getUriTemplateHandler().expand(url, urlVariables);  

  return doExecute(expanded, method, requestCallback, responseExtractor);

 }

 

修改后的代码   

public static void main(String[] args) {

        RestTemplate restTemplate = new RestTemplate();

        HttpHeaders headers = new HttpHeaders();

        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);

        String url = "http://localhost:8180/workbench/questionBank/paper?search=#&query=123";

        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);

        URI uri = builder.build().encode().toUri();

        HttpEntity<?> entity = new HttpEntity<>(headers);

        HttpEntity<String> response = restTemplate.exchange( uri,  HttpMethod.GET,  entity,  String.class); 

        System.out.println(response.getBody());

    }

调试结果

 

总结:

    网络传输需要进行网络编码,网络编码可以使用如下API   

HttpHeaders headers = new HttpHeaders();

    headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);



    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)

        .queryParam("msisdn", msisdn)

        .queryParam("email", email)

        .queryParam("clientVersion", clientVersion)

        .queryParam("clientType", clientType)

        .queryParam("issuerName", issuerName)

        .queryParam("applicationName", applicationName);



    HttpEntity<?> entity = new HttpEntity<>(headers);



    HttpEntity<String> response = restTemplate.exchange(

        builder.build().encode().toUri(),

        HttpMethod.GET,

        entity,

        String.class);

 

 

 

© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 92
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
180815-Spring之RestTemplate中级使用篇

Spring之RestTemplate中级使用篇 前面一篇介绍了如何使用发起post和get请求,然而也只能满足一些基本的场景,对于一些特殊的如需要设置请求头,添加认证信息等场景,却没有提及可以怎么做,这...

小灰灰Blog
2018/08/15
0
0
跟我学Spring Cloud(Finchley版)-07-Ribbon入门

经过前文讲述,我们已经实现了服务发现。本节来解决 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 提到的如下问题: 负载均衡如何考虑?难道得在电影微服务和用户微服务之间加个NGI...

周立_ITMuch
01/06
0
0
Spring框架中发送http请求--RestTemplate

环境搭建 本文环境指的 Spring Boot下1.4.2版本下 pom.xml (核心内容) <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <versi......

onedotdot
2018/10/17
0
0
SQL模糊查询通配符_和%处理

下划线和百分号在sql模糊查询like语句中为特殊字符,分别可匹配1个字符和0到多个字符,如果需要真正查询特殊字符得转义,如like 'a_b%' escape '',将匹配前3个字符为a_b的所有记录。 1、Pre...

无知有趣
2014/08/19
0
0
网站mysql防止sql注入攻击 3种方法总结

mysql数据库一直以来都遭受到sql注入攻击的影响,很多网站,包括目前的PC端以及手机端都在使用php+mysql数据库这种架构,大多数网站受到的攻击都是与sql注入攻击有关,那么mysql数据库如何防...

网站安全
2018/10/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
1
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
1
0
推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
昨天
3
0
雷军亲自打造的套餐了解下:用多少付多少

12月28日消息,小米科技创始人兼CEO雷军微博表示,小米移动任我行套餐方案,原则上就是明明白白消费,用多少付多少,不用不花钱!上网、电话和短信都是一毛钱,上网0.1元/M,电话0.1元/分钟,...

linuxCool
昨天
6
0
协议简史:如何学习网络协议?

大学时,学到网络协议的7层模型时,老师教了大家一个顺口溜:物数网传会表应。并说这是重点,年年必考,5分的题目摆在这里,你们爱背不背。 考试的时候,果然遇到这个问题,搜索枯肠,只能想...

Java干货分享
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部