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