java interface 传值_前后端分离传值方案-RestfulAPI
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相关推荐
- thinkphp后台_前后端分离决方案|thinkphpvueadmin 后台接口
thinkphp-vue-admin 后台接口 |前后端分离决方案 它一套有thinkphp开发集成性后台接口,内置权限管理,api响应,psysh等多功能工具 他的作用 自带登录校验 快速完成数据格 ...
- java 接收前台富文本_前后端分离ueditor富文本编辑器的使用-Java版本
最近在写一个自己的后台管理系统(主要是写着玩的,用来熟悉后端java的知识,目前只是会简单的写点接口),想在项目中编写一个发布新闻文章的功能,想到了使用百度的ueditor富文本编辑器,网上找了很多j ...
- java短视频开发技术_看Java学员如何用前后端分离技术搭建短视频健身APP
知了堂在教学过程中一直十分注重学员的实践能力,每阶段结束必有项目考核,全面检验分析学员学习效果.为更好的进行下一阶段的课程学习,本周一Java32班学员迎来了第二阶段的项目考核. 让我们来看看此次考核 ...
- java会员卡的绑定和解绑_前后端分离项目 — SpringSocial 绑定与解绑社交账号如微信、QQ...
1.准备工作 申请QQ.微信相关AppId和AppSecret,这些大家自己到QQ互联和微信开发平台 去申请吧 还有java后台要引入相关的jar包,如下: org.springframework.s ...
- 若依前后端分离如何写移动端接口_前后端分离实践的架构设计
前后端分离的项目开发策略已经不是什么新鲜东西了,网上介绍这方面的文章非常多.我自己是在14年的时候接触到的,对这种开发策略一直爱不释手,不管新老项目都会首先用前后端分离的思维先去思考一番.从14年到现 ...
- 若依前后端分离如何写移动端接口_前后端分离后,如何定义接口规范~
小Hub领读: 前后端分离的趋势下,该怎么定义规范,来学习学习吧哈! 作者:猿码架构 www.jianshu.com/p/c81008b68350 1. 前言 随着互联网的高速发展,前端页面的展示.交 ...
- elementui 按钮 表单_前后端分离,文件上传下载(springBoot+vue+elementUI)
1.介绍 本文主要是介绍前后端分离的上传下载,后端使用的是SpringBoot,持久层用的是mybatis-plus,前端用的Vue,UI用的elementUI,测试了一下,文本,图片,excel,都 ...
- vue后端必须接口吗_前后端分离模式,后端说开发完才能给接口文档,合理吗
背景: 汇总了下老王在其他平台的原创回复,欢迎关注老王原创公众号[软件老王],关注不迷路. 一.后端开发完接口才给出接口文档,合理吗? 本人所在的项目组做项目过程中,后端不会先给出接口文档,而是要等他 ...
- 若依前后端分离如何写移动端接口_前后端分离架构概述
1.背景 2.未分离时代(各种耦合) 3.半分离时代 4.分离时代 5.总结 <Netty 实现原理与源码解析 -- 精品合集> <Spring 实现原理与源码解析 -- 精品合集& ...
- python后端开发的缺点_前后端分离优缺点
前后端分离优缺点 之前有朋友问我:什么是前后端分离.他说北度搜到的都是大篇幅文章,看完还是很懵. 这里我简单总结下,如果有疏漏和不对的地方还请路过的网友指出. 一.先用一张图来解释 二.为什么要前后端 ...
最新文章
- labview的用户身份认证系统设计_elasticsearch 集群身份认证与用户鉴权
- 011_CSS子元素选择器
- python量化数据处理小细节2
- 图解分布式架构的发展和演进 | 技术干货
- 三星S10指纹识别玩脱了!多家金融APP关闭指纹登陆功能
- 麦子学院6.1 神经网络算法(Nerual Networks)(上) 学习笔记
- Spring事务和事务传播机制
- 正交性的好处和实现方法
- 三菱FX3UFX2NFX1N PLC 模拟器模拟通信功能,模拟PLC实体,FX3U仿真器,仿真PLC服务器
- 服务器双系统快捷键,mac双系统切换快捷键
- linux tac命令_Linux tac命令入门
- Oracle进阶(六)包(Package)和包体
- 使用spilt截取文件名后缀时出现的问题
- artdialog v6强大的模态对话框v6版api
- iOS 打开天猫/淘宝/京东客户端并且进入商品详情页/店铺主页的方法
- SQL语句集锦 [转]
- 指针练习 - 使用指针找出函数中最大值和最小值
- 蒸馏论文三(Similarity-Preserving)
- cshop缓存清理-限制或禁用ECShop缓存
- Mybatis中用到的设计模式
热门文章
- android 常用依赖库
- java编写个倒计时_怎么编写一个倒计时java程序?求具体步骤!
- 让Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求
- 深入浅出Hadoop: 高效处理大数据
- SQL-26 (二次分组)汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count...
- MVC项目开发中那些用到的知识点(Ajax.BeginForm)
- nod32 update and id
- 关于Big-Endian 和Little-Endian
- 计算机专业英语信息系统,信息系统项目管理师英语复习资料:计算机专业英语汇总[5]...
- wordpress上传图片按时间重命名