构建 RESTful Service Client

在上一篇文章《构建 RESTful Service 》中我们已经介绍了构建 RESTful 服务端,现在我们来构建 RESTful 的客户端。每种框架都提供了各种访问服务端的实现。如 Apache Httpclient,JAX-RS2 client,Feign Client,Spring RestTemplate 。其实都没有什么特别,就是普通 HTTP 访问协议进一步的封装。本文主要介绍两种方式,分别是 Spring RestTemplate 和 Feign Client,如果喜欢使用 Spring 的同学可能会偏向使用 RestTemplate,它提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率,所以很多客户端比如 Android 或者第三方服务商都是使用 RestTemplate 请求 RESTful 服务。Feign Client 可以把请求的服务写成接口的形式,请求回来的是一个本地接口的一个实现,极大地方便了使用和无缝调用。

本次构建的客户端没有涉及异步访问 REST 服务,我将会另写一片文章专门介绍异步访问 REST 服务,因为这项技术相对来说难一些,内容比较多,也更为重要。

创建 REST-Client 服务端项目

使用 maven 创建 maven-archetype-quickstart 为原型的项目 REST-Client 。

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<feign.version>8.18.0</feign.version>
<cxf.version>3.1.10</cxf.version>
<junit.version>4.9</junit.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</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>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
<version>${feign.version}</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-jackson</artifactId>
<version>${feign.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

model 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@XmlRootElement(name = "Customer")
public class Customer {
private long id;
private String name;
public Customer(){}
public Customer(long id, String name) {
this.id = id;
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

RestTemplate

修改 App 类下的 main 方法:

1
2
3
4
5
System.out.println( "Spring ===================================" );
RestTemplate restTemplate = new RestTemplate();
Customer customer = restTemplate.getForObject("http://127.0.0.1:8080/spring/greeting?name=aidansu", Customer.class);
System.out.println( "id = " + customer.getId() + "; name = "+customer.getName());

Feign Client

创建本地接口 FeignService :

1
2
3
4
5
6
public interface FeignService {
@RequestLine("GET /spring/greeting?name={name}")
Customer getOwner(@Param(value = "name") String name);
}

这里需要注意的地方是:如果getOwner()里添加多一个id参数,则需要在@RequestLine下一行添加@Body{“id={id}&name={name}”}
修改 App 类下的 main 方法:

1
2
3
4
5
6
7
8
9
10
11
System.out.println( "Feign ====================================" );
FeignService service = Feign.builder()
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.options(new Request.Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.target(FeignService.class, "http://127.0.0.1:8080");
Customer customer2 = service.getOwner("aidansu");
System.out.println( "id = " + customer2.getId() + "; name = "+customer2.getName());

运行

运行 App 类下的 main 方法:

1
2
3
4
Spring ===================================
id = 1; name = Hello, aidansu!
Feign ====================================
id = 2; name = Hello, aidansu!

成功获取服务端的信息并打印出来!

本次项目 REST-Client 的项目代码已经放在 github 上,有需要的同学可以下载查看。地址: https://github.com/aidansu/REST-Client

完!

坚持原创技术分享,您的支持将鼓励我继续创作!