文档章节

RestTemplate 查询参数有特殊字符

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

前面说到如何使用 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
粉丝 91
博文 240
码字总数 210196
作品 0
深圳
程序员
180815-Spring之RestTemplate中级使用篇

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

小灰灰Blog
08/15
0
0
SQL模糊查询通配符_和%处理

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

无知有趣
2014/08/19
0
0
RestTemplate 深度解析

补充 2016年6月12日:从 Spring 4.3 开始加入了 一、概述 本文主要介绍 Spring Web 模块中的 RestTemplate 组件的原理、优缺点、以及如何扩展以满足各种需求。 在介绍 RestTemplate 之前,我...

编走编想
2016/06/08
1K
5
Spring REST

前面介绍过Spring的MVC结合不同的view显示不同的数据,如:结合json的view显示json、结合xml的view显示xml文档。那么这些数据除了在WebBrowser中用JavaScript来调用以外,还可以用远程服务器...

ibm_hoojo
2011/06/10
0
0
Spring RestTemplate 实践

什么是RestTemplate? RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 调用RestTemplate的默认构...

单红宇
2016/03/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
2
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
117
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
4
0
我为什么用GO语言来做区块链?

Go语言现在常常被用来做去中心化系统(decentralised system)。其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地。 我们在决定做Karachain的时候,考量(b...

HiBlock
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部