SpringBoot基础教程2-1-1 搭建RESTful风格Web服务

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十分钟

欢迎关注博主公众号

转载于:https://my.oschina.net/Mkeeper/blog/1841375

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值