构建RESTful服务
在1.2节中,我们已经对RESTful的架构风格做了简单的介绍。在本节,我们将演示一下 如何使用Spring Boot来快速构建RESTful服务。正如Spring Boot所承诺的那样,搭建一个Spring Boot的应用将是非常快速和简单的。
RESTful服务概述
滚动鼠标轴或单击,开始截长图RESTful服务( 也称为REST Web服务,RESTful Web Serviees)是松耦合的,这特别适用于为客户创建在互联网传播的轻量级的Web服务API。在RESTful服务中,我们经常会将资源以JSON或XML等轻量级的数据格式进行暴露,从而可以方便地让其他REST客户端进行调用。
在Java领域中有非常多的框架,可以帮助我们快速实现RESTful服务,主要分为基于JAX-RS的RESTful服务和基于Spring MVC的RESTful服务。
1.基于JAX-RS的RESTful服务
在JavaEE规范中,针对构建RESTful服务,主要是JAX-RS ( Java API for RESTful WebServices),该规范使Java 程序员可以使用一套固定的接口来开发REST应用,避免了依赖于第三方框架。同时,JAX-RS使用POJO编程模型和基于标注的配置,并集成了JAXB,从而可以有效缩短REST应用的开发周期。截至目前,JAX-RS最新的版本是2.1 ( JSR-370, htp://jcp.org/en/j/r/detail?id=370),并在最新发布的Java EE 8中得到了支持。
伴随着JAX-RS规范的发布,Oracle 同步发布该规范的参考实现Jersey ( ht:p:/ersey.java.net)。JAX-RS的具体实现第三方还包括Apache的CXF ( http://cxf.apache.org/)及JBoss的REST-Easy ( ht:p/resteasy.jboss.org/)等。
2.基于Spring MVC的RESTful服务
Spring MVC框架本身也是可以实现RESTful服务的,只是并未实现JAX-RS规范。在SpringBoot应用中,通常采用SpringMVC来实现RESTful服务。当然,SpringBoot本身也是支持对JAX-RS实现的集成。
Spring MVC对于RESTful的支持,主要通过以下注解来实现。
●@Controller: 声明为请求处理控制器。
●@RequestMapping: 请求映射到相应的处理方法上。该注解又可以细化为以下几种类型:
@GetMapping;
- @PostMapping;
-@PutMapping;
@DeleteMapping;
- @PatchMapping。
@ResponseBody:响应内容的转换,如转换成JSON格式。
@RequestBody:请求内容的转换,如转换成JSON格式。
@RestController:等同于@Controller+@ResponseBody,方便处理RESTful的服务请求。
本书所涉及的案例,采用Spring MVC来实现RESTful服务。
配置环境
为了演示本例子,需要采用如下开发环境:
JDK 8;
Gradle 4.0;
Spring Boot Web Starter 2.0.0.M4。
Spring Boot Web Starter 集成了Spring MVC,可以方便地来构建RESTful Web应用,并使用Tomcat作为默认的内嵌Servlet容器。
需求分析及API设计
在本节,我们将实现-一个简单版本的“用户管理”RESTful服务。通过“用户管理”的API,就能方便地进行用户的增、删、改、查等操作。
用户管理的整体API设计如下:
GET /users:获取用户列表;
●POST /users: 保存用户;
GET /users/{id}:获取用户信息;
PUT /users/{id}:修改用户;
DELETE /users/{id}:删除用户。,
这样,相应的控制器可以定义如下。
@RestController
@Reques tMapping(" /users")
public class UserController {
/**
获取用户列表
@return
@GetMapping
public List<User> getUsers ()
return null;
k获取用户信息
@param id
★@return
@GetMapping("/ {id}")
public User getUser (@PathVariable("id") Long id) {
return null;
/**
保存用户
@param user
@PostMapping
public User createUser (@RequestBody User user) {
return null;
/**
修改用户
* aparam ic
@param user
@PutMapping("/ {id}")
public void updateUser (@PathVariable("id") Long id, @RequestBody
User user)
★删除用户
@param id
* @return
*/
@De leteMapping("/{id}")
public void deleteUser (@PathVariable("id") Long id) {
}
}
项目配置
在之前讲述的“hello-world” 应用的基础上,我们稍作修改来生成-一个新的应用。新的应用称为“spring-boot-rest” 。
由于在build.gradle文件中已经配置了Spring Boot Web Starter,所以并不需要做特别的修改。
//依赖关系
dependencies {
//该依赖用于编译阶段
compile ('org. spr ingf ramework. boot: spring-boot-starter -web')
//该依赖用于测试阶段
testCompile ('org. spr ingf ramework.boot : spring-boot-starter-test' )
编写程序代码
下面进行后台编码实现,编码涉及实体类、仓库接口、仓库实现类及控制器类。
1.实体类
在com.waylau.spring.cloud.weather.domain包下,用于放置实体类。我们定义-一个保存用户信息的实体User。
public class User {
private Long id;
private String name;
private String
email;
public User () {
public User (String name, String email) {
this.name = name;
this.email = email;
//省略getter/setter方法
@Override
public String toString() {
return String. format ("User[id=d, name='&s', email='&s']", id,
name, email) ;
2.仓库接口及实现
在com.waylau.spring.cloud.weather.repository包下,用于放置仓库接口及其仓库实现类,也就是我们的数据存储。
用户仓库接口UserRepository如下。
public interface UserRepository {
★新增或者修改用户
@param user
* return
User saveOrUpateUser (User user) ;
/**
删除用户
★@param id
★/
void deleteUser (Long id) ;
/**
根据用户id获取用户
@param id
★@return
User getUserById(Long id) ;
/**
★获取所有用户的列表
* @return
List<User> listUser() ;
UserRepository的实现类为:
@Repository
public class UserRepositoryImpl implements UserRepository {
private static AtomicLong counter = new AtomicLong() ;
private final ConcurrentMap<Long, User> userMap = new ConcurrentHash-
Map<Long, User>() ;
@Override
public User saveOrUpateUser (User user) {
Long id = user.getId() ;
if(id==null11id<=0){
id = counter . incrementAndGet () ;
user.setId(id) ;
this.userMap.put (id, user) ;
return user;
@Override
public void deleteUser (Long id) {
this. userMap. remove (id) ;
}
@Override
public User getUserById (Long id) {
return this.userMap.get (id) ;
@Override
public List<User> listUser() {
return new ArrayList<User> (this.userMap. values()) ;
其中,我们用ConcurrentMap<Long, User> userMap 来模拟数据的存储,AtomicLong counter用来生成-一个递增的ID,作为用户的唯一编号。 @Repository 注解用于标识UserRepositoryImpl类是一个可注人的bean。
3.控制器类
在com.waylau.spring.cloud.weather.controller包下,用于放置控制器类,也就是我们需要实现的API。
UserController实现如下。
@RestController
@RequestMapping (" /users")
public class UserController {
@Autowi red
private UserRepository userRepository;
/**
获取用户列表
★areturn
@GetMapping
public List<User> getUsers() {
return userRepository.listUser () ;
/**
★获取用户信息
@param id
@ return
@GetMapping("/ {id}")
public User getUser (@PathVariable("id") Long id) {
return userRepository . getUserById(id) ;
/**
*保存用户
@param user
@PostMapping
public User createUser (@RequestBody User user) {
return userRepository . saveOrUpateUser (user) ;
/**
*修改用户
@param ic
dparam user
@PutMapping("/ {id}")
public void updateUser (@PathVariable ("id") Long id, @RequestBody
User user) {
User oldUser = this.getUser (id) ;
if (oldUser != null) {
user .setId(id) ;
userReposi tory . saveOrUpateUser (user) ;
/*>
★删除用户
@param id
@return
@DeleteMapping("/ {id}")
public void deleteUser (@PathVariable ("id") Long id) {
userReposi tory .deleteUser(id) ;}
}
安装REST客户端
为了测试REST接口,我们需要一款REST客户端。
有非常多的REST客户端可供选择,例如,Chrome浏览器的Postman插件,或者是Firefox浏览器的RESTClient及HttpRequester插件,都能方便用于RESTful API的调试。
这里,笔者就RESTClient及HttpRequester插件的安装,做一下简单的介绍。
为了方便测试RESTAPI,需要- -款 REST客户端来协助我们。由于这里用Firefox 浏览器居多,所以推荐安装RESTClient或HttpRequester插件。当然,你可以根据个人喜好来安装其他软件。
在Firefox安装插件的界面里面输入关键字“restclient",就能看到这两款插件的信息。单击“安装”按钮即可。
用HttpRequester来测试。
在运行程序后,我们可以对ht:/calalhost:8080/users/1接口进行测试。
我们在HttpRequester的请求URL中填写接口地址,然后单击“Submit" 按钮来提交测试请求。
在右侧响应里面,能看到返回JSON数据。图3-2展示了HttpRequester的使用过程。
运行、测试程序
运行程序,项目启动在8080端口。
首先,我们发送GET请求到htp:/ocalhost:8080/users,可以看到,响应返回的是一个空的列表[]。
发送POST请求到htp://ocalhost:8080/users,用来创建-一个用户。请求内容为:
{ "name": "waylau","email" :"waylau521@gmail . com" }
发送成功,我们能看到响应的状态是200,响应的数据为:
{"id": 1
"name": "waylau",
"email": "waylau521@gmail .com"}
我们通过该接口,再创建几条测试数据,并发送GET请求到ht:p/ocalalhost:8080/user,可以看到,响应返回的是-个有数据的列表。
{"id": 1,
"name":
"waylau",
"email": "way1au521@gmail. com"};
"id": 2
"name": "老卫",
"email": "waylau521@163. com"}
]
我们通过PUT方法到htp://ocalhost:8080/users/2,来修改id为2的用户信息,修改为如下内容。
{"name" :"柳伟卫","email":"778907484@qq. com" }
发送成功,我们能看到响应的状态是200。我们通过GET方法到ht:/ocalhot:.080/users/r2来查看id为2的用户信息:
{"id": 2,
"name": "柳伟卫",
"email": "778907484@qq. com"}
可以看到,用户数据已经变更了。
自此,这个简单的“用户管理”的RESTful服务已经全部调试完毕。
本篇文章给大家讲述的是怎样构建RESTful服务,喜欢的朋友可以转发此文关注小编!!
下篇文章给大家介绍SpringBoot的配置详解的内容,大家可以特别关注哈~~~
看完是否有感慨?
本文暂时没有评论,来添加一个吧(●'◡'●)