SpringBoot结合Swagger展示Restful API

标签(空格分隔): springboot java springmvc jpa

镇楼

Restful API 搭建

RESTful架构,是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。后端通过提供一套标准的RESTful API,让网站,移动端和第三方系统都可以基于API进行数据交互和对接,极大的提高系统的开发效率,也使得前后端分离架构成为可能。

SpringBoot开发RestfulAPI

maven 3.3.9 ,Mysql 5.7.19,编译器采用idea,本示例实现学生信息的增删改查

数据库表结构设计

CREATE TABLE `stu_information` (

`stu_id` varchar(100) NOT NULL COMMENT '学生id',

`stu_name` varchar(10) NOT NULL COMMENT '学生姓名',

`stu_sex` int(11) NOT NULL COMMENT '学生性别,0表示男,1表示女',

`stu_age` int(11) NOT NULL COMMENT '学生年龄',

`stu_magor` varchar(100) NOT NULL COMMENT '专业',

`stu_grade` int(11) NOT NULL COMMENT '年级',

`stu_department` varchar(100) NOT NULL COMMENT '院系',

`stu_class` varchar(100) NOT NULL COMMENT '班级',

PRIMARY KEY (`stu_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';

项目创建(这个就不多讲解了),添加依赖

mysql

mysql-connector-java

runtime

org.springframework.boot

spring-boot-starter-data-jpa

org.projectlombok

lombok

配置文件设置

server:

port: 8088

context-path: /student

spring:

datasource:

driver-class-name: com.mysql.jdbc.Driver

username: root

password: 123456

url: jdbc:mysql://127.0.0.1:3306/stu_api?characterEncoding=utf-8&useSSL=false

jpa:

show-sql: true

Api封装

@Data

public class ResultVo {

/** 状态码 .*/

private Integer code;

/** 消息 .*/

private String msg;

/** 具体值 .*/

private T data;

}

public class ResultVoUtil {

/**

* 成功返回有值

* @param object

* @return

*/

public static ResultVo success(Object object){

ResultVo resultVo = new ResultVo();

resultVo.setCode(ResultEnum.SUCCESS.getCode());

resultVo.setMsg(ResultEnum.SUCCESS.getMessage());

resultVo.setData(object);

return resultVo;

}

/**

* 无值成功返回

* @return

*/

public static ResultVo success(){

return success(null);

}

/**

* 错误返回

* @param resultEnum

* @return

*/

public static ResultVo error(ResultEnum resultEnum){

ResultVo resultVo = new ResultVo();

resultVo.setCode(resultEnum.getCode());

resultVo.setMsg(resultEnum.getMessage());

return resultVo;

}

}

返回结果枚举

@Getter

public enum ResultEnum {

SUCCESS(0,"成功"),

LIST_SAVE_ERROR(10,"批量存储出错"),

PARAM_ERROR_ADD(20,"添加学生信息错误")

;

private Integer code;

private String message;

ResultEnum(Integer code, String message) {

this.code = code;

this.message = message;

}

}

异常处理

public class StuInformationException extends RuntimeException{

private Integer code;

public StuInformationException(ResultEnum resultEnum) {

super(resultEnum.getMessage());

this.code = resultEnum.getCode();

}

}

主键生成工具

public class KeyUtil {

/**

* 唯一值学生主键生成

* @return

*/

public static synchronized String getUniqueKey(){

Random random = new Random();

Integer number = random.nextInt(90000)+10000;

return "2014"+number;

}

}

Dao层处理 Jpa简化操作

@Entity

@Data

public class User {

@Id

@GeneratedValue

private Integer id;

/** 用户名 .*/

private String username;

/** 密码 .*/

private String password;

/** 状态 .*/

private String status;

/** 描述 .*/

private String descn;

}

public interface StuInformationRepository extends JpaRepository{

}

表单提交

@Data

public class StudentForm {

/** 姓名 .*/

private String stuName;

/** 性别 0表示男生,1标识女生 .*/

private Integer stuSex;

/** 年龄 .*/

private Integer stuAge;

/** 专业 .*/

private String stuMagor;

/** 年级 .*/

private Integer stuGrade;

/** 院系 .*/

private String stuDepartment;

/** 班级 .*/

private String stuClass;

}

public class StudentFormList2StuInformationList {

public static StuInformation convert(StudentForm studentForm){

StuInformation stuInformation = new StuInformation();

BeanUtils.copyProperties(studentForm,stuInformation);

stuInformation.setStuId(KeyUtil.getUniqueKey());

return stuInformation;

}

public static List convert(List studentForms){

return studentForms.stream().map(e->convert(e)).collect(Collectors.toList());

}

}

Service层处理

public interface StuInfomationService {

/** 查询所有 .*/

Page findAll(Pageable pageable);

/** 单个结果查询 .*/

StuInformation findOne(String stuId);

/** 集合插入 .*/

List save(List studentForms);

/** 单个存储 .*/

StuInformation add(StudentForm form);

/** 更新 .*/

StuInformation update(StuInformation stuInformation);

void delete(String stuid);

}

@Service

@Slf4j

public class StuInformationServiceImpl implements StuInfomationService {

@Autowired

private StuInformationRepository repository;

@Override

public Page findAll(Pageable pageable) {

return repository.findAll(pageable);

}

@Override

public StuInformation findOne(String stuId) {

return repository.findOne(stuId);

}

@Override

@Transactional

public List save(List studentForms) {

List result = repository.save(StudentFormList2StuInformationList.convert(studentForms));

if(result.size()!=studentForms.size()){

log.error("【批量数据插入出错】 批量数据插入错误 result = {}",result);

throw new StuInformationException(ResultEnum.LIST_SAVE_ERROR);

}

return result;

}

@Override

public StuInformation add(StudentForm form) {

StuInformation stuInformation = new StuInformation();

BeanUtils.copyProperties(form,stuInformation);

stuInformation.setStuId(KeyUtil.getUniqueKey());

return repository.save(stuInformation);

}

@Override

public StuInformation update(StuInformation stuInformation) {

StuInformation match = repository.findOne(stuInformation.getStuId());

if(match==null){

log.error("【更新操作】 数据库出错 stuInformation={}",stuInformation);

throw new StuInformationException(ResultEnum.PARAM_ERROR_ADD);

}

StuInformation result = repository.save(stuInformation);

return result;

}

@Override

public void delete(String stuid) {

StuInformation stuInformation = repository.findOne(stuid);

if(stuInformation==null){

log.error("【更新操作】 数据库出错 stuInformation={}",stuInformation);

throw new StuInformationException(ResultEnum.PARAM_ERROR_ADD);

}

repository.delete(stuid);

}

}

Swagger可视化API方案

Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。本文简单介绍了在项目中集成swagger的方法和一些常见问题。如果想深入分析项目源码,了解更多内容,见参考资料。

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger 让部署管理和使用功能强大的API从未如此简单。

依赖添加

io.springfox

springfox-swagger2

2.2.2

io.springfox

springfox-swagger-ui

2.2.2

Swagger配置

@Configuration

@EnableSwagger2

public class Swagger2Config {

@Bean

public Docket createRestApi() {

return new Docket(DocumentationType.SWAGGER_2)

.apiInfo(apiInfo())

.select()

.apis(RequestHandlerSelectors.basePackage("com.xiaojinzi.controller"))

.paths(PathSelectors.any())

.build();

}

private ApiInfo apiInfo() {

return new ApiInfoBuilder()

.title("Spring Boot中使用Swagger2构建RESTful APIs")

.description("后期写成md上传简书:https://www.jianshu.com/u/cebf2052c61b")

.termsOfServiceUrl("https://www.jianshu.com/u/cebf2052c61b")

.contact("金全")

.version("1.0")

.build();

}

}

Controller 请求处理

@RestController

@RequestMapping("/student")

@Slf4j

public class StuInfoController {

@Autowired

private StuInfomationService stuInfomationService;

/**

* 单个对象添加

* @param form

* @param bindingResult

* @return

*/

@ApiOperation(value = "添加学生",notes = "根据对象添加")

@ApiImplicitParam(name = "form",value = "学生实体StudentForm",required = true,dataType = "StudentForm")

@PostMapping("/add")

public ResultVo addStudent(@RequestBody StudentForm form, BindingResult bindingResult){

if(bindingResult.hasErrors()){

log.error("【添加学生】 参数传递错误 form ={}",form);

throw new StuInformationException(ResultEnum.PARAM_ERROR_ADD);

}

StuInformation result = stuInfomationService.add(form);

return ResultVoUtil.success(result);

}

/**

* 批量添加

* @param list

* @param bindingResult

* @return

*/

@ApiOperation(value = "批量添加",notes = "集合对象添加")

@PostMapping("/batchadd")

public ResultVo batchAdd(@RequestBody List list,BindingResult bindingResult){

if(bindingResult.hasErrors()){

log.error("【添加学生】 参数传递错误 list ={}",list);

throw new StuInformationException(ResultEnum.PARAM_ERROR_ADD);

}

List stuInformations = stuInfomationService.save(list);

return ResultVoUtil.success(stuInformations);

}

/**

* 根据单个查询

* @param stuid

* @return

*/

@ApiOperation(value = "单个查询",notes = "id查询")

@ApiImplicitParam(name = "stuid",value = "通过id查询",required = true,dataType = "String",paramType = "Path")

@GetMapping("/findone/{stuid}")

public ResultVo findOne(@PathVariable String stuid){

Map map = new HashMap<>();

StuInformation stuInformation = stuInfomationService.findOne(stuid);

if(stuInformation==null){

map.put("object","没有该同学");

return ResultVoUtil.success(map);

}

return ResultVoUtil.success(stuInformation);

}

/**

* 分页查询

* @param page

* @param size

* @return

*/

@ApiOperation(value = "分页查询",notes = "分页参数")

@ApiImplicitParams({

@ApiImplicitParam(name = "page",value = "当前页",required = false,dataType = "Integer",defaultValue = "1",paramType = "Query"),

@ApiImplicitParam(name = "size",value = "页面显示数",required = false,dataType = "Integer",defaultValue = "10",paramType = "Query")

})

@GetMapping("/findAll")

public ResultVo findAll(@RequestParam(value = "page",defaultValue = "1")Integer page,@RequestParam(value = "size",defaultValue = "10")Integer size){

PageRequest request = new PageRequest(page-1,size);

Page stuInformations = stuInfomationService.findAll(request);

return ResultVoUtil.success(stuInformations.getContent());

}

/**

* 更新操作

* @param stuInformation

* @return

*/

@ApiOperation(value = "更新操作",notes = "单个更新")

@ApiImplicitParam(name = "stuInformation",value = "学生实体stuInformation",required = true,dataType = "StuInformation")

@PutMapping("/update")

public ResultVo updateStu(@RequestBody StuInformation stuInformation){

StuInformation result = stuInfomationService.update(stuInformation);

return ResultVoUtil.success(result);

}

/**

* 删除操作

* @param stuid

* @return

*/

@ApiOperation(value = "删除操作" ,notes = "根据id删除")

@ApiImplicitParam(name = "stuid",value = "主键删除",required = true,dataType = "String",paramType = "Path")

@DeleteMapping("/delete/{stuid}")

public ResultVo deleteStu(@PathVariable String stuid){

stuInfomationService.delete(stuid);

return ResultVoUtil.success();

}

}

截图

成功运行界面

具体api调试

借鉴博客(程序员DD(翟永超)小哥哥构建强大的RESTful API文档)

下一篇讲解 SpringSecurity+JWT 保护你的API(近期推出)

本篇博客撰写人: XiaoJinZi 转载请注明出处

学生能力有限 附上邮箱: 986209501@qq.com 不足以及误处请大佬指责

java interface 传值_前后端分离传值方案-RestfulAPI相关推荐

  1. thinkphp后台_前后端分离决方案|thinkphpvueadmin 后台接口

    thinkphp-vue-admin 后台接口 |前后端分离决方案 它一套有thinkphp开发集成性后台接口,内置权限管理,api响应,psysh等多功能工具 他的作用 自带登录校验 快速完成数据格 ...

  2. java 接收前台富文本_前后端分离ueditor富文本编辑器的使用-Java版本

    最近在写一个自己的后台管理系统(主要是写着玩的,用来熟悉后端java的知识,目前只是会简单的写点接口),想在项目中编写一个发布新闻文章的功能,想到了使用百度的ueditor富文本编辑器,网上找了很多j ...

  3. java短视频开发技术_看Java学员如何用前后端分离技术搭建短视频健身APP

    知了堂在教学过程中一直十分注重学员的实践能力,每阶段结束必有项目考核,全面检验分析学员学习效果.为更好的进行下一阶段的课程学习,本周一Java32班学员迎来了第二阶段的项目考核. 让我们来看看此次考核 ...

  4. java会员卡的绑定和解绑_前后端分离项目 — SpringSocial 绑定与解绑社交账号如微信、QQ...

    1.准备工作 申请QQ.微信相关AppId和AppSecret,这些大家自己到QQ互联和微信开发平台 去申请吧 还有java后台要引入相关的jar包,如下: org.springframework.s ...

  5. 若依前后端分离如何写移动端接口_前后端分离实践的架构设计

    前后端分离的项目开发策略已经不是什么新鲜东西了,网上介绍这方面的文章非常多.我自己是在14年的时候接触到的,对这种开发策略一直爱不释手,不管新老项目都会首先用前后端分离的思维先去思考一番.从14年到现 ...

  6. 若依前后端分离如何写移动端接口_前后端分离后,如何定义接口规范~

    小Hub领读: 前后端分离的趋势下,该怎么定义规范,来学习学习吧哈! 作者:猿码架构 www.jianshu.com/p/c81008b68350 1. 前言 随着互联网的高速发展,前端页面的展示.交 ...

  7. elementui 按钮 表单_前后端分离,文件上传下载(springBoot+vue+elementUI)

    1.介绍 本文主要是介绍前后端分离的上传下载,后端使用的是SpringBoot,持久层用的是mybatis-plus,前端用的Vue,UI用的elementUI,测试了一下,文本,图片,excel,都 ...

  8. vue后端必须接口吗_前后端分离模式,后端说开发完才能给接口文档,合理吗

    背景: 汇总了下老王在其他平台的原创回复,欢迎关注老王原创公众号[软件老王],关注不迷路. 一.后端开发完接口才给出接口文档,合理吗? 本人所在的项目组做项目过程中,后端不会先给出接口文档,而是要等他 ...

  9. 若依前后端分离如何写移动端接口_前后端分离架构概述

    1.背景 2.未分离时代(各种耦合) 3.半分离时代 4.分离时代 5.总结 <Netty 实现原理与源码解析 -- 精品合集> <Spring 实现原理与源码解析 -- 精品合集& ...

  10. python后端开发的缺点_前后端分离优缺点

    前后端分离优缺点 之前有朋友问我:什么是前后端分离.他说北度搜到的都是大篇幅文章,看完还是很懵. 这里我简单总结下,如果有疏漏和不对的地方还请路过的网友指出. 一.先用一张图来解释 二.为什么要前后端 ...

最新文章

  1. labview的用户身份认证系统设计_elasticsearch 集群身份认证与用户鉴权
  2. 011_CSS子元素选择器
  3. python量化数据处理小细节2
  4. 图解分布式架构的发展和演进 | 技术干货
  5. 三星S10指纹识别玩脱了!多家金融APP关闭指纹登陆功能
  6. 麦子学院6.1 神经网络算法(Nerual Networks)(上) 学习笔记
  7. Spring事务和事务传播机制
  8. 正交性的好处和实现方法
  9. 三菱FX3UFX2NFX1N PLC 模拟器模拟通信功能,模拟PLC实体,FX3U仿真器,仿真PLC服务器
  10. 服务器双系统快捷键,mac双系统切换快捷键
  11. linux tac命令_Linux tac命令入门
  12. Oracle进阶(六)包(Package)和包体
  13. 使用spilt截取文件名后缀时出现的问题
  14. artdialog v6强大的模态对话框v6版api
  15. iOS 打开天猫/淘宝/京东客户端并且进入商品详情页/店铺主页的方法
  16. SQL语句集锦 [转]
  17. 指针练习 - 使用指针找出函数中最大值和最小值
  18. 蒸馏论文三(Similarity-Preserving)
  19. cshop缓存清理-限制或禁用ECShop缓存
  20. Mybatis中用到的设计模式

热门文章

  1. android 常用依赖库
  2. java编写个倒计时_怎么编写一个倒计时java程序?求具体步骤!
  3. 让Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求
  4. 深入浅出Hadoop: 高效处理大数据
  5. SQL-26 (二次分组)汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count...
  6. MVC项目开发中那些用到的知识点(Ajax.BeginForm)
  7. nod32 update and id
  8. 关于Big-Endian 和Little-Endian
  9. 计算机专业英语信息系统,信息系统项目管理师英语复习资料:计算机专业英语汇总[5]...
  10. wordpress上传图片按时间重命名