当前位置: 首页 > news >正文

SpringBoot restful api接口设计

前后端分离,也需要前后端人员相互联调,为了更好的交互,统一一个设计规范

1、Http的常用请求方法Method
GET 一搬用于获取数据
POST 用于提交数据
PUT 用于修改数据
DELETE 用于删除数据

2、Restful api 常用的几个注解

@RestController 一般用于Controoler类上
@ResponseBody 用了这个 RestController就没有必要在加ResponseBody了
@GetMapping 方法上
@PostMapping 方法上
@PutMapping 方法上
@DeleteMapping 方法上

@PostMapping和@PutMapping作用接近,都是用来向服务器提交信息。如果是新增(insert)信息,倾向于用@PostMapping,如果是更新(update)信息,倾向于用@PutMapping。

创建名为curd的Spring工程

创建src/main/java/com.example.curd/controller/SiteController.java文件,内容如下

package com.example.curd.controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/site")
public class SiteController {
    @GetMapping("/detail/{id}")
    public Object detail(@PathVariable Integer id)
    {
        return "查看详情" + id;
    }

    @PostMapping("/add")
    public Object add(@RequestParam String name){
        return "新增:" + name;
    }

    @PutMapping("/update")
    public Object update(@RequestParam Integer id,@RequestParam String name){
        return "更新ID为" + id + "的名称为" + name;
    }

    @DeleteMapping("/delete/{id}")
    public Object delete(@PathVariable Integer id)
    {
        return "删除ID为" + id + "的记录";
    }
}

固定JSON格式返回,如:

{
  code:0,
  message:'操作成功',
  data:null
}

{
  code:10001,
  message:'参数错误',
  data:null
}

VO、DTO、BO、DO、PO、POJO、Entity的概念、区别和应用

阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义

返回码ResultCode类
创建src/main/java/com.example.curd/vo/ResultCode.java文件,内容如下

package com.example.curd.vo;

public enum ResultCode {
    SUCCESS(0,"成功"),

    PARAMS_ERROR(10000,"参数错误"),//大类
    PARAMS_IS_INVALID(10001,"参数无效"),
    PARAMS_NOT_COMPLETE(10002,"参数不全"),

    DATA_ERROR(20000,"数据错误"),//大类
    DATA_NOT_FOUND(20001,"数据没找到"),
    DATA_ALREADY_EXISTED(20002,"数据已存在"),

    UNKNOWN_ERROR(99999,"未知错误");

    private Integer code;
    private String desc;

    private ResultCode(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    public Integer getCode(){
        return code;
    }

    public String getDesc(){
        return desc;
    }
}

通用泛型Result 类

创建src/main/java/com.example.curd/vo/Result.java文件,内容如下


package com.example.curd.vo;


public class Result<T> {
    private Integer code;
    private String message;
    private T data;

    public Result() {
    }

    public Result(Integer code, String message,T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public Result setCode(Integer code) {
        this.code = code;
        return this;
    }

    public String getMessage() {
        return message;
    }

    public Result setMessage(String message) {
        this.message = message;
        return this;
    }

    public T getData() {
        return data;
    }

    public Result setData(T data) {
        this.data = data;
        return this;
    }
    public Result setCode(ResultCode resultCode) {
        this.code = resultCode.getCode();
        return this;
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }

}



泛型相关

创建src/main/java/com.example.curd/util/ResultUtil.java文件,内容如下

package com.example.curd.util;

import com.example.curd.vo.*;

public class ResultUtil {

    public static <T> Result create(Integer code, String desc,T data) {
        Result<T> result = new Result<T>();
        result.setCode(code);
        result.setMessage(desc);
        result.setData(data);
        return result;
    }
    //成功
    public static <T> Result<T> success() {
        return create(ResultCode.SUCCESS.getCode(),"",null);
    }
    //成功
    public static <T> Result<T> success(T data) {
        return create(ResultCode.SUCCESS.getCode(),"",data);
    }

    //失败
    public static <T> Result<T> fail(ResultCode resultCode) {
        return create(resultCode.getCode(),resultCode.getDesc(),null);
    }


}


用法
SiteController.java文件增加如下内容

