Spring Boot快速入門之(十五):Rest 模板
【注】本文譯自: https://www.tutorialspoint.com/spring_boot/spring_boot_rest_template.htm

Rest 模板用于創(chuàng)建消費(fèi) RESTful Web 服務(wù)的應(yīng)用。你可以使用?exchange()?方法來消費(fèi)所有?HTTP 方法的 web 服務(wù)。下面的代碼展示了如何創(chuàng)建 Rest 模板 Bean 來自動(dòng)綁定 Rest 模板對(duì)象:
package?com.tutorialspoint.demo;
import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
import?org.springframework.context.annotation.Bean;
import?org.springframework.web.client.RestTemplate;
@SpringBootApplication
public?class?DemoApplication?{
???public?static?void?main(String[]?args)?{
??????SpringApplication.run(DemoApplication.class,?args);
???}
???@Bean
???public?RestTemplate?getRestTemplate()?{
??????return?new?RestTemplate();
???}
GET
使用?RestTemplate - exchange() 方法消費(fèi)?GET API
假設(shè)這個(gè) URL?http://localhost:8080/products?返回下面的 JSON ,我們要通過后面的代碼使用?Rest 模板來消費(fèi)這個(gè) API 響應(yīng):
[
???{
??????"id":?"1",
??????"name":?"Honey"
???},
???{
??????"id":?"2",
??????"name":?"Almond"
???}
]
你要通過以下幾點(diǎn)來消費(fèi) API:
自動(dòng)綁定 Rest 模板對(duì)象
使用 HttpHeaders 設(shè)置請(qǐng)求頭
使用 HttpEntity 包裝請(qǐng)求對(duì)象
為 Exchange() 方法提供 URL、HttpMethod 和返回值類型
@RestController
public?class?ConsumeWebService?{
???@Autowired
???RestTemplate?restTemplate;
???@RequestMapping(value?=?"/template/products")
???public?String?getProductList()?{
??????HttpHeaders?headers?=?new?HttpHeaders();
??????headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
??????HttpEntity?<String>?entity?=?new?HttpEntity<String>(headers);
??????
??????return?restTemplate.exchange("
?????????http://localhost:8080/products",?HttpMethod.GET,?entity,?String.class).getBody();
???}
}
POST
使用?RestTemplate - exchange() 方法消費(fèi)?POST API
假設(shè) URL?http://localhost:8080/products?返回如下響應(yīng),我們要使用 Rest 模板來消費(fèi)這個(gè)?API 響應(yīng)。
請(qǐng)求體代碼如下:
{
????"id":"3",
????"name":"Ginger"
}
響應(yīng)體代碼如下:
Product is created successfully
你要通過以下幾點(diǎn)來消費(fèi) API:
自動(dòng)綁定 Rest 模板對(duì)象
使用 HttpHeaders 設(shè)置請(qǐng)求頭
使用 HttpEntity 包裝請(qǐng)求對(duì)象,這里我們包裝了產(chǎn)品對(duì)象發(fā)送給請(qǐng)求體
為 Exchange() 方法提供 URL、HttpMethod 和返回值類型
@RestController
public?class?ConsumeWebService?{
???@Autowired
???RestTemplate?restTemplate;
???@RequestMapping(value?=?"/template/products",?method?=?RequestMethod.POST)
???public?String?createProducts(@RequestBody?Product?product)?{
??????HttpHeaders?headers?=?new?HttpHeaders();
??????headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
??????HttpEntity<Product>?entity?=?new?HttpEntity<Product>(product,headers);
??????
??????return?restTemplate.exchange(
?????????"http://localhost:8080/products",?HttpMethod.POST,?entity,?String.class).getBody();
???}
}
PUT
使用?RestTemplate - exchange() 方法消費(fèi)?PUT API
假設(shè)?URL?http://localhost:8080/products/3?返回下面的響應(yīng),我們要使用 Rest 模板來消費(fèi)這個(gè)?API 響應(yīng)。
請(qǐng)求體代碼如下:
{
????"name":?"Indian?Ginger"
}
響應(yīng)體代碼如下:
Product is updated successfully
你要通過以下幾點(diǎn)來消費(fèi) API:
自動(dòng)綁定 Rest 模板對(duì)象
使用 HttpHeaders 設(shè)置請(qǐng)求頭
使用 HttpEntity 包裝請(qǐng)求對(duì)象,這里我們包裝了產(chǎn)品對(duì)象發(fā)送給請(qǐng)求體
為 Exchange() 方法提供 URL、HttpMethod 和返回值類型
@RestController
public?class?ConsumeWebService?{
???@Autowired
???RestTemplate?restTemplate;
???@RequestMapping(value?=?"/template/products/{id}",?method?=?RequestMethod.PUT)
???public?String?updateProduct(@PathVariable("id")?String?id,?@RequestBody?Product?product)?{
??????HttpHeaders?headers?=?new?HttpHeaders();
??????headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
??????HttpEntity<Product>?entity?=?new?HttpEntity<Product>(product,headers);
??????
??????return?restTemplate.exchange(
?????????"http://localhost:8080/products/"+id,?HttpMethod.PUT,?entity,?String.class).getBody();
???}
}
DELETE
使用?RestTemplate - exchange() 方法消費(fèi)?DELETE API
假設(shè)?URL?http://localhost:8080/products/3?返回下面的響應(yīng),我們要使用 Rest 模板來消費(fèi)這個(gè)?API 響應(yīng)。
響應(yīng)體代碼如下:
Product is deleted successfully
你要通過以下幾點(diǎn)來消費(fèi) API:
自動(dòng)綁定 Rest 模板對(duì)象
使用 HttpHeaders 設(shè)置請(qǐng)求頭
使用 HttpEntity 包裝請(qǐng)求對(duì)象
為 Exchange() 方法提供 URL、HttpMethod 和返回值類型
@RestController
public?class?ConsumeWebService?{
???@Autowired
???RestTemplate?restTemplate;
???@RequestMapping(value?=?"/template/products/{id}",?method?=?RequestMethod.DELETE)
???public?String?deleteProduct(@PathVariable("id")?String?id)?{
??????HttpHeaders?headers?=?new?HttpHeaders();
??????headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
??????HttpEntity<Product>?entity?=?new?HttpEntity<Product>(headers);
??????
??????return?restTemplate.exchange(
?????????"http://localhost:8080/products/"+id,?HttpMethod.DELETE,?entity,?String.class).getBody();
???}
}
完整的 Rest 模板控制器類代碼文件如下:
package?com.tutorialspoint.demo.controller;
import?java.util.Arrays;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.http.HttpEntity;
import?org.springframework.http.HttpHeaders;
import?org.springframework.http.HttpMethod;
import?org.springframework.http.MediaType;
import?org.springframework.web.bind.annotation.PathVariable;
import?org.springframework.web.bind.annotation.RequestBody;
import?org.springframework.web.bind.annotation.RequestMapping;
import?org.springframework.web.bind.annotation.RequestMethod;
import?org.springframework.web.bind.annotation.RestController;
import?org.springframework.web.client.RestTemplate;
import?com.tutorialspoint.demo.model.Product;
@RestController
public?class?ConsumeWebService?{
???@Autowired
???RestTemplate?restTemplate;
???@RequestMapping(value?=?"/template/products")
???public?String?getProductList()?{
??????HttpHeaders?headers?=?new?HttpHeaders();
??????headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
??????HttpEntity<String>?entity?=?new?HttpEntity<String>(headers);
??????
??????return?restTemplate.exchange(
?????????"http://localhost:8080/products",?HttpMethod.GET,?entity,?String.class).getBody();
???}
???@RequestMapping(value?=?"/template/products",?method?=?RequestMethod.POST)
???public?String?createProducts(@RequestBody?Product?product)?{
??????HttpHeaders?headers?=?new?HttpHeaders();
??????headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
??????HttpEntity<Product>?entity?=?new?HttpEntity<Product>(product,headers);
??????
??????return?restTemplate.exchange(
?????????"http://localhost:8080/products",?HttpMethod.POST,?entity,?String.class).getBody();
???}
???@RequestMapping(value?=?"/template/products/{id}",?method?=?RequestMethod.PUT)
???public?String?updateProduct(@PathVariable("id")?String?id,?@RequestBody?Product?product)?{
??????HttpHeaders?headers?=?new?HttpHeaders();
??????headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
??????HttpEntity<Product>?entity?=?new?HttpEntity<Product>(product,headers);
??????
??????return?restTemplate.exchange(
?????????"http://localhost:8080/products/"+id,?HttpMethod.PUT,?entity,?String.class).getBody();
???}
???@RequestMapping(value?=?"/template/products/{id}",?method?=?RequestMethod.DELETE)
???public?String?deleteProduct(@PathVariable("id")?String?id)?{
??????HttpHeaders?headers?=?new?HttpHeaders();
??????headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
??????HttpEntity<Product>?entity?=?new?HttpEntity<Product>(headers);
??????
??????return?restTemplate.exchange(
?????????"http://localhost:8080/products/"+id,?HttpMethod.DELETE,?entity,?String.class).getBody();
???}
}
Spring Boot 應(yīng)用類 – DemoApplication.java 如下所示:
package?com.tutorialspoint.demo;
import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public?class?DemoApplication?{
???public?static?void?main(String[]?args)?{
??????SpringApplication.run(DemoApplication.class,?args);
???}
}
Maven build – pom.xml 如下:
<?xml?version?=?"1.0"?encoding?=?"UTF-8"?>
<project?xmlns?=?"http://maven.apache.org/POM/4.0.0"?
???xmlns:xsi?=?"http://www.w3.org/2001/XMLSchema-instance"
???xsi:schemaLocation?=?"http://maven.apache.org/POM/4.0.0?
???http://maven.apache.org/xsd/maven-4.0.0.xsd">
???
???<modelVersion>4.0.0</modelVersion>
???<groupId>com.tutorialspoint</groupId>
???<artifactId>demo</artifactId>
???<version>0.0.1-SNAPSHOT</version>
???<packaging>jar</packaging>
???<name>demo</name>
???<description>Demo?project?for?Spring?Boot</description>
???<parent>
??????<groupId>org.springframework.boot</groupId>
??????<artifactId>spring-boot-starter-parent</artifactId>
??????<version>1.5.8.RELEASE</version>
??????<relativePath/>?
???</parent>
???<properties>
??????<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
??????<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
??????<java.version>1.8</java.version>
???</properties>
???<dependencies>
??????<dependency>
?????????<groupId>org.springframework.boot</groupId>
?????????<artifactId>spring-boot-starter-web</artifactId>
??????</dependency>
??????<dependency>
?????????<groupId>org.springframework.boot</groupId>
?????????<artifactId>spring-boot-starter-test</artifactId>
?????????<scope>test</scope>
??????</dependency>
???</dependencies>
???<build>
??????<plugins>
?????????<plugin>
????????????<groupId>org.springframework.boot</groupId>
????????????<artifactId>spring-boot-maven-plugin</artifactId>
?????????</plugin>
??????</plugins>
???</build>
</project>
Gradle Build – build.gradle 如下:
buildscript?{
????ext?{
???????springBootVersion?=?'1.5.8.RELEASE'
????}
????repositories?{
???????mavenCentral()
????}
????dependencies?{
???????classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
????}
?}
?
?apply?plugin:?'java'
?apply?plugin:?'eclipse'
?apply?plugin:?'org.springframework.boot'
?
?group?=?'com.tutorialspoint'
?version?=?'0.0.1-SNAPSHOT'
?sourceCompatibility?=?1.8
?
?repositories?{
????mavenCentral()
?}
?dependencies?{
????compile('org.springframework.boot:spring-boot-starter-web')
????testCompile('org.springframework.boot:spring-boot-starter-test')
?}
你可以使用 Maven 或 Graven 命令 創(chuàng)建可執(zhí)行 JAR 文件,并運(yùn)行 Spring Boot 應(yīng)用:
Maven 可以使用以下命令:
mvn clean install
在 “BUILD SUCCESS” 之后 ,你可以在 target 目錄下找到 JAR 文件:
對(duì)于 Gradle,可以使用以下命令:
gradle clean build
在 “BUILD SUCCESSFUL” 之后,你可以在 build/libs 目錄下找到 JAR 文件:
使用以下命令運(yùn)行 JAR 文件:
java –jar <JARFILE>
現(xiàn)在應(yīng)用已經(jīng)在 Tomcat 上以 8080 端口上啟動(dòng)了:

在 POSTMAN 應(yīng)用中輸入 URL 可以看到下面的輸出:
使用 Rest 模板 GET 產(chǎn)品:http://localhost:8080/template/products

創(chuàng)建產(chǎn)品 POST:http://localhost:8080/template/products

更新產(chǎn)品 PUT:http://localhost:8080/template/products/3

刪除產(chǎn)品:http://localhost:8080/template/products/3
