基于Spring的Rest服务中乱码问题

Spring搭建的Rest服务端

在使用客户端调用Rest服务时,出现了中文乱码问题

这个要从两个方面解决


1、客户端

客户端是调用RestTemplate 发送请求的,默认使用了 StringHttpMessageConverter 这个转换类 ,查看spring源码,发现默认是ISO-8859的编码

修改方法1:把StringHttpMessageConverter类重新修改下 ,打包到Springjar包里面
修改方法2:重新写一个 Converter ,然后RestTemplate 配置这个转换类


<bean id="httpClientFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory">
<property name="connectTimeout" value="10000"/>
<property name="readTimeout" value="10000"/>
</bean>
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg ref="httpClientFactory"/>
<property name="messageConverters">
<list>
<bean id="byteArrayHttpMessageConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
<bean id="resourceHttpMessageConverter" class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>
<bean id="stringHttpMessageConverter" class="OtherMessageConverter"></bean>
</list>
</property>
</bean>



在开发过程中,有后台服务访问远程rest接口的需求,采用spring 框架中的RestTemplate类实现。
RestTemplate类位于org.springframework.web.client包中,提供Http的各类方法:如Get,Head,Post,Put,Delete等,用于访问rest接口,本文以get方法举个简单的例子,介绍RestTemplate类的使用。

RestTemplate有两个构造方法,分别是:

public RestTemplate() {
/**
...初始化过程
*/
}

public RestTemplate(ClientHttpRequestFactory requestFactory) {
this();
setRequestFactory(requestFactory);
}
其中,第二个构造方法中可以传入ClientHttpRequestFactory参数,第一个进行默认初始化,需求中我们需要对请求超时进行设置并能够对超时进行后续处理,第一个构造方法,我们无法控制超时时间,第二个构造中的ClientHttpRequestFactory接口的实现类中存在timeout属性,因此选用第二个构造方法。
在spring配置文件中进行如下配置:

<!-- 配置RestTemplate -->
<!--Http client Factory-->
<bean id="httpClientFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory">
<property name="connectTimeout" value="${connectTimeout}"/>
<property name="readTimeout" value="${readTimeout}"/>
</bean>

<!--RestTemplate-->
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg ref="httpClientFactory"/>
</bean>

注意:ClientHttpRequestFactory 接口有4个实现类,分别是:
1.AbstractClientHttpRequestFactoryWrapper 用来装配其他request factory的抽象类。
2.CommonsClientHttpRequestFactory 允许用户配置带有认证和http连接池的httpclient,已废弃,推荐用HttpComponentsClientHttpRequestFactory。
3.HttpComponentsClientHttpRequestFactory 同2.
4.SimpleClientHttpRequestFactory 接口的一个简单实现,可配置proxy,connectTimeout,readTimeout等参数。
本文中使用的是第4个实现,具体的根据个人需求再选在使用哪个。

程序中如何使用:

1.在服务类中自动注入:
@Qualifier("restTemplate")
@Autowired
private RestTemplate restTemplate;

2. Map<String, Object> urlVariables = new HashMap<String, Object>();
urlVariables.put("param1",param1);
urlVariables.put("param2",param2);

JSONObject result = restTemplate.getForObject(restURI,
JSONObject.class, urlVariables);
方法的使用详细大家再查api。


2、服务端
有些情况服务端也需要做处理

检查tomcat的配置,server.xml
web.xml 中增加utf-8过滤器


<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值