SpringBoot 精通系列-构建一个RESTful Web 服务

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/nihui123/article/details/100607122

导语
  现在越来越多的企业推荐使用的是RESTful风格来构建企业应用接口,那么什么是RESTful呢?

什么是RESTful

  RESTful是目前最为流行的一种互联网架构,REST(Respresentational State Transfer,表述性状态转移),这个是来源自于一篇博士论文,定义了作者对于互联网软件的架构原则的认识,如果一个架构符合REST原则,则称它为RESTFul架构。
  RESTful架构一个比较核心的概念就是”资源(Resource)“,从RESTful的角度上来看,网络中的任何的东西都可以是被看作是一个资源,对于一个资源来说可以一个文件、一张图片等等,对于每一个在网络中的资源来说都有一个特定的位置标识URI(统一资源定位符)。通过这URI就可以访问到这资源。
  对于一个资源来说可以有多种形式,也就是对于资源的描述,对于资源的描述来说就取决于它的后缀名称。也就是说URI只是代表了一个实体,而不是它的表现形式。
  互联网中,客户端与服务器端之间互动传递消息,这些消息其实就是在传递互联网中资源的描述,客户端告诉服务端想要什么地方的资源,服务端向客户端返回对应的资源。在互联网中相互之间的调用只能通过一种无状态协议就是HTTP。也就是说服务端必须保存所有的状态,客户端可以使用HTTP的基本操作让服务端的资源状态发生变化,也就是所谓的”表述性状态转移“。

SpringBoot对于RESTful有哪些支持

  在SpringBoot出现之前,SpringMVC就对于一些简单的RESTFul进行了支持,通过不同的注解来支持前端的请求,当然SpringBoot提供的注解要比SpringMVC更加的全面。SpringBoot提供一些组合注解。通过这些组合注解来简化常用的HTTP方法请求映射。并且更好的体现了见名知意。

  • @GetMapping;处理GET请求
  • @PostMapping; 处理POST请求
  • @PutMapping; 处理PUT请求
  • @DeleteMapping;处理DELETE请求
  • @PatchMapping; 处理更新资源请求

当然了以上这些注解都是简写版本,在SpringBoot中进行了封装

@GetMapping

@RequestMapping(method = RequestMethod.GET)
public @interface GetMapping { 

@PostMapping

@RequestMapping(method = RequestMethod.POST)
public @interface PostMapping {

@PutMapping

@RequestMapping(method = RequestMethod.PUT)
public @interface PutMapping {\

@DeleteMapping

@RequestMapping(method = RequestMethod.DELETE)
public @interface DeleteMapping {

@PatchMapping

@RequestMapping(method = RequestMethod.PATCH)
public @interface PatchMapping {

快速实例

  这里使用整合MyBaits的方式来实现这功能。

定义User对象

public class User {
    private Integer id;
    private String name;
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

添加配置文件

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=123456
        
mybatis.mapper-locations=classpath:/mapper/**/*.xml
mybatis.configuration.map-underscore-to-camel-case=true

编写Dao层的Mapper

@Mapper
public interface UserMapper {

    public int addUser(User user);

    public List<User> getAllUser();

    public User getUser(Integer id);

    public int updateUser(User user);

    public int deleteUser(Integer id);

}

编写Service层

public interface UserService {

    public int addUser(User user);

    public List<User> getAllUser();

    public User getUserById(Integer id);

    public int updateUser(User user);

    public int deleteUserById(Integer id);

}

Service实现类

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public int addUser(User user) {
        return userMapper.addUser(user);
    }

    @Override
    public List<User> getAllUser() {
        return userMapper.getAllUser();
    }

    @Override
    public User getUserById(Integer id) {
        return userMapper.getUser(id);
    }

    @Override
    public int updateUser(User user) {
        return userMapper.updateUser(user);
    }

    @Override
    public int deleteUserById(Integer id) {
        return userMapper.deleteUser(id);
    }
}

Controller类

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/allUser")
    public List<User> getAllUser(){
        return userService.getAllUser();
    }

    @GetMapping("/getOneUser")
    public User getUserById(@RequestParam Integer id){
        return userService.getUserById(id);
    }

    @PostMapping("/addUser")
    public int addUser(@RequestBody User user){
        return userService.addUser(user);
    }

    @DeleteMapping("/deleteUser")
    public int deleteUser(Integer id){
        return userService.deleteUserById(id);
    }

    @PatchMapping("/updateUser")
    public int updateUser(@RequestBody  User user){
        return userService.updateUser(user);
    }

}

Mapper XML 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nh.restful.dao.UserMapper">

    <select id="getAllUser" resultType="com.nh.restful.bean.User">
        select  * from user;
    </select>

    <select id="getUser" parameterType="Integer" resultType="com.nh.restful.bean.User">
        select * from user where id = #{id}
    </select>

    <insert id="addUser" parameterType="com.nh.restful.bean.User">
        insert into user ( `id`, `name`, `password`) values ( #{id}, #{name}, #{password});
    </insert>

    <delete id="deleteUser" parameterType="Integer">
        delete from user where id = #{id}
    </delete>

    <update id="updateUser" parameterType="com.nh.restful.bean.User">
        update user set `id`= #{id}, `name`= #{name}, `password`= #{password} where `id` = #{id};
    </update>

</mapper>

测试效果

从浏览器发送get请求测试get请求的方式
在这里插入图片描述

在这里插入图片描述

PostMan测试Post、DELETE、Patch请求方式
效果如下

Post
在这里插入图片描述
Delete
在这里插入图片描述

Patch
在这里插入图片描述

总结

  从上面的例子可以看出,RESTful其实是一个非常好的设计方式,相同的URL请求通过后端不同的处理方式利用RESTful风格很容易就实现一种简单的接口调用方式。同时SpringBoot在对于RESTful的支持上做了大量的优化,从注解的表现形式,到内部使用的RESTful支持。后面的分享中还会有更多的东西等着大家,希望大家可以喜欢!

猜你喜欢

转载自blog.csdn.net/nihui123/article/details/100607122