    @GetMapping("/test")
    public Object test()
    {
        //return ResultUtil.success();
        return ResultUtil.fail(ResultCode.DATA_ALREADY_EXISTED);
    }

创建自定义异常类CustomException,位置src/main/java/com.example.curd/exception/CustomException.java

package com.example.curd.exception;

import com.example.curd.vo.ResultCode;

public class CustomException extends RuntimeException {

    public CustomException(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
    public CustomException(ResultCode resultCode) {
        this.code = resultCode.getCode();
        this.message = resultCode.getDesc();
    }

    private Integer code;
    private String message;

    public Integer getCode() {
        return code;
    }

    public CustomException setCode(Integer code) {
        this.code = code;
        return this;
    }

    public String getMessage() {
        return message;
    }

    public CustomException setMessage(String message) {
        this.message = message;
        return this;
    }
}


创建异常处理类
RestControllerAdvice作用

创建src/main/java/com.example.curd/controller/advice/MyControllerAdvice.java文件,内容如下

package com.example.curd.controller.advice;

import com.example.curd.exception.CustomException;
import com.example.curd.util.ResultUtil;
import com.example.curd.vo.Result;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import com.example.curd.vo.*;


@RestControllerAdvice
public class MyControllerAdvice {
    /*
    //应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器
    @InitBinder
    public void initBinder(WebDataBinder binder) {}

    //把值绑定到Model中,使全局@RequestMapping可以获取到该值
    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("author", "vastshine");
    }
    */
    //全局异常捕捉处理
    @ExceptionHandler(value = Exception.class)
    public <T> Result<T> globalErrorHandler(Exception ex) {
        return ResultUtil.create(ResultCode.UNKNOWN_ERROR.getCode(),ex.getMessage(),null);
    }

    //自定义异常捕捉处理
    @ExceptionHandler(value = CustomException.class)
    public <T> Result customErrorHandler(CustomException ex) {
        return ResultUtil.create(ex.getCode(),ex.getMessage(),null);
    }
}

用法

    @GetMapping("/test")
    public Object test()
    {
        throw new CustomException(ResultCode.DATA_ALREADY_EXISTED);
    }

相关文章:

  • 软件测试高薪“骗局”软件测试入门就月薪过万,还包就业。别再上当受骗了、清醒点吧
  • 【DP 动态规划 | 精选推荐】持续更新
  • 专利的要求-需要什么条件?
  • Google Earth Engine (GEE)——GEE制作gif动态图(北京市为例)
  • Spring-Framework-ioc-1
  • Vue 动态换肤
  • 从零到一搭建基础架构-玩转maven依赖版本管理
  • CE修改器学习历程之下载、安装和汉化
  • 【鸟哥杂谈】物联网体系知识梳理
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • C语言必刷题——期末不挂科
  • 基于微信小程序+SSM+Vue+Node实现智慧旅游商城系统
  • RabbitMQ常用消息模式
  • Spring中的11个扩展点
  • AcWing 蓝桥杯AB组辅导课 01、递归与递推
  • [译]前端离线指南(上)
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Docker容器管理
  • Java的Interrupt与线程中断
  • java多线程
  • miaov-React 最佳入门
  • MySQL的数据类型
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • React的组件模式
  • SegmentFault 2015 Top Rank
  • Theano - 导数
  • 老板让我十分钟上手nx-admin
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 小李飞刀:SQL题目刷起来!
  • 仓管云——企业云erp功能有哪些?
  • ​人工智能书单(数学基础篇)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (算法)求1到1亿间的质数或素数
  • (转)Google的Objective-C编码规范
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (轉貼) UML中文FAQ (OO) (UML)
  • .axf 转化 .bin文件 的方法
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .Net Core与存储过程(一)
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • /*在DataTable中更新、删除数据*/
  • [BROADCASTING]tensor的扩散机制
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [C++]打开新世界的大门之C++入门
  • [C++]指针与结构体
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [GXYCTF2019]BabySQli1
  • [IE9] IE9 beta版下载链接
  • [linux][调度] 内核抢占入门 —— 高优先级线程被唤醒时会立即抢占当前线程吗 ?
  • [Linux]使用CentOS镜像与rpm来安装虚拟机软件
  • [Linux_IMX6ULL驱动开发]-基础驱动