java interface 传值_前后端分离传值方案-RestfulAPI

SpringBoot结合Swagger展示Restful API

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

b8405ee3f4fa

镇楼

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();

}

}

截图

b8405ee3f4fa

成功运行界面

b8405ee3f4fa

具体api调试

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值