RestTemplate 介绍

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

服务消费者实现

业务需求说明

实现:通过红包系统访问订单系统,获得某个用户的订单信息,派发红包.

red-sys:服务的消费者

Order-sys:服务的提供者

red-sys 给 order-sys 的 Controller 发送 http 请求

创建 red-sys 项目

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.bjsxt</groupId>
  7. <artifactId>red-sys</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <packaging>war</packaging>
  10. <properties>
  11. <!-- spring 依赖 -->
  12. <spring.version>4.3.18.RELEASE</spring.version>
  13. <jstl.version>1.2</jstl.version>
  14. <servlet-api.version>2.5</servlet-api.version>
  15. <jsp-api.version>2.0</jsp-api.version>
  16. <jackson.version>2.9.0</jackson.version>
  17. </properties>
  18. <dependencies>
  19. <!-- jsp相关依赖 -->
  20. <!-- servlet依赖 -->
  21. <!-- jstl依赖 -->
  22. <dependency>
  23. <groupId>jstl</groupId>
  24. <artifactId>jstl</artifactId>
  25. <version>${jstl.version}</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>javax.servlet</groupId>
  29. <artifactId>servlet-api</artifactId>
  30. <version>${servlet-api.version}</version>
  31. <scope>provided</scope>
  32. </dependency>
  33. <dependency>
  34. <groupId>javax.servlet</groupId>
  35. <artifactId>jsp-api</artifactId>
  36. <version>${jsp-api.version}</version>
  37. <scope>provided</scope>
  38. </dependency>
  39. <!-- springmvc依赖-->
  40. <dependency>
  41. <groupId>org.springframework</groupId>
  42. <artifactId>spring-webmvc</artifactId>
  43. <version>${spring.version}</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>com.fasterxml.jackson.core</groupId>
  47. <artifactId>jackson-databind</artifactId>
  48. <version>${jackson.version}</version>
  49. </dependency>
  50. </dependencies>
  51. <build>
  52. <finalName>red</finalName>
  53. <plugins>
  54. <!-- 配置Tomcat插件 -->
  55. <plugin>
  56. <groupId>org.apache.tomcat.maven</groupId>
  57. <artifactId>tomcat7-maven-plugin</artifactId>
  58. <version>2.2</version>
  59. <configuration>
  60. <path>/red</path>
  61. <port>8080</port>
  62. </configuration>
  63. </plugin>
  64. </plugins>
  65. </build>
  66. </project>

Order实体类:

  1. package com.bjsxt.pojo;
  2. public class Order {
  3. private int id;
  4. private Double total;
  5. private String date;
  6. public Order(int id, Double total, String date) {
  7. this.id = id;
  8. this.total = total;
  9. this.date = date;
  10. }
  11. public Order(){}
  12. @Override
  13. public String toString() {
  14. return "Order{" +
  15. "id=" + id +
  16. ", total=" + total +
  17. ", date='" + date + '\'' +
  18. '}';
  19. }
  20. public int getId() {
  21. return id;
  22. }
  23. public void setId(int id) {
  24. this.id = id;
  25. }
  26. public Double getTotal() {
  27. return total;
  28. }
  29. public void setTotal(Double total) {
  30. this.total = total;
  31. }
  32. public String getDate() {
  33. return date;
  34. }
  35. public void setDate(String date) {
  36. this.date = date;
  37. }
  38. }

创建 RedController

  1. package com.bjsxt.controller;
  2. import com.bjsxt.pojo.Order;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.http.HttpHeaders;
  5. import org.springframework.http.ResponseEntity;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.util.LinkedMultiValueMap;
  8. import org.springframework.util.MultiValueMap;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.ResponseBody;
  11. import org.springframework.web.client.RestTemplate;
  12. import java.util.Arrays;
  13. import java.util.List;
  14. import java.util.Map;
  15. @Controller
  16. public class RedController {
  17. //注入由spring提供的RestTemplate对象
  18. @Autowired
  19. RestTemplate restTemplate;
  20. @RequestMapping("/loadOrderList")
  21. @ResponseBody
  22. public List<Order> loadOrderList01(String uid){
  23. //发送远程http请求URL
  24. String url="http://localhost:7070/order/loadOrderList";
  25. //发送到远程服务参数
  26. MultiValueMap<String,Object> params=new LinkedMultiValueMap<>();
  27. params.add("uid",uid);
  28. //通过RestTemplate对象发送远程post请求
  29. Order[] orders = restTemplate.postForObject(url, params, Order[].class);
  30. return Arrays.asList(orders);
  31. }
  32. //获得订单对象的集合
  33. @RequestMapping("/loadOrderList2")
  34. @ResponseBody
  35. public List<Order> loadOrderList02(String uid){
  36. //发送远程http请求URL
  37. String url="http://localhost:7070/order/loadOrderList2";
  38. //发送到远程服务参数
  39. MultiValueMap<String,Object> params=new LinkedMultiValueMap<>();
  40. params.add("uid",uid);
  41. //通过RestTemplate对象发送远程post请求
  42. ResponseEntity<Order[]> entity = restTemplate.postForEntity(url, params, Order[].class);
  43. //获取响应头信息
  44. HttpHeaders headers = entity.getHeaders();
  45. //遍历
  46. for (Map.Entry<String,List<String>> e:headers.entrySet()) {
  47. System.out.println(e.getKey()+"------"+e.getValue());
  48. }
  49. //获取响应的状态
  50. int status=entity.getStatusCodeValue();
  51. System.out.println(status);
  52. //获取远程对象的响应实体
  53. Order[] body = entity.getBody();
  54. return Arrays.asList(body);
  55. }
  56. }

