小白的springboot之路(十一)、构建后台RESTfull API
0、前言
开发系统中,前后端分离,后端一般返回RESTfull API,前端调用API构建UI,彼此分离、互相完全独立;
后台API中,我们一般返回结果码、提示信息、数据三部分内容,如图:
我们今天就来构建一个完整的前后端分离后端的API
一、RESTfull API构建
1、增加结果码接口 IErrorCode
package com.anson.common.result;
/**
* @Author anson
* @Description 1、结果码接口
* @Date 2019/12/10 10:50
*/
public interface IErrorCode {
long getCode();
String getMessage();
}
2、添加结果消息枚举 ResultCode
package com.anson.common.result; /**
* @Author anson
* @Description 结果消息枚举
* @Date 2019/12/10 22:05
*/
public enum ResultCode implements IErrorCode
{
// 数据操作消息定义
SUCCESS(200, "成功!"),
BODY_NOT_MATCH(400,"请求的数据格式不符!"),
UNAUTHORIZED(401,"暂未登录或token已经过期!"),
FORBIDDEN(403, "没有相关权限"),
NOT_FOUND(404, "未找到该资源!"),
FAILED(500, "服务器内部错误!"),
SERVER_BUSY(503,"服务器正忙,请稍后再试!"); private long code;
private String message; private ResultCode(long code, String message) {
this.code = code;
this.message = message;
} public long getCode() {
return code;
} public String getMessage() {
return message;
}
}
3、添加返回结果实体 ResultBody
package com.anson.common.result; /**
* @description: API返回结果实体
* @author: anson
* @Date: 2019/12/10 10:54
*/ public class ResultBody<T>
{
private long code;
private String message;
private T data; protected ResultBody() {
} protected ResultBody(long code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
} /**
* 成功返回结果
*
* @param data 获取的数据
*/
public static <T> ResultBody<T> success(T data) {
return new ResultBody<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
} /**
* 成功返回结果
*
* @param data 获取的数据
* @param message 提示信息
*/
public static <T> ResultBody<T> success(T data, String message) {
return new ResultBody<T>(ResultCode.SUCCESS.getCode(), message, data);
} /**
* 失败返回结果
*
* @param errorCode 错误码
*/
public static <T> ResultBody<T> failed(IErrorCode errorCode) {
return new ResultBody<T>(errorCode.getCode(), errorCode.getMessage(), null);
} /**
* 失败返回结果
*
* @param message 提示信息
*/
public static <T> ResultBody<T> failed(String message) {
return new ResultBody<T>(ResultCode.FAILED.getCode(), message, null);
} /**
* 失败返回结果
*/
public static <T> ResultBody<T> failed() {
return failed(ResultCode.FAILED);
} /**
* 参数验证失败返回结果
*/
public static <T> ResultBody<T> validateFailed() {
return failed(ResultCode.NOT_FOUND);
} /**
* 参数验证失败返回结果
*
* @param message 提示信息
*/
public static <T> ResultBody<T> validateFailed(String message) {
return new ResultBody<T>(ResultCode.NOT_FOUND.getCode(), message, null);
} /**
* 未登录返回结果
*/
public static <T> ResultBody<T> unauthorized(T data) {
return new ResultBody<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
} /**
* 未授权返回结果
*/
public static <T> ResultBody<T> forbidden(T data) {
return new ResultBody<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);
} public long getCode() {
return code;
} public void setCode(long code) {
this.code = code;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} public T getData() {
return data;
} public void setData(T data) {
this.data = data;
}
}
4、添加实体类、dao、service
略,具体看代码,跟前几节的一致
5、编写controller
//--------------------------------API test------------------- //1、根据ID获取单个用户
@ApiOperation(value = "获取用户", notes = "根据id查询用户信息")
@ApiImplicitParam(name = "id", value = "用户id", required=true, dataType="int") //API参数
@RequestMapping(value="/user/{id}",method= RequestMethod.GET)
public ResultBody getUserById(int id)
{
User user = userservice.selectByPrimaryKey(id);
return ResultBody.success(user,"获取单个信息成功");
} //2、获取所有用户
@ApiOperation(value = "获取所有用户", notes = "获取所有用户")
@RequestMapping(value="/userall",method= RequestMethod.GET)
public ResultBody getUserAll()
{
List<User> users = userservice.getAll();
return ResultBody.success(users,"获取所有用户信息成功");
}
好,完毕
二、运行测试,在swagger中执行测试,结果如下
{
"code": 200,
"data": [
{
"id": 1,
"password": "123",
"realname": "张三",
"username": "anson"
},
{
"id": 2,
"password": "123",
"realname": "李四",
"username": "Alex"
},
{
"id": 3,
"password": "123",
"realname": "王五",
"username": "kks"
},
{
"id": 4,
"password": "000",
"realname": "赵柳",
"username": "eee"
}
],
"message": "获取所有用户信息成功"
}
GIT源码地址:https://github.com/anson-yang/cloverDemo.git
小白的springboot之路(十一)、构建后台RESTfull API的更多相关文章
- 小白的springboot之路(一)、环境搭建、第一个实例
小白的springboot之路(一).环境搭建.第一个实例 0- 前言 Spring boot + spring cloud + vue 的微服务架构技术栈,那简直是爽得不要不要的,怎么爽法,自行度娘 ...
- 小白的springboot之路(二)、集成swagger
0-前言 现在的项目开发,基本都是前后端分离,后端专注于API接口开发,都需要编写和维护API接口文档.如果你还在用Word来编写接口文档,那你就out了,这个时候,当当当当~神兵利器swagger隆 ...
- 小白的springboot之路(七)、事务支持
0-前言 事务管理对于企业级应用来说必不可少,用来确保数据的完整性和一致性: 1-开启事务 spring boot支持编程式事务和声明式事务,用声明式事务即可: spring boot开启事务非常简单 ...
- 小白的springboot之路(六)、跨域解决方案CORS
0-前言 前后端分离.分布式集群,经常都会涉及到跨域访问,而浏览器基于同源策略,正常情况下是不能跨域的,这就需要我们解决跨域访问问题:spring boot解决跨域也比较简单: 1-CORS跨域解决方 ...
- 小白的springboot之路(五)、集成druid
0-前言 Druid阿里巴巴开源的一个java数据库连接池,是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能:集成它能够方便我们对数据库连接进行监控和分析,下面我们来集成它: ...
- 小白的springboot之路(三)、集成mybatis与MySQL
0.前言 mybatis属于半自动的ORM,相比hibernate这种全自动的ORM,兼顾了性能与易用:目前企业项目中,基本都是mybatis的天下:今天就来整合mybatis与MySQL: 1.整合 ...
- 小白的springboot之路(四)、mybatis-generator自动生成mapper和model、dao
0-.前言 在用mybatis开发项目中,数据库动辄上百张数据表,如果你一个一个去手动编写,比较耗费时间:还好,我们有mybatis-generator插件,只需简单几步就能自动生成mybatis的m ...
- 小白的springboot之路(八)、继承Redis以及@Cacheable注解实现Redis缓存
0.前言 在项目中,缓存作为一种高效的提升性能的手段,几乎必不可少,Redis作为其中的佼佼者被广泛应用: 一.spring boot集成Redis 1.添加依赖 <dependency> ...
- 小白的springboot之路(十)、全局异常处理
0.前言 任何系统,我们不会傻傻的在每一个地方进行异常捕获和处理,整个系统一般我们会在一个的地方统一进行异常处理,spring boot全局异常处理很简单: 介绍前先说点题外话,我们现在开发系统,都是 ...
随机推荐
- 2019-9-28:渗透测试,phpstudy后门,利用复现
9月20号爆出Phpstudy存在隐藏后门,简单复现下后门效果 该文章仅供学习,利用方法来自网络文章,仅供参考 目标机:win7系统,安装phpstudy 2018版,php版本5.2或php 5.4 ...
- scrapy知识补充--scrapy shell 及Spider
什么是scrapy shell? Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试xpath或css表达是,来查看他们的工作方式,方便爬取页面中的数据 ...
- SSO单点登录思路
SSO (Single Sign On) 什么是单点登录: 在大型的互联网公司中会有多个系统, 多个项目, 虽然这些项目都属于同一家公司, 但是项目本身其实都是独立的, 那多个系统可不可以实现共享同一 ...
- redis - redis数据结构与API
通用命令 keys:遍历所有的key[keys一般不再生产环境使用],时间复杂度O(n) keys * keys he* keys he[h-l]* keys ph? dbsize:计算key的总数, ...
- Ubuntu 18.04 LTS上安装NFS服务器和客户端
NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器.操作系统以及低层传送协议无关的存取远程文件的操作.RPC采用了XDR的支持.XDR是一种与机器无关的 ...
- 挑战10个最难的Java面试题(附答案)【上】【华为云技术分享】
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/devcloud/article/deta ...
- MySQL数据库开发的36条原则
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),验证通过后,输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动&quo ...
- DRF Django REST framework 之 解析器(二)
引入 Django Rest framework帮助我们实现了处理application/json协议请求的数据,如果不使用DRF,直接从 request.body 里面拿到原始的客户端请求的字节数据 ...
- java.lang.ClassNotFoundException: com.demo.search.extractAbstract.service.ExtractAbstractServiceHandler
在利用 Spring 对 thrift 进行集成时,出现错误: avax.servlet.ServletException: Servlet.init() for servlet search-nlp ...
- jeecg培训第一课(代码生成与权限分配)
问题描述:进口部要完成一票进口报关单的增删改查,操作员张三登录只能增删改张三的报关单,操作员李四登录只能增删改李四的报关单, 部门主管王五登录能查看张三和李四的报关单,但不能修改删除.操作员能提交报关 ...