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的更多相关文章

  1. 小白的springboot之路(一)、环境搭建、第一个实例

    小白的springboot之路(一).环境搭建.第一个实例 0- 前言 Spring boot + spring cloud + vue 的微服务架构技术栈,那简直是爽得不要不要的,怎么爽法,自行度娘 ...

  2. 小白的springboot之路(二)、集成swagger

    0-前言 现在的项目开发,基本都是前后端分离,后端专注于API接口开发,都需要编写和维护API接口文档.如果你还在用Word来编写接口文档,那你就out了,这个时候,当当当当~神兵利器swagger隆 ...

  3. 小白的springboot之路(七)、事务支持

    0-前言 事务管理对于企业级应用来说必不可少,用来确保数据的完整性和一致性: 1-开启事务 spring boot支持编程式事务和声明式事务,用声明式事务即可: spring boot开启事务非常简单 ...

  4. 小白的springboot之路(六)、跨域解决方案CORS

    0-前言 前后端分离.分布式集群,经常都会涉及到跨域访问,而浏览器基于同源策略,正常情况下是不能跨域的,这就需要我们解决跨域访问问题:spring boot解决跨域也比较简单: 1-CORS跨域解决方 ...

  5. 小白的springboot之路(五)、集成druid

    0-前言 Druid阿里巴巴开源的一个java数据库连接池,是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能:集成它能够方便我们对数据库连接进行监控和分析,下面我们来集成它: ...

  6. 小白的springboot之路(三)、集成mybatis与MySQL

    0.前言 mybatis属于半自动的ORM,相比hibernate这种全自动的ORM,兼顾了性能与易用:目前企业项目中,基本都是mybatis的天下:今天就来整合mybatis与MySQL: 1.整合 ...

  7. 小白的springboot之路(四)、mybatis-generator自动生成mapper和model、dao

    0-.前言 在用mybatis开发项目中,数据库动辄上百张数据表,如果你一个一个去手动编写,比较耗费时间:还好,我们有mybatis-generator插件,只需简单几步就能自动生成mybatis的m ...

  8. 小白的springboot之路(八)、继承Redis以及@Cacheable注解实现Redis缓存

    0.前言 在项目中,缓存作为一种高效的提升性能的手段,几乎必不可少,Redis作为其中的佼佼者被广泛应用: 一.spring boot集成Redis 1.添加依赖 <dependency> ...

  9. 小白的springboot之路(十)、全局异常处理

    0.前言 任何系统,我们不会傻傻的在每一个地方进行异常捕获和处理,整个系统一般我们会在一个的地方统一进行异常处理,spring boot全局异常处理很简单: 介绍前先说点题外话,我们现在开发系统,都是 ...

随机推荐

  1. kafka-manager新手安装入门指南

    Kafka-manager安装教程 使用环境 ubuntu18.04 Java 8 一.下载kafka 官网下载地址如下 https://www.apache.org/dyn/closer.cgi?p ...

  2. vue通过控制boolean值来决定是否添加class类名

    vue通过控制boolean值来决定是否添加class类名

  3. Rust中的RefCell和内部可变性

    RefCell Rust在编译阶段会进行严格的借用规则检查,规则如下: 在任意给定时间,要么只能有一个可变引用,要么只能有多个不可变引用. 引用必须总是有效. 即在编译阶段,当有一个不可变值时,不能可 ...

  4. Vue之组件及组件通信

    组件之全局组件 //注意:需要在Vue实例化之前注册全局组件,使用Vue.component("组件名",{ template:`组件模板` }) Vue.component(&q ...

  5. 09-kubernetes configMap secret

    目录 配置容器化应用配置的方式 命令创建和测试configMap 创建一个Pod 挂在测试 命令行文件类创建方式 创建Pod测试 创建后测试 贴近实际进行测试 创建后测试 secret 举例测试 ge ...

  6. Kubernetes 时代的安全软件供应链

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 汤志敏  阿里云 ...

  7. 每个开发人员都应该知道的11个Linux命令

    本文主要挑选出读者有必要首先学习的 11 个 Linux 命令,如果不熟悉的读者可以在虚拟机或云服务器上实操下,对于开发人员来说,能熟练掌握 Linux 做一些基本的操作是必要的! 事不宜迟,这里有 ...

  8. docker tomcat镜像部署springbootwar包

    springboot打war包 1.在pom文件中增加插件 <build> <finalName>xx</finalName> <plugins> &l ...

  9. luogu P5002 专心OI - 找祖先

    题目描述 这个游戏会给出你一棵树,这棵树有NN个节点,根结点是RR,系统会选中MM个点P_1,P_2...P_MP 1 ​ ,P 2 ​ ...P M ​ ,要Imakf回答有多少组点对(u_i,v_ ...

  10. ios 在APP内提示更新

    http://www.jianshu.com/p/24daf5147bda     ios如何在应用内部提示更新  两颗星 http://www.jianshu.com/p/2ba10a58bb02  ...