基于Spring访问REST服务

我们之前学习过如何将关系数据库中的数据轻转化为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你可以进行POSTPUT和 DELETE请求,大家去试验一下吧!

https://www.tianmaying.com/tutorial/spring-rest-consuming

猜你喜欢

转载自nethub2.iteye.com/blog/2334283
今日推荐