如果当初有一个 Java 我的项目, 老板让你做我的项目组长, 定义我的项目根底框架, 零碎技术架构选型,
你应该如何设计一个标准的对立的 Restful API 响应框架呢
思考
目前我的项目开发, 都是基于前后端拆散模式开发的, 基于后端模板引擎那一套, 可能曾经不实用一些我的项目开发流程, 和当下开发模式了, 尤其在要写比拟大型项目, 前后端我的项目拆分, 团队共同开发那是必不可少的
目前的前后端开发大部分数据的传输格局都是 json,因而定义一个对立标准的数据格式有利于前后端的交互与 UI 的展现。
返回的对立接口模式应该蕴含这些内容
- 是否响应胜利
- 响应状态码
- 状态码形容
- 响应数据
- 接口调用工夫
- 其余标识符
依照这些咱们能够定义对立的规范后果返回
响应枚举
前三者能够定义为 success,code,message
package cn.soboys.springbootrestfulapi.common.resp;
import lombok.Data;
import lombok.Getter;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @author 公众号 程序员三时
* @version 1.0
* @date 2023/4/28 22:39
* @webSite https://github.com/coder-amiao
* 响应后果枚举
*/
@Getter
public enum ResultCodeEnum{SUCCESS(true, 200, "胜利"),
FAIL(false, 400, "申请失败"),
NOT_FOUND(false, 404, "接口不存在"),
FORBIDDEN(false, 403, "资源回绝拜访"),
UNAUTHORIZED(false, 401, "未认证(签名谬误)"),
INTERNAL_SERVER_ERROR(false, 500, "服务器外部谬误"),
NULL_POINT(false, 200002, "空指针异样"),
PARAM_ERROR(false, 200001, "参数谬误");
/**
* 响应是否胜利
*/
private Boolean success;
/**
* 响应状态码
*/
private Integer code;
/**
* 响应信息
*/
private String message;
ResultCodeEnum(Boolean success, Integer code, String message) {
this.success = success;
this.code = code;
this.message = message;
}
}
对立后果类
- 内部返回调用类对立的后果办法
success,failure
因而结构器公有 - 内置静态方法,间接返回对象
- 便于自定义对立后果信息,应用链式编程,返回对象类自身
return this
- 响应数据为 json 格局,可定义为
JsonObject
或Map
模式
package cn.soboys.springbootrestfulapi.common.resp;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/**
* @author 公众号 程序员三时
* @version 1.0
* @date 2023/4/28 22:47
* @webSite https://github.com/coder-amiao
* 对立响应后果解决 应用链式编程 返回类自身
*/
@Data
public class R {
private Boolean success;
private Integer code;
private String message;
/**
* 接口申请工夫戳
*/
private Long timestamp;
private Map<String, Object> data = new HashMap<>();
private R setSuccess(Boolean success) {
this.success = success;
return this;
}
private R setMessage(String message) {
this.message = message;
return this;
}
private R setData(Map<String, Object> data) {
this.data = data;
return this;
}
private R setCode(Integer code) {
this.code = code;
return this;
}
private R() {}
private R(Long timestamp) {this.timestamp = timestamp;}
/**
* 通用返回胜利
*
* @return
*/
public static R success() {return new R(System.currentTimeMillis())
.setSuccess(ResultCodeEnum.SUCCESS.getSuccess())
.setCode(ResultCodeEnum.SUCCESS.getCode())
.setMessage(ResultCodeEnum.SUCCESS.getMessage());
}
/**
* 通用返回失败
*
* @return
*/
public static R failure() {return new R(System.currentTimeMillis())
.setSuccess(ResultCodeEnum.FAIL.getSuccess())
.setCode(ResultCodeEnum.FAIL.getCode())
.setMessage(ResultCodeEnum.FAIL.getMessage());
}
/**
* 设置后果,形参为后果枚举
*
* @param result
* @return
*/
public static R setResult(ResultCodeEnum result) {return new R(System.currentTimeMillis())
.setSuccess(result.getSuccess())
.setCode(result.getCode())
.setMessage(result.getMessage());
}
// 自定义返回数据
public R data(Map<String, Object> map) {return this.setData(map);
}
// 通用设置 data
public R data(String key, Object value) {this.data.put(key, value);
return this;
}
// 自定义状态信息
public R message(String message) {return this.setMessage(message);
}
// 自定义状态码
public R code(Integer code) {return this.setCode(code);
}
// 自定义返回后果
public R success(Boolean success) {return this.setSuccess(success);
}
}
管制层调用返回
package cn.soboys.springbootrestfulapi.controller;
import cn.soboys.springbootrestfulapi.common.resp.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* @author 公众号 程序员三时
* @version 1.0
* @date 2023/4/28 23:58
* @webSite https://github.com/coder-amiao
*/
@RestController
public class IndexController {@GetMapping("/index")
public R index() {Map m = new HashMap();
m.put("name", "Tom");
m.put("age", 25);
m.put("sex", "男");
return R.success().data(m);
}
@GetMapping("/home")
public R home() {Student s = new Student();
s.setUserName("Tom");
s.setBalance(2229891.0892);
return R.success().data("user", s).message("查问用户详情信息");
}
/**
* 异样返回模仿
*
* @return
*/
@GetMapping("/exception")
public R exception() {
Map m = null;
m.put("name", "Jack");
return R.success().data("user", m).message("查问用户详情信息");
}
}
对立后果类的应用参考了 mybatis-plus 中 R 对象的设计。
问题思考
应用对立返回后果时,还有一种状况,就是程序因为运行时异样导致的后果,有些异样咱们可
能无奈提前预知,不能失常走到咱们 return 的 R 对象返回。
这个时候该如何解决
下一篇文章会持续分享,留下你的思考
筹备从零做一套本人的开发脚手架模板,关注公众 程序员三时