`
bdk82924
  • 浏览: 562226 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

基于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>
分享到:
评论

相关推荐

    基于AJAX结合SpringMVC的信息访问服务模式研究

    【基于AJAX结合SpringMVC的信息...通过解决中文乱码问题,可以确保信息在整个传输过程中的正确性,提升了服务质量和用户体验。在实际开发中,开发者应当重视编码的统一和数据格式的规范,以确保服务的稳定性和可靠性。

    springmvc-restful

    在IT行业中,Spring MVC是一个广泛使用的Java Web框架,它提供了构建...而文件"SpringMVC_05_restful"可能包含了实现上述功能的代码示例,你可以通过查阅这些文件,加深对Spring MVC处理RESTful API及乱码问题的理解。

    REST_TEST_API

    在Java中,我们通常使用Spring Boot框架来开发RESTful API,因为它提供了便捷的注解和模型来创建REST服务。例如,`@RestController`注解标识一个类为处理HTTP请求的控制器,`@GetMapping`、`@PostMapping`等注解用于...

    第30讲--Spring提供的CharacterEncoding和OpenSessionInView功能

    因此,在实际应用中,应结合具体需求谨慎使用,并考虑使用更现代的解决方案,如Spring Data JPA的Repository Rest Repositories,它们提供了更高效的透明数据访问。 总结一下,CharacterEncodingFilter和...

    Java面试框架高频问题2019

    **问题五:请介绍一下Spring框架中Bean的生命周期和作用域** - **Bean的生命周期**:主要包括创建、依赖注入、初始化、运行和销毁五个阶段。 - **Bean的作用域**:指定了bean实例的有效范围,主要有以下几种: - *...

    工作日志_李响115_202109021

    在服务间的通信中,可能会遇到编码问题,比如GET参数乱码。这通常需要在发送请求时指定正确的字符编码。对于图片显示问题,可能是因为Pojo对象的getter方法不正确导致数据传输过程中出现问题,需要调整getter方法以...

    使用RESTEasy构建WebService简介

    综合上述知识点,使用RESTEasy框架构建WebService的整个过程,从项目初始化、资源类的编写、服务类的实现、拦截器的使用、文件上传的处理、与Spring框架的集成,以及前端请求的编码问题解决等方面都提供了一个清晰的...

    Spring MVC 关于controller的字符编码问题

    总结来说,Spring MVC中处理Controller的字符编码问题主要是通过设置响应的`Content-Type`,使用`@RequestMapping`的`produces`属性,或者直接操作`HttpServletResponse`来指定字符集。同时,了解如何使用不同的参数...

    jquery 自动提示

    总结:通过以上步骤,我们可以实现一个基于jQuery的下拉框自动提示功能,同时解决了前后台中文乱码问题。对于不同的后端框架,如Spring MVC或Struts2,只需要将Servlet替换为相应的Controller或Action,保持相同的...

    ddmodemo.zip

    确保SpringBoot配置支持中文,如设置字符编码为UTF-8,以避免中文乱码问题。 2. **安装Flask**:在Python环境中安装Flask,使用pip命令`pip install flask`。同时,为了实现前后端通信,我们还需要安装requests库,...

    springmvc之获取参数的方法(必看)

    SpringMVC是一种基于Java的Web应用程序框架,它提供了一种简洁、灵活的方式来开发Web应用程序。在SpringMVC中,获取参数是非常重要的一步骤,因为它影响着整个应用程序的运行。下面,我们将详细介绍SpringMVC之获取...

Global site tag (gtag.js) - Google Analytics