配置 springmvc.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!-- 扫描controller -->
  13. <context:component-scan base-package="com.bjsxt.controller" />
  14. <mvc:annotation-driven></mvc:annotation-driven>
  15. <!-- 实例化RestTemplate对象 -->
  16. <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"></bean>
  17. </beans>

配置 web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <display-name>order</display-name>
  7. <welcome-file-list>
  8. <welcome-file>index.html</welcome-file>
  9. <welcome-file>index.htm</welcome-file>
  10. <welcome-file>index.jsp</welcome-file>
  11. <welcome-file>default.html</welcome-file>
  12. <welcome-file>default.htm</welcome-file>
  13. <welcome-file>default.jsp</welcome-file>
  14. </welcome-file-list>
  15. <servlet-mapping>
  16. <servlet-name>default</servlet-name>
  17. <url-pattern>/favicon.ico</url-pattern>
  18. </servlet-mapping>
  19. <!-- 以监听器的方式启动spring容器 -->
  20. <!-- <listener>
  21. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  22. </listener>-->
  23. <!-- &lt;!&ndash; 指定spring的配置文件 &ndash;&gt;
  24. <context-param>
  25. <param-name>contextConfigLocation</param-name>
  26. <param-value>classpath:applicationContext-*.xml</param-value>
  27. </context-param>-->
  28. <!-- POST请求的乱码过滤器 -->
  29. <filter>
  30. <filter-name>encodingFilter</filter-name>
  31. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  32. <!-- 指定编码方式 -->
  33. <init-param>
  34. <param-name>encoding</param-name>
  35. <param-value>utf-8</param-value>
  36. </init-param>
  37. </filter>
  38. <!-- 映射filter -->
  39. <filter-mapping>
  40. <filter-name>encodingFilter</filter-name>
  41. <url-pattern>/*</url-pattern>
  42. </filter-mapping>
  43. <!-- springmvc的servlet -->
  44. <servlet>
  45. <servlet-name>springmvc</servlet-name>
  46. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  47. <!-- 指定springmvc的配置文件 -->
  48. <init-param>
  49. <param-name>contextConfigLocation</param-name>
  50. <param-value>classpath:springmvc.xml</param-value>
  51. </init-param>
  52. <!-- 让springmvc随系统启动而启动 -->
  53. <load-on-startup>1</load-on-startup>
  54. </servlet>
  55. <servlet-mapping>
  56. <servlet-name>springmvc</servlet-name>
  57. <url-pattern>/</url-pattern>
  58. </servlet-mapping>
  59. </web-app>

创建 order-sys 项目

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.bjsxt</groupId>
  7. <artifactId>order-sys</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <packaging>war</packaging>
  10. <properties>
  11. <!-- spring 依赖 -->
  12. <spring.version>4.3.18.RELEASE</spring.version>
  13. <jstl.version>1.2</jstl.version>
  14. <servlet-api.version>2.5</servlet-api.version>
  15. <jsp-api.version>2.0</jsp-api.version>
  16. <jackson.version>2.9.0</jackson.version>
  17. </properties>
  18. <dependencies>
  19. <!-- jsp相关依赖 -->
  20. <!-- servlet依赖 -->
  21. <!-- jstl依赖 -->
  22. <dependency>
  23. <groupId>jstl</groupId>
  24. <artifactId>jstl</artifactId>
  25. <version>${jstl.version}</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>javax.servlet</groupId>
  29. <artifactId>servlet-api</artifactId>
  30. <version>${servlet-api.version}</version>
  31. <scope>provided</scope>
  32. </dependency>
  33. <dependency>
  34. <groupId>javax.servlet</groupId>
  35. <artifactId>jsp-api</artifactId>
  36. <version>${jsp-api.version}</version>
  37. <scope>provided</scope>
  38. </dependency>
  39. <!-- springmvc依赖-->
  40. <dependency>
  41. <groupId>org.springframework</groupId>
  42. <artifactId>spring-webmvc</artifactId>
  43. <version>${spring.version}</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>com.fasterxml.jackson.core</groupId>
  47. <artifactId>jackson-databind</artifactId>
  48. <version>${jackson.version}</version>
  49. </dependency>
  50. <dependency>
  51. <groupId>com.thetransactioncompany</groupId>
  52. <artifactId>cors-filter</artifactId>
  53. <version>2.5</version>
  54. <scope>runtime</scope>
  55. </dependency>
  56. <!-- fastjson -->
  57. <dependency>
  58. <groupId>com.alibaba</groupId>
  59. <artifactId>fastjson</artifactId>
  60. <version>1.2.47</version>
  61. </dependency>
  62. </dependencies>
  63. <build>
  64. <finalName>order</finalName>
  65. <plugins>
  66. <!-- 配置Tomcat插件 -->
  67. <plugin>
  68. <groupId>org.apache.tomcat.maven</groupId>
  69. <artifactId>tomcat7-maven-plugin</artifactId>
  70. <version>2.2</version>
  71. <configuration>
  72. <path>/order</path>
  73. <port>7070</port>
  74. </configuration>
  75. </plugin>
  76. </plugins>
  77. </build>
  78. </project>

创建 OrderController

  1. package com.bjsxt.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.bjsxt.pojo.Order;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.ui.Model;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. import java.text.SimpleDateFormat;
  9. import java.util.ArrayList;
  10. import java.util.Date;
  11. import java.util.List;
  12. @Controller
  13. public class OrderController {
  14. @RequestMapping("/loadOrderList")
  15. public String loadOrderList(String uid, Model mode){
  16. Date now =new Date();
  17. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  18. String date = sdf.format(now);
  19. Order order1=new Order();
  20. order1.setId(1001);
  21. order1.setTotal(123.0);
  22. order1.setDate(date);
  23. Order order2=new Order();
  24. order2.setId(1002);
  25. order2.setTotal(1234.0);
  26. order2.setDate(date);
  27. Order order3=new Order();
  28. order3.setId(1003);
  29. order3.setTotal(13.0);
  30. order3.setDate(date);
  31. List<Order> list=new ArrayList<>();
  32. list.add(order1);
  33. list.add(order2);
  34. list.add(order3);
  35. mode.addAttribute("list",list);
  36. return "index.jsp";
  37. }
  38. //接收http请求,响应订单集合,完成的是异步响应 将List集合序列化为json串响应
  39. @RequestMapping("/loadOrderList2")
  40. @ResponseBody
  41. public List<Order> loadOrderList2(String uid, Model mode){
  42. System.out.println("uid="+uid);
  43. Date now =new Date();
  44. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  45. String date = sdf.format(now);
  46. Order order1=new Order();
  47. order1.setId(1001);
  48. order1.setTotal(123.0);
  49. order1.setDate(date);
  50. Order order2=new Order();
  51. order2.setId(1002);
  52. order2.setTotal(1234.0);
  53. order2.setDate(date);
  54. Order order3=new Order();
  55. order3.setId(1003);
  56. order3.setTotal(13.0);
  57. order3.setDate(date);
  58. List<Order> list=new ArrayList<>();
  59. list.add(order1);
  60. list.add(order2);
  61. list.add(order3);
  62. mode.addAttribute("list",list);
  63. return list;
  64. }
  65. @RequestMapping("/loadOrderList3")
  66. @ResponseBody
  67. public String loadOrderList3(String uid, String callback){
  68. System.out.println("uid="+uid);
  69. Date now =new Date();
  70. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  71. String date = sdf.format(now);
  72. Order order1=new Order();
  73. order1.setId(1001);
  74. order1.setTotal(123.0);
  75. order1.setDate(date);
  76. Order order2=new Order();
  77. order2.setId(1002);
  78. order2.setTotal(1234.0);
  79. order2.setDate(date);
  80. Order order3=new Order();
  81. order3.setId(1003);
  82. order3.setTotal(13.0);
  83. order3.setDate(date);
  84. List<Order> list=new ArrayList<>();
  85. list.add(order1);
  86. list.add(order2);
  87. list.add(order3);
  88. String result=callback+"("+ JSON.toJSONString(list) +")";
  89. return result;
  90. }
  91. }

index.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <c:forEach items="${list }" var="o">
  12. ${o.id}----${o.total}----${o.date}
  13. <hr/>
  14. </c:forEach>
  15. </body>
  16. </html>

springmvc.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!-- 扫描controller -->
  13. <context:component-scan base-package="com.bjsxt.controller" />
  14. <mvc:annotation-driven></mvc:annotation-driven>
  15. </beans>

启动 order-sys

启动访问 red-sys

使用 Spring 提供的 restTemplate 完成 Http 服务消费的更多相关文章

  1. Spring提供的用于访问Rest服务的客户端:RestTemplate实践

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

  2. Spring Cloud Alibaba 使用Feign进行服务消费

    为什么使用Feign? Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样.你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做. 使用Fei ...

  3. 使用 RestTemplate 调用 restful 服务

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

  4. Spring Boot使用RestTemplate消费REST服务的几个问题记录

    我们可以通过Spring Boot快速开发REST接口,同时也可能需要在实现接口的过程中,通过Spring Boot调用内外部REST接口完成业务逻辑. 在Spring Boot中,调用REST Ap ...

  5. Spring Cloud(三):服务提供与调用 Eureka【Finchley 版】

    Spring Cloud(三):服务提供与调用 Eureka[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  上一篇文章我们介绍了 Eureka 服务 ...

  6. Spring Cloud Alibaba 使用RestTemplate进行服务消费

    创建服务提供者工程 创建spring-cloud-alibaba-service-member工程,会员中心服务该服务提供用户会员信息. pom.xml <?xml version=" ...

  7. Spring Cloud Alibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)

    通过<Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现>一文的学习,我们已经学会如何使用Nacos来实现服务的注册与发现,同时也介绍如何通过LoadBal ...

  8. 【译文】用Spring Cloud和Docker搭建微服务平台

    by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...

  9. spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法

    spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...

随机推荐

  1. Hibernate的多对多关系

    1.表的关系: 分别有三个表:课程表.学生表.分数表.课程和学生的关系是多对多的,因为一个学生对应多个课程,而一个课程被多个学生选修.如果用一对多.多对一的观点来看待课程和学生的关系显然是不对的,因为 ...

  2. 使用 Scrapy 爬取去哪儿网景区信息

    Scrapy 是一个使用 Python 语言开发,为了爬取网站数据,提取结构性数据而编写的应用框架,它用途广泛,比如:数据挖掘.监测和自动化测试.安装使用终端命令 pip install Scrapy ...

  3. mysql导入sql出错,无脑解决办法

    找到my.cnf文件在[mysqld]的下面添加 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTI ...

  4. Salesforce学习之路(十一)Aura组件属性<aura:attribute />

    1. <aura:attribute />语法 Aura组件属性类似与Apex中类的成员变量(或者说Java中类的成员变量).他们是组件在特定的实例上设置的类型化字段,可以使用表达式语法从 ...

  5. flume安装和介绍

    一.安装1.flume-ng-1.5.0-cdh5.3.6.tar.gz 下载链接:https://pan.baidu.com/s/1AWPGP2qnY6_VpYr_iSnJ3w 密码:tiog2.对 ...

  6. nyoj 79-拦截导弹 (动态规划)

    79-拦截导弹 内存限制:64MB 时间限制:3000ms 特判: No 通过数:9 提交数:11 难度:3 题目描述: 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个 ...

  7. volatile变量能保证线程安全性吗?为什么?

    在谈及线程安全时,常会说到一个变量——volatile.在<Java并发编程实战>一书中是这么定义volatile的——Java语言提供了一种稍弱的同步机制,即volatile变量,用来确 ...

  8. img标签不能直接作为body的子元素

    前几天在一本教材上看到关于HTML标签嵌套规则一节的时候,看到这么一句话,“把图像作为body元素的子元素直接插入到页面中,这样是不妥的,一是结构嵌套有误,二是图像控制不方便.”后面还给了一段代码演示 ...

  9. 编写自定义cmake配置文件FindXXX.cmake或者xxx-config.cmake | cmake with user defined entry

    本文首发于个人博客https://kezunlin.me/post/12ab5707/,欢迎阅读! cmake with user defined entry Guide FindXXX.cmake ...

  10. C++程序的耦合性设计

    声明:本文部分采用和参考<代码里的世界观-通往架构师之路>中内容,可以说是该书中耦合性一章的读后感,感谢该书的作者余叶老师的无私分享. 1.什么是耦合? 耦合其实就是程序之间的相关性. 程 ...