SpringBoot Web开发——构建Restful风格接口

SpringBoot Web开发——构建Restful风格接口

0.REST简介

REST:Representational State Transfer,就是表现层状态转换。

可从三个方面去理解REST:

  • 资源:每个资源就是一个具体存在的对象(系统用户,媒体文件等),以为唯一URI(统一资源定位符)存在。
  • 表现层:资源表现形式,一般以JSON形式表现。
  • 状态转换:资源的变化过程,创建/访问/修改/删除(CRUD)

HTTP虽然是无状态协议,但是存在多种动作(请求方式),可用HTTP的多种动作对应资源的状态转换。

HTTP的多种动作(请求方式):GET、POST、PUT、DELETE。

  • GET 用来访问(获取)资源
  • POST 用来新建(添加)资源
  • PUT 用来更新(修改)资源
  • DELETE 用来删除资源

其实HTTP动作(请求方式)还有以下不常用的动作:

  • PATCH:也是修改资源,但是有些Java类不支持,慎用
  • HEAD:获取资源的Content-type
  • OPTIONS:

1.Restful风格URI示例

假设存在实体类Word(单词类),有三个字段:id,english,chinese。

那么使用Restful风格URL对word数据进行增删改查:

GET     /word          # 访问(获取)word列表
GET     /word/5        # 访问(获取)id为5的word数据
POST    /word          # 新建(添加)一个word
PUT     /word            # 更新(修改)一个word
DELETE  /word/12       # 删除id为12的word数据

可看出Restful风格URL的一个特性:使用请求方式区分CRUD,使得URL中避免出现动词,便于统一与拓展。

  • 当参数比较少时(1到3个),考虑采用URI传参。

  • 当参数比较多时,考虑采用JSON格式传参。

其中URI传参的建议:

不建议这样: PUT /word?english=water&chinese=水

而建议这样: PUT /word/{english}/{chinese}

2.Springboot构建Restful风格接口

2.1 四个用于构建Restful风格的注解

Springboot中在控制层使用以下注解可实现REST风格:

  • @RestController :标注于控制器类上,Rest控制器注解,相当于@Controller+@ResponseBoby,使其为返回结果均为JSON格式的控制器
  • @RequestMapping(value = “请求路径”, method = RequestMethod.GET/POST/PUT/DELETE):标注于请求的方法上,请求映射注解,在其括号内添加请求路径和请求方法GET/POST/PUT/DELETE
  • @RequestBody标注于请求参数为JSON的对应的实体类上,请求体注解,将前端发送的JSON参数映射成实体类
  • @PathVariable注解于在URI当中的参数对应的变量,路径参数注解,将前端发送在URI当中的参数取出来。

后面截取的部分代码和完整的控制器代码中都会用到这些注解。

2.2 添加单词信息(JSON参数):POST请求
  • @RequestMapping(value = “/Word”, method = RequestMethod.POST)

请求路径 :/Word,请求方法:POST

  • @RequestBody Word word

前端以JSON格式提交参数,@RequestBody注解将其解析为Word类的对象,后面再去操作word即可。

 //1. 添加单词信息
    @RequestMapping(value = "/Word", method = RequestMethod.POST)
    public Map<String, Object> insert(@RequestBody Word word) {
        result = new HashMap<>();
        //省略
        //省略 后面控制器中有完整代码....这里先贴出和REST有关的代码
        //省略
        return result;
    }
2.3 根据id删除单词信息(URI参数):DELETE请求
  • @RequestMapping(value = “/Word/{id}”, method = RequestMethod.DELETE)

请求路径 :/Word/{id},在URI里传递参数id,请求方法:DELETE

  • @PathVariable Integer id

将URI中的id参数取出

//2. 根据id删除单词信息
    @RequestMapping(value = "/Word/{id}", method = RequestMethod.DELETE)
    public Map<String, Object> delete(@PathVariable Integer id) {
        result = new HashMap<>();
       //省略
        //省略 后面控制器中有完整代码....这里先贴出和REST有关的代码
        //省略
        return result;
    }
2.4 根据id更新单词信息(JSON参数):PUT请求
  • @RequestMapping(value = “/Word”, method = RequestMethod.PUT)

请求路径 :/Word,请求方法:PUT

  • @RequestBody Word word

前端以JSON格式提交参数,@RequestBody注解将其解析为Word类的对象,后面再去操作word即可。

 //3. 更新单词信息
    @RequestMapping(value = "/Word", method = RequestMethod.PUT)
    public Map<String, Object> update(@RequestBody Word word) {
        result = new HashMap<>();
        //省略
        //省略 后面控制器中有完整代码....这里先贴出和REST有关的代码
        //省略
        return result;
    }
2.5 根据id查询单词信息(URI参数)/查询所有单词 :GET请求

根据id查询单词信息:

  • @RequestMapping(value = “/Word/{id}”, method = RequestMethod.GET)

请求路径 :/Word/{id},在URI里传递参数id,请求方法:PUT

  • @PathVariable Integer id

将URI中的id参数取出

查询所有单词:

  • @RequestMapping(value = “/Word”, method = RequestMethod.GET)

请求路径 :/Word,无参数,请求方法:PUT

   //4. 根据id查询单词信息
    @RequestMapping(value = "/Word/{id}", method = RequestMethod.GET)
    public Map<String, Object> getOne(@PathVariable Integer id) {
        result = new HashMap<>();
       //省略
        //省略 后面控制器中有完整代码....这里先贴出和REST有关的代码
        //省略
        return result;
    }

    //5. 查询所有单词
    @RequestMapping(value = "/Word", method = RequestMethod.GET)
    public Map<String, Object> getAll() {
        result = new HashMap<>();
        //省略
        //省略 后面控制器中有完整代码....这里先贴出和REST有关的代码
        //省略
        return result;
    }
2.6 完整控制器类代码

在类上使用注解

package com.piao.springboot_rest.controller;

import com.piao.springboot_rest.entity.Word;
import com.piao.springboot_rest.mapper.WordMapper;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

//RestController=@Controller+@ResponseBoby
@RestController
public class MyRestController {
    //存储预返回页面的结果对象
    private Map<String, Object> result;
    //注入业务对象
    @Resource
    private WordMapper wordMapper;

    //1. 添加单词信息
    @RequestMapping(value = "/Word", method = RequestMethod.POST)
    public Map<String, Object> insert(@RequestBody Word word) {
        result = new HashMap<>();
        //数据校验 判空!
        if (null == word) {
            result.put("message", "插入的单词为空");
            return result;
        }
        if (null == word.getChinese() || "".equals(word.getEnglish())) {
            result.put("message", "插入的单词中文为空或者为空字符串");
            return result;
        }
        if (null == word.getChinese() || "".equals(word.getChinese())) {
            result.put("message", "插入的单词中文为空或者为空字符串");
            return result;
        }
        wordMapper.insert(word);
        result.put("message", "插入单词成功");
        return result;
    }

    //2. 根据id删除单词信息
    @RequestMapping(value = "/Word/{id}", method = RequestMethod.DELETE)
    public Map<String, Object> delete(@PathVariable Integer id) {
        result = new HashMap<>();
        //数据校验 判空!
        if (null == id) {
            result.put("message", "输入的单词id为空");
            return result;
        }
        wordMapper.deleteById(id);
        result.put("message", "删除单词成功");
        return result;
    }

    //3. 更新单词信息
    @RequestMapping(value = "/Word", method = RequestMethod.PUT)
    public Map<String, Object> update(@RequestBody Word word) {
        result = new HashMap<>();
        //数据校验 判空!
        if (null == word.getId()) {
            result.put("message", "更新的单词id为空");
            return result;
        }
        if (null == word.getEnglish() || "".equals(word.getEnglish())) {
            result.put("message", "更新的单词中文为空或者为空字符串");
            return result;
        }
        if (null == word.getChinese() || "".equals(word.getChinese())) {
            result.put("message", "更新的单词中文为空或者为空字符串");
            return result;
        }
        wordMapper.updateById(word);
        result.put("message", "更新单词成功");
        return result;
    }

    //4. 根据id查询单词信息
    @RequestMapping(value = "/Word/{id}", method = RequestMethod.GET)
    public Map<String, Object> getOne(@PathVariable Integer id) {
        result = new HashMap<>();
        //数据校验 判空!
        if (null == id) {
            result.put("message", "传入id为空");
            return result;
        }
        result.put("word", wordMapper.selectById(id));
        result.put("message", "查询单词成功");
        return result;
    }

    //5. 查询所有单词
    @RequestMapping(value = "/Word", method = RequestMethod.GET)
    public Map<String, Object> getAll() {
        result = new HashMap<>();
        //selectList(null)设置过滤条件为空,就是查询所有,并以list形式返回
        result.put("word", wordMapper.selectList(null));
        result.put("message", "查询所有单词成功");
        return result;
    }

}

3.测试REST风格接口

均使用postman软件测试:

3.1 测试添加单词信息 POST请求 JSON参数

记得选择POST请求方式,参数为JSON格式

REST POST请求 JSON参数

3.2 测试根据id更新单词信息 DELETE请求 URI参数

id参数在URI中,DELETE请求,下面的截图中为删除id为5566的单词信息:

REST DELETE请求 URI参数

3.3 测试根据id更新单词信息 PUT请求 JSON参数

参数为JSON格式,请求方式PUT

REST PUT请求 JSON参数

3.4 根据id查询单词信息(URI参数)/查询所有单词 :GET请求

根据id查询单词信息:参数id在URI中,GET请求:下面截图例子为查询id为8的单词数据

RESt GET请求 URI参数

查询所有单词:无参数,GET请求

REST 无参数,GET请求
整个REST的demo代码使用SpringBoot+MyBatisPlus+MySQL构成链接:springboot_rest demo

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程简介这是一门使用Java语言,SpringBoot框架,从0开发一个RESTful API应用,接近企业级的项目(我的云音乐),课程包含了基础内容,高级内容,项目封装,项目重构等知识,99%代码为手写;因为这是项目课程;所以不会深入到源码讲解某个知识点,以及原理,但会粗略的讲解下基础原理;主要是讲解如何使用系统功能,流行的第三方框架,第三方服务,完成接近企业级项目,目的是让大家,学到真正的企业级项目开发技术。适用人群刚刚毕业的学生想提高职场竞争力想学从零开发SpringBoot项目想提升SpringBoot项目开发技术想学习SpringBoot项目架构技术想学习企业级项目开发技术就是想学习SpringBoot开发能学到什么从0开发一个类似企业级项目学会能做出市面上90%通用API快速增加1到2年实际开发经验刚毕业学完后能找到满意的工作已经工作学完后最高涨薪30%课程信息全课程目前是82章,155小时,每节视频都经过精心剪辑。在线学习分辨率最高1080P课程知识点1~11章:学习方法,项目架构,编码规范,Postman使用方法,Git和Github版本控制12~16章:搭建开发环境,快速入门SpringBoot框架17~20章:快速入门MySQL数据库21~30章:MyBatis,登录注册,找回密码,发送短信,发送邮件,企业级接口配置31~41章:实现歌单,歌单标签,音乐,列表分页,视频,评论,好友功能42~48章:阿里云OSS,话题,MyBatis-plus,应用监控49~53章:Redis使用,集成Redis,SpringCache,HTTP缓存54~58章:Elasticsearch使用,集成Elasticsearch,使用ES搜索59~61章:商城,集成支付宝SDK,支付宝支付62~64章:常用哈希和加密算法,接口加密和签名65~67章:实时挤掉用户,企业级项目测试环境,企业级接口文档68~69章:SpringBoot全站HTTPS,自签证书,申请免费证书70~73章:云MySQL数据库,云Redis数据库使用,轻量级应用部署环境,域名解析74~80章:Docker使用,生产级Kubernetes集群,域名解析,集群全站HTTPS81~82章:增强和重构项目,课程总结,后续学习计划

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值