springboot(9)restful风格接口开发

restful风格

表现层状态转换(英语:Representational State Transfer,缩写:REST)是Roy Thomas Fielding博士于2000年在他的博士论文[1]中提出来的一种万维网软件架构风格,目的是便于不同软件/程序在网络(例如互联网)中互相传递信息。表现层状态转换是根基于超文本传输协议(HTTP)之上而确定的一组约束和属性,是一种设计提供万维网络服务的软件构建风格。符合或兼容于这种架构风格(简称为 REST 或 RESTful)的网络服务,允许客户端发出以统一资源标识符访问和操作网络资源的请求,而与预先定义好的无状态操作集一致化。因此表现层状态转换提供了在互联网络的计算系统之间,彼此资源可交互使用的协作性质(interoperability)。相对于其它种类的网络服务,例如SOAP服务,则是以本身所定义的操作集,来访问网络上的资源。

restful要点与标准

要点

需要注意的是,REST是设计风格而不是标准。REST通常基于HTTP、URI、XML以及HTML这些现有的广泛流行的协议和标准。

  • 资源是由URI来指定。
  • 对资源的操作包括获取、创建、修改和删除,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
  • 通过操作资源的表现形式来操作资源。
  • 资源的表现形式则是XML或者HTML,取决于读者是机器还是人、是消费Web服务的客户软件还是Web浏览器。当然也可以是任何其他的格式,例如JSON。

可重新表达的状态迁移的特征

  • 统一接口(Uniform Interface)
  1. 以资源为基础

每个资源都可以通过URI访问到。

也就是一个个可以认知的资源,比如文档,音乐,视频等信息,都可以通过唯一的URI确定

  1. 通过重表达的客户端可以管理原资源

就是我们通过客户端可以修改原资源的状态

  1. 返回信息足够描述自己

这样重表达的客户端可以知道如何处理

  1. 超媒体是应用状态的引擎

处理以超媒体为基础的状态变化

  • Stateless
    无状态
  • Cacheable
    可缓存
  • Client-Server
    客户服务器分离模式,任何一个客户端与服务器都是可替换的
  • Layered System
    分层的系统,客户端不知道他联系的是不是最终服务器
  • Code on Demand (optional)
    服务器可以将能力扩展到客户端,如果客户端可以执行的话。这个功能是可选择的。

HTTP请求方法在RESTful API中的典型应用

在这里插入图片描述

springboot 实现restful风格开发

GET请求主要用于获取资源

  • 可以利用GET请求通过传入参数获取用户列表或者某一用户
@RequestMapping(value = "/find/{current}", method = RequestMethod.GET)
    public RestResponse findAllUser(@PathVariable int current){
//        current = 1;
        int size = 5;
        Page<User> page = new Page<>(current,size);
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.orderByAsc("id");
        Page<User> userPage = (Page<User>) userMapper.selectPage(page, null);
        if (userPage != null){
            return RestResponse.success(userPage);
        }else {
            return RestResponse.fail("查询不到数据");
        }
    }
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public RestResponse findUserByID(@PathVariable Long id){
        User user = userMapper.selectById(id);
        if (user != null){
            return RestResponse.success(user);
        }else {
            return RestResponse.fail("查询不到数据");
        }

    }

POST请求主要用于创建资源

  • 我们可以利用 http POST请求来创建资源,用于保存用户信息到数据库中去
 @RequestMapping(value = "/save", method = RequestMethod.POST)
    public RestResponse saveUser(@RequestBody User user){
        int insert = userMapper.insert(user);
        if (insert == 1){
            return RestResponse.success("插入数据成功");
        }else {
            return RestResponse.fail("插入数据失败");
        }
    }

PUT请求主要用来更新资源

  • 我们可以利用jttp PUT请求来更新现有资源,完成用户信息更新
 @RequestMapping(value = "/update", method = RequestMethod.PUT)
    public RestResponse updateUser(@RequestBody User user){
        User updateUser = userMapper.selectById(user.getId());
        if (updateUser != null){
            updateUser.setName(user.getName());
            updateUser.setEmail(user.getEmail());
            updateUser.setAge(user.getAge());
            int insert = userMapper.updateById(updateUser);
            if (insert == 1){
                return RestResponse.success("更新数据成功");
            }else {
                return RestResponse.fail("更新数据失败");
            }
        }else {
            return RestResponse.fail("更新数据失败");
        }

    }

DELETE请求主要用于删除资源

  • 我们可以通过使用DELETE请求来对不需要的用户信息进行处理
 @RequestMapping(value = "/delete/{id}", method = {RequestMethod.DELETE, RequestMethod.GET})
    public RestResponse delUserById(@PathVariable Long id){
        int del = userMapper.deleteById(id);
        if (del == 1){
            return RestResponse.success("删除成功");
        }else {
            return RestResponse.fail("删除失败");
        }
    }

如果想在浏览器中使用DELETE请求,需要在method方法参数中进行相关请求设置:method = {RequestMethod.DELETE, RequestMethod.GET}

完整示例

package mybatis_plus.controller;



import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import mybatis_plus.entity.User;
import mybatis_plus.mapper.UserMapper;
import mybatis_plus.utils.RestResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author heroMps
 * @since 2021-02-23
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private UserMapper userMapper;

    @RequestMapping(value = "/find/{current}", method = RequestMethod.GET)
    public RestResponse findAllUser(@PathVariable int current){
//        current = 1;
        int size = 5;
        Page<User> page = new Page<>(current,size);
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.orderByAsc("id");
        Page<User> userPage = (Page<User>) userMapper.selectPage(page, null);
        if (userPage != null){
            return RestResponse.success(userPage);
        }else {
            return RestResponse.fail("查询不到数据");
        }
    }
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public RestResponse findUserByID(@PathVariable Long id){
        User user = userMapper.selectById(id);
        if (user != null){
            return RestResponse.success(user);
        }else {
            return RestResponse.fail("查询不到数据");
        }

    }
    @RequestMapping(value = "/save", method = RequestMethod.POST)
    public RestResponse saveUser(@RequestBody User user){
        int insert = userMapper.insert(user);
        if (insert == 1){
            return RestResponse.success("插入数据成功");
        }else {
            return RestResponse.fail("插入数据失败");
        }
    }
    @RequestMapping(value = "/update", method = RequestMethod.PUT)
    public RestResponse updateUser(@RequestBody User user){
        User updateUser = userMapper.selectById(user.getId());
        if (updateUser != null){
            updateUser.setName(user.getName());
            updateUser.setEmail(user.getEmail());
            updateUser.setAge(user.getAge());
            int insert = userMapper.updateById(updateUser);
            if (insert == 1){
                return RestResponse.success("更新数据成功");
            }else {
                return RestResponse.fail("更新数据失败");
            }
        }else {
            return RestResponse.fail("更新数据失败");
        }

    }
    @RequestMapping(value = "/delete/{id}", method = {RequestMethod.DELETE, RequestMethod.GET})
    public RestResponse delUserById(@PathVariable Long id){
        int del = userMapper.deleteById(id);
        if (del == 1){
            return RestResponse.success("删除成功");
        }else {
            return RestResponse.fail("删除失败");
        }
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heromps

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值