`

spring RestTemplate用法详解

 
阅读更多

前面介绍过spring的MVC结合不同的view显示不同的数据,如:结合json的view显示json、结合xml的view显示xml文档。那么这些数据除了在WebBrowser中用JavaScript来调用以外,还可以用远程服务器的Java程序、C#程序来调用。也就是说现在的程序不仅在BS中能调用,在CS中同样也能调用,不过你需要借助RestTemplate这个类来完成。RestTemplate有点类似于一个WebService客户端请求的模版,可以调用http请求的WebService,并将结果转换成相应的对象类型。至少你可以这样理解!

 

Blog:http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

 

一、准备工作

1、 下载jar包

spring各版本jar下载地址:http://ebr.springsource.com/repository/app/library/detail?name=org.springframework.spring

相关的依赖包也可以在这里找到:http://ebr.springsource.com/repository/app/library

 

2、 需要jar包如下

clip_image002

 

3、 当前工程的web.xml配置

xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
    
    <servlet>
        <servlet-name>dispatcherservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>/WEB-INF/dispatcher.xmlparam-value>
        init-param>
        <load-on-startup>1load-on-startup>
    servlet>
    
    <servlet-mapping>
        <servlet-name>dispatcherservlet-name>
        <url-pattern>*.dourl-pattern>
    servlet-mapping>
    
    <welcome-file-list>
      <welcome-file>index.jspwelcome-file>
    welcome-file-list>
web-app>

 

4、 WEB-INF中的dispatcher.xml配置

xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util-3.0.xsd">
 
    <context:component-scan base-package="com.hoo.*">
        
        <context:exclude-filter type="assignable" expression="com.hoo.client.RESTClient"/>
    context:component-scan>
 
    
    <bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
    
    
    <bean name="xStreamMarshallingView" class="org.springframework.web.servlet.view.xml.MarshallingView">
        <property name="marshaller">
            <bean class="org.springframework.oxm.xstream.XStreamMarshaller">  
                
                <property name="autodetectAnnotations" value="true"/>  
            bean>  
        property>
    bean>
        
    
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="3"/>
    bean>
 
    
    <bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="order" value="1" />
    bean>
    
beans>

5、 启动后,可以看到index.jsp 没有出现异常或错误。那么当前SpringMVC的配置就成功了。

 

二、REST控制器实现

REST控制器主要完成CRUD操作,也就是对于http中的post、get、put、delete。

还有其他的操作,如head、options、trace。

具体代码:

package com.hoo.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
 
/**
 * function:SpringMVC REST示例
 * @author hoojo
 * @createDate 2011-6-9 上午11:34:08
 * @file RESTController.java
 * @package com.hoo.controller
 * @project SpringRestWS
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
@RequestMapping("/restful")
@Controller
public class RESTController {
    
    @RequestMapping(value = "/show", method = RequestMethod.GET)
    public ModelAndView show() {
        System.out.println("show");
        ModelAndView model = new ModelAndView("xStreamMarshallingView");
        model.addObject("show method");
        return model; 
    }
    
    @RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
    public ModelAndView getUserById(@PathVariable String id) {
        System.out.println("getUserById-" + id);
        ModelAndView model = new ModelAndView("xStreamMarshallingView");
        model.addObject("getUserById method -" + id);
        return model; 
    }
    
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public ModelAndView addUser(String user) {
        System.out.println("addUser-" + user);
        ModelAndView model = new ModelAndView("xStreamMarshallingView");
        model.addObject("addUser method -" + user);
        return model; 
    }
    
    @RequestMapping(value = "/edit", method = RequestMethod.PUT)
    public ModelAndView editUser(String user) {
        System.out.println("editUser-" + user);
        ModelAndView model = new ModelAndView("xStreamMarshallingView");
        model.addObject("editUser method -" + user);
        return model;
    }
    
    @RequestMapping(value = "/remove/{id}", method = RequestMethod.DELETE)
    public ModelAndView removeUser(@PathVariable String id) {
        System.out.println("removeUser-" + id);
        ModelAndView model = new ModelAndView("xStreamMarshallingView");
        model.addObject("removeUser method -" + id);
        return model;
    }
}

上面的方法对应的http操作:

/show -> get 查询
/get/id -> get 查询
/add -> post 添加
/edit -> put 修改
/remove/id -> delete 删除

在这个方法中,就可以看到RESTful风格的url资源标识

@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
public ModelAndView getUserById(@PathVariable String id) {
    System.out.println("getUserById-" + id);
    ModelAndView model = new ModelAndView("xStreamMarshallingView");
    model.addObject("getUserById method -" + id);
    return model; 
}

value=”/get/{id}”就是url中包含get,并且带有id参数的get请求,就会执行这个方法。这个url在请求的时候,会通过Annotation的@PathVariable来将url中的id值设置到getUserById的参数中去。 ModelAndView返回的视图是xStreamMarshallingView是一个xml视图,执行当前请求后,会显示一篇xml文档。文档的内容是添加到model中的值。

 

三、利用RestTemplate调用REST资源

代码如下:

package com.hoo.client;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
 
/**
 * function:RestTemplate调用REST资源
 * @author hoojo
 * @createDate 2011-6-9 上午11:56:16
 * @file RESTClient.java
 * @package com.hoo.client
 * @project SpringRestWS
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
@Component
public class RESTClient {
    
    @Autowired
    private RestTemplate template;
    
    private final static String url = "http://localhost:8080/SpringRestWS/restful/";
    
    public String show() {
        return template.getForObject(url + "show.do", String.class, new String[]{});
    }
    
    public String getUserById(String id) {
        return template.getForObject(url + "get/{id}.do", String.class, id); 
    }
    
    public String addUser(String user) {
        return template.postForObject(url + "add.do?user={user}", null, String.class, user);
    }
    
    public String editUser(String user) {
        template.put(url + "edit.do?user={user}", null, user);
        return user;
    }
    
    public String removeUser(String id) {
        template.delete(url + "/remove/{id}.do", id);
        return id;
    }
}

RestTemplate的getForObject完成get请求、postForObject完成post请求、put对应的完成put请求、delete完成delete请求;还有execute可以执行任何请求的方法,需要你设置RequestMethod来指定当前请求类型。

RestTemplate.getForObject(String url, Class responseType, String... urlVariables)

参数url是http请求的地址,参数Class是请求响应返回后的数据的类型,最后一个参数是请求中需要设置的参数。

template.getForObject(url + "get/{id}.do", String.class, id);

如上面的参数是{id},返回的是一个string类型,设置的参数是id。最后执行该方法会返回一个String类型的结果。

 

下面建立一个测试类,完成对RESTClient的测试。代码如下:

package com.hoo.client;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit38.AbstractJUnit38SpringContextTests;
 
/**
 * function:RESTClient TEST
 * @author hoojo
 * @createDate 2011-6-9 下午03:50:21
 * @file RESTClientTest.java
 * @package com.hoo.client
 * @project SpringRestWS
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
@ContextConfiguration("classpath:applicationContext-*.xml")
public class RESTClientTest extends AbstractJUnit38SpringContextTests {
    
    @Autowired
    private RESTClient client;
    
    public void testShow() {
        System.out.println(client.show());
    }
    
    public void testGetUserById() {
        System.out.println(client.getUserById("abc"));
    }
    
    public void testAddUser() {
        System.out.println(client.addUser("jack"));
    }
    
    public void testEditUser() {
        System.out.println(client.editUser("tom"));
    }
    
    public void testRemoveUser() {
        System.out.println(client.removeUser("aabb"));
    }
}

我们需要在src目录下添加applicationContext-beans.xml完成对restTemplate的配置。restTemplate需要配置MessageConvert将返回的xml文档进行转换,解析成JavaObject。

xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
    <context:component-scan base-package="com.hoo.*"/>
    
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                    <property name="marshaller" ref="xStreamMarshaller"/>
                    <property name="unmarshaller" ref="xStreamMarshaller"/>
                bean>
            list>
        property>
    bean>
    
    <bean id="xStreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="annotatedClasses">
            <array>                
            array>
        property>
    bean>
beans>

上面配置了xStreamMarshaller是和RESTController中的ModelAndView的view对应的。因为那边是用xStreamMarshaller进行编组的,所以RestTemplate这边也需要用它来解组。RestTemplate还指出其他的MarshallingHttpMessageConverter;

分享到:
评论

相关推荐

    Spring RestTemplate具体使用详解

    Spring RestTemplate具体使用详解 RestTemplate是Spring框架中的一种ynchronous客户端HTTP访问的核心类,简化了与HTTP服务器的通信,并强制实施RESTful原则。它处理HTTP连接,让应用程序代码提供URL(可能具有模板...

    精讲RestTemplate,POST请求方法使用详解.docx

    ### 精讲RestTemplate,POST请求方法使用详解 #### 一、理解RestTemplate POST请求方法 RestTemplate 是 Spring 框架中的一个重要组件,它提供了多种便捷访问远程 HTTP 服务的方法,不仅可以发送请求,还能从...

    Spring Cloud微服务开发实践

    7、RestTemplate 用法详解 8、 服务请求负载均衡 9、声明式服务调用 Feign 10、Feign 中的继承、日志与数据压缩 11、Resilience4j 基本用法详解 12、Resilience4j 在微服务中的应用 13、Micrometer 实现微服务监控 ...

    Spring boot,springCloud精选视频教程

    18.Spring Cloud中Feign配置详解 19.Spring Cloud中的API网关服务Zuul 20.Spring Cloud Zuul中路由配置细节 21.Spring Cloud Zuul中异常处理细节 22.分布式配置中心Spring Cloud Config初窥 23.Spring Cloud ...

    RestTemplate的GET方法详解.docx

    RestTemplate是Spring框架中用于处理HTTP客户端操作的重要工具,它提供了多种方法来发送HTTP请求,如GET、POST、PUT等。在本篇文章中,我们将详细探讨两个常用的GET方法:`getForObject()`和`getForEntity()`。 1. ...

    微服务生态组件之Spring Cloud LoadBalancer详解和源码分析.doc

    我们使用Spring官方提供了负载均衡的客户端之一RestTemplate,RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。...

    SpringCloud - Nacos详解

    **SpringCloud - Nacos详解** 在微服务架构中,服务治理和配置管理是至关重要的环节。Spring Cloud作为一套完整的微服务解决方案,提供了多种组件来解决这些问题。其中,Nacos是Spring Cloud生态中的一个核心组件,...

    基于RestTemplate的使用方法(详解)

    本篇文章将深入讲解如何使用`RestTemplate`。 ### 1. `postForObject` 方法 `postForObject` 是`RestTemplate` 的核心方法之一,用于执行POST请求,并将响应转换为指定的对象。主要有两种使用方式: #### (1) ...

    RestTemplate集成Ribbbon的示例代码

    RestTemplate集成Ribbon的示例代码详解 RestTemplate是 Spring 框架提供的一个RESTful 风格的远程调用模板,通过它可以轻松地实现RESTful风格的远程调用,而Ribbon是一个提供负载均衡和服务调用功能的组件。今天,...

    springcloud微服务技术栈-个人笔记文档(基础篇)

    【SpringCloud微服务技术栈详解】 SpringCloud 是一套完整的微服务解决方案,它为开发者提供了构建分布式系统所需的工具,包括服务发现、配置管理、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导...

    基于Java的Spring Boot项目开发指南.zip

    2. SpringRetry实现重试机制,常与RestTemplate配合使用。 3. Elasticsearch实现分布式搜索和分析引擎功能。 4. OAuth2实现OAuth2认证机制。 5. Stream学习JDK8的Stream用法。 6. CAS实现CAS单点登录服务端和客户端...

    详解Java Chassis 3与Spring Cloud的互操作.txt

    ### 详解Java Chassis 3与Spring Cloud的互操作 #### 一、引言 随着微服务架构的兴起,各种微服务开发框架和技术栈层出不穷,其中Java Chassis 3和Spring Cloud作为两个主流的选择,各自拥有强大的功能和广泛的...

    Spring5中的WebClient使用方法详解

    Spring5 中的 WebClient 使用方法详解 Spring5 中引入的 WebClient 是一个功能完善的 HTTP 客户端,相比 RestTemplate 有很多优势。下面将详细介绍 WebClient 的使用方法。 WebClient 的介绍 WebClient 是 Spring...

    spring netty 整合 源代码

    5. **客户端交互**:创建Netty客户端,同样利用Spring管理的bean进行通信,也可以使用Spring的RestTemplate或者WebSocket客户端库。 6. **处理业务逻辑**:在处理器中,可以通过Spring的Service或Repository来处理...

    Spring Cloud应用程序.zip

    《Spring Cloud应用程序详解》 Spring Cloud作为微服务架构的重要组件,提供了一系列的工具和服务,使得开发者可以快速构建出分布式的系统。本篇文章将深入探讨在"Spring Cloud应用程序.zip"中包含的关键技术点,...

    spring-boot级spring-cloud视频教学

    - **声明式服务调用**:使用Feign可以以声明的方式定义服务接口,无需显式地创建RestTemplate对象进行HTTP请求。 5. **Ribbon负载均衡**: - **客户端负载均衡**:Ribbon是一个基于HTTP和TCP的客户端负载均衡器,...

    Spring Android Reference Manual

    二、Spring Android RestTemplate模块详解 2.1 引言 Spring Android的RestTemplate模块为Android应用程序提供了一个高效且灵活的HTTP客户端。它封装了与远程服务器进行HTTP通信的细节,支持各种HTTP方法,如GET、...

    详解使用Spring的restTemplete进行Http请求

    使用 Spring 的 RestTemplate 进行 HTTP 请求详解 使用 Spring 框架的 RestTemplate 对象可以简化 HTTP 请求的发送过程,并提供了丰富的配置和自定义选项。在本篇文章中,我们将详细介绍如何使用 RestTemplate 对象...

    多图详解Spring框架的设计理念与设计模式.doc

    本文将深入探讨Spring的核心设计理念和使用的设计模式。 首先,Spring的核心组件包括Core、Context和Beans。这三个组件共同构建了Spring的基础架构。Core组件提供了核心工具类,如BeanFactory,它是管理Bean的工厂...

Global site tag (gtag.js) - Google Analytics