• 小白的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

  • 相关阅读:
    jsp页面input输入框限制输入内容
    sql计算两个日期之间的相差天数
    sql根据一个字段日期加减7天存入另一字段中
    ajax请求捕获异常
    跨网段和局域网的SQL SERVER发布订阅配置图解和常见问题
    一次得到多个数据集
    SQL Server 2008语句大全完整版
    关于已开票已收款未发货的账务处理
    高格-一些特点话题【7】
    高格-塑料管业中厂内工单,满足随时换料的处理【6】
  • 原文地址:https://www.cnblogs.com/yanghj/p/12060621.html
Copyright © 2020-2023  润新知