我们之前学习过如何将关系数据库中的数据轻转化为REST服务可访问的信息,轻松写意的例子。基于Spring来访问REST服务也非常简单,只需要对POJO进行标注,通过Spring提供的RestTemplate
就能轻松搞定,来一探究竟吧。
开发环境
- IDE+Java环境(JDK 1.7或以上版本)
- Maven 3.0+(Eclipse和Idea IntelliJ内置,如果使用IDE并且不使用命令行工具可以不安装)
POM文件如下:
<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.tianmaying</groupId>
<artifactId>rest-service-consuming</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>rest-service-consuming</name>
<description>demo of consuming rest service by spring RestTemplate</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.5.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.mobile</groupId>
<artifactId>spring-mobile-device</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.2</version>
<scope>provided</scope>
</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>
jackson-databind包提供了JSon对象转成Java类的辅助功能。lombok包提供了简单的标注来帮助我们简化消除一些必须有但是臃肿的java 代码,比如getter、setter和构造函数等,这些函数一般我们通过IDE自动生成,有了lombok三两个标注就轻松搞定。
提示
为了让Eclipse识别lombok,除了引入lombok JAR包之外,你需要安装lombok,这样Eclipse才不会报警告(否则即使你标注了@Data
,如果你不写setter和getter代码的话,Eclipse会有警告)。安装非常简单,只需要到lombok网站中下载,然后双击Jar包运行即可。
将JSON自动转换为POJO
我们假定REST服务返回的JSON格式如下:
{
id:100
name: "zhangsan"
address: {
city: "beijing"
steet: "yiheyuan lu 5"
}
}
对应我们新建两个类来存储JSON中的信息
User.java
package com.tianmaying.springboot.restconsuming;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
private Long id;
private String name;
private Address address;
}
Address.java
package com.tianmaying.springboot.restconsuming;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Address {
private String city;
private String street;
}
上面两个类都具有两个标注@Data
和@JsonIgnorePoperties
。其中:
-
@Data
标注为每个类都提供了getter方法、setter方法和toString
方法 -
@JsonIgnorePoperties
时Jackson的JSON处理库提供的标注,表示任何没有绑定到该类的属性都忽略即可
访问REST服务
Spring提供一个模板类RestTemplate
来调用REST Web服务,通过这个类你只需要一行代码即可完成调用,而且将返回的JSON数据自动绑定到类的属性。
App.java
package com.tianmaying.springboot.restconsuming;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class App implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(App.class);
public static void main(String args[]) {
SpringApplication.run(App.class);
}
@Override
public void run(String... strings) throws Exception {
RestTemplate restTemplate = new RestTemplate();
User user = restTemplate.getForObject("http://tianmaying.com/mockapi/user/1", User.class);
log.info(user.toString());
}
}
因为Jackson JSON处理包在类路径中,RestTemplate
会基于它将REST服务返回的JSON数据转换成一个User
对象。
这里只演示了GET
请求,基于RestTemplate
你可以进行POST
、PUT
和 DELETE
请求,大家去试验一下吧!
https://www.tianmaying.com/tutorial/spring-rest-consuming