1. 概述
RESTful
架构风格规定,数据的元操作,即CRUD
(增删查改)操作,分别对应于HTTP
方法:GET
用来获取资源,POST
用来新建资源(也可以用于更新资源),PUT
用来更新资源,DELETE
用来删除资源,这样就统一了数据操作的接口,仅通过HTTP方法,就可以完成对数据的所有增删查改工作。
- GET(SELECT)
:从服务器取出资源(一项或多项)。
- POST(CREATE)
:在服务器新建一个资源。
- PUT(UPDATE)
:在服务器更新资源(客户端提供完整资源数据)。
- PATCH(UPDATE)
:在服务器更新资源(客户端提供需要修改的资源数据)。
- DELETE(DELETE)
:从服务器删除资源。
本文中例子RESTful API具体设计如下:
2. 本节重点
- RESTful风格介绍
- 使用SpringBoot,快速搭建RESTful风格Web服务
3. 工具
- IntelliJ IDEA,直接官网下载,Ultimate版本,傻瓜式安装
- Maven,IntelliJ IDEA自带无需安装
- Springboot ,版本2.0.3.RELEASE
- Postman,测试工具,下载地址(密码:sc1e),解压无需安装
4. 代码分析
新建User实体类
public class User {
private Integer userId;
private String name;
private Integer age;
private String address;
// 省略 get set方法
}
快捷键Alt+Insert,可以生成构造器/Getter/Setter等
新建DAO层,查询数据库,这里为了简单用Map模拟
@Component
public class UserDao {
// 数据层:查询数据库,这里为了简单用Map模拟
private static Integer count = 0;
// 线程安全的Map
private static Map<Integer, User> userMap = Collections.synchronizedMap(new HashMap<>());
static {
// 静态代码块,第一次初始化类时被调用
// 初始化userMap
userMap.put(++count, User.builder().userId(count).name("Mkeeper").age(28).address("wuhan").build());
userMap.put(++count, User.builder().userId(count).name("Jam").age(22).address("beijing").build());
userMap.put(++count, User.builder().userId(count).name("Li").age(18).address("shanghai").build());
}
public User findByUserId(Integer userId){
return userMap.get(userId);
}
public List<User> findList(){
return new ArrayList<>(userMap.values());
}
public User addUser(User user){
user.setUserId(++count);
userMap.put(count, user);
return user;
}
public User updateUser(User user){
userMap.put(user.getUserId(), user);
return user;
}
public boolean deleteByUserId(Integer userId){
userMap.remove(userId);
return true;
}
}
新建service层,包括接口与实现
public interface UserService {
// 服务层:处理业务逻辑
User findByUserId(Integer userId);
List<User> findList();
User addUser(User user);
User updateUser(User user);
boolean deleteByUserId(Integer userId);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public User findByUserId(Integer userId) {
return userDao.findByUserId(userId);
}
@Override
public List<User> findList() {
return userDao.findList();
}
@Override
public User addUser(User user) {
return userDao.addUser(user);
}
@Override
public User updateUser(User user) {
return userDao.updateUser(user);
}
@Override
public boolean deleteByUserId(Integer userId) {
return userDao.deleteByUserId(userId);
}
}
新建操作user的接口
@RequestMapping("/users")
@RestController
public class UserController {
// 入口:处理相应URL
@Autowired
private UserService userService;
@GetMapping("/{userId}")
public User findByUserId(@PathVariable Integer userId){
// 处理“/users/{userId}”的Get请求,获取user信息
// url中的id可通过@PathVariable绑定到函数的参数中
return userService.findByUserId(userId);
}
@GetMapping("/")
public List<User> findList(){
// 处理“/users/”的Get请求,获取用户列表信息
// 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递
return userService.findList();
}
@PostMapping("/")
public User addUser(@RequestBody User user){
// 处理"/users/"的POST请求,用来创建User
// 除了@RequestBody绑定参数之外,还可以通过@RequestParam从页面中传递参数
return userService.addUser(user);
}
@PutMapping("/")
public User updateUser(@RequestBody User user){
// 处理"/users/{id}"的PUT请求,用来更新User信息
return userService.updateUser(user);
}
@DeleteMapping("/{userId}")
public boolean deleteByUserId(@PathVariable Integer userId){
// 处理"/users/{id}"的DELETE请求,用来删除User
return userService.deleteByUserId(userId);
}
}
推荐一个查询URL的快捷键:Ctrl+Shift+Alt+N,然后输入url,可以快速查找对应Controller;该快捷键还可以查方法。
测试结果,这里只展示新增的测试结果,其他接口测试还请读者自行实践
5. 工程目录
6. 结束语
微服务盛行,RESTful风格接口大行其道,实践后,才知道其实不复杂,原理是一样的。有任何建议,欢迎留言探讨,本文源码。
欢迎关注博主公众号:Java十分钟