构建 RESTful Service

RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。REST这个词,是Roy Thomas Fielding 在他2000年的博士论文中提出的。RESTful service是一种架构模式,它是轻量级 web 服务,发挥 HTTP 协议的原生的GET,PUT,POST,DELETE。近几年,随着云服务技术的发展,其简单方便、易于理解和扩展,一举超越 SOAP 协议,成为事实的 Web 服务标准。Web 服务开发及其简单,就是定义接口,利用工具发布服务;客户端也是定义接口,利用工具生成通讯代理;HTTP 协议作为通讯工具。

怎么构建 RESTful Service,有哪几种方式可以构建呢?本文通过 Spring 和 JAX-RS 这两种方式来实现 RESTful Service 服务端。本文代码基本来源与官方文档。项目还是基于 Spring Boot 来开发,因为 RESTful Service 其中一种是 Spring 的方式实现,还有 Spring Boot 真的太方便了。

创建 REST-Service 服务端项目

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

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
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.boot.version>1.3.6.RELEASE</spring.boot.version>
<cxf.version>3.1.10</cxf.version>
<feign.version>8.18.0</feign.version>
<jackson.version>1.9.13</jackson.version>
<junit.version>4.9</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>${jackson.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;
}
}

@XmlRootElement标签用于生成 xml 格式

Spring 风格的 REST

在 com.aidansu.demo.controller 包下创建 CustomerControllerBySpring 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RequestMapping("/spring")
@Controller
public class CustomerControllerBySpring {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping(value ="/greeting", method = RequestMethod.GET, produces = "application/json; charset=utf-8")
@ResponseBody
public Customer greeting(@RequestParam(value="name", defaultValue="World") String name) {
return new Customer(counter.incrementAndGet(), String.format(template, name));
}
}

@是java注解;
@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@Controller 用于标注控制层组件
@ResponseBody 返回JSON,XML或自定义mediaType内容到页面

JAX-RS 风格的 REST

在 com.aidansu.demo.controller 包下创建 CustomerControllerByCXF 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Path("/cxf")
@Controller
public class CustomerControllerByCXF {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@GET
@Path("/greeting")
@Produces(MediaType.APPLICATION_JSON)
public Customer greeting(@DefaultValue("World") @FormParam("name") String name) {
return new Customer(counter.incrementAndGet(), String.format(template, name));
}
}

JAX-RS 也有自己的标注语义:
@Path 将URL从 “/cxf 路径的请求映射到该接口
@Produces 该接口方法默认返回 xml,我们可以制定为 MediaType.APPLICATION_JSON 返回 json 数据
@GET 这个方法处理 GET 请求
@Path(“/greeting”) 将 “/cxf/greeting” 的请求映射到 greeting 函数调用
@FormParam(“name”) 获取的参数,@DefaultValue(“World”) 可以定义默认返回值

Application 启动类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@SpringBootApplication
public class Application {
@Autowired
private Bus bus;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public Server rsServer() {
JAXRSServerFactoryBean endpoint = new JAXRSServerFactoryBean();
endpoint.setBus(bus);
endpoint.setServiceBeans(Arrays.<Object>asList(new CustomerControllerByCXF()));
endpoint.setProviders(Arrays.<Object>asList(
new JacksonJsonProvider(),
new JAXBElementProvider()
));
endpoint.setAddress("/");
return endpoint.create();
}
}

运行

Spring 风格的: http://localhost:8080/spring/greeting?name=aidansu
JAX-RS 风格的: http://localhost:8080/services/cxf/greeting?name=aidansu

这里需要注意的是 JAX-RS 风格的 REST 需要在端口号后面添加 /services

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

想了解更多关于 RESTful 信息的可以查看最新的官方文档
Spring:https://spring.io/guides/gs/rest-service/
JAX-RS:http://cxf.apache.org/index.html

完!

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