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,直接官网下载,,傻瓜式安装
- 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模拟
@Componentpublic class UserDao { // 数据层:查询数据库,这里为了简单用Map模拟 private static Integer count = 0; // 线程安全的Map private static MapuserMap = 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 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); ListfindList(); User addUser(User user); User updateUser(User user); boolean deleteByUserId(Integer userId);}
@Servicepublic class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public User findByUserId(Integer userId) { return userDao.findByUserId(userId); } @Override public ListfindList() { 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")@RestControllerpublic 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 ListfindList(){ // 处理“/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十分钟