现在BS架构的应用一般都采用前后端分离的架构,前端技术框架可采用VUE等,后端框架目前成熟且使用广泛的就是基于SpringBoot开发的后端微服务框架。
数据格式
这里主要介绍一下如何实现返回统一的数据格式,比如返回的样例数据如下图所示:
项目结构
新建一个SpringBoot项目如下,目录结构以及相关文件如下所示:
先定义返回的数据实体,需要两个类:
ResultEnum
package org.example.web.model;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum ResultEnum {
SUCCESS(200, "操作成功"),
FAIL(300,"获取数据失败"),
USER_NOT_FOUND(301,"用户不存在,请重新登录"),
ERROR(302,"错误请求"),
USERNAME_PASSWORD_ERROR(303,"用户名或密码错误"),
INVALID_TOKEN(400,"无效Token,请重新登录"),
TOKEN_VERIFY_ERROR(401,"Token验证失败,请重新登录"),
TOKEN_EXPIRE(402,"token已过期");
private final Integer code;
private final String msg;
public static ResultEnum getResult(Integer code){
for (ResultEnum value : ResultEnum.values()) {
if (code.equals(value.getCode())){
return value;
}
}
return ResultEnum.ERROR;
}
}
前后端交互实体R
package org.example.web.model;
import lombok.Data;
import java.io.Serializable;
@Data
public class R<T> implements Serializable {
private static final long serialVersionUID = 56665257244236049L;
private Integer code;
private String message;
private T data;
private R() {
}
public static <T> R<T> ok(T data) {
R<T> response = new R<>();
response.setCode(ResultEnum.SUCCESS.getCode());
response.setMessage(ResultEnum.SUCCESS.getMsg());
response.setData(data);
return response;
}
public static <T> R<T> error(Integer errCode, String errMessage) {
R<T> response = new R<>();
response.setCode(errCode);
response.setMessage(errMessage);
return response;
}
public static <T> R<T> error(ResultEnum responseEnum) {
R<T> response = new R<>();
response.setCode(responseEnum.getCode());
response.setMessage(responseEnum.getMsg());
return response;
}
}
实体类User
package org.example.web.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Builder;
import lombok.Data;
import java.util.Date;
@Data
@Builder
public class User {
private String id;
private String username;
@JsonIgnore
private String password;
private String name;
private Integer age;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
}
为了便于属性赋值,这里采用lombok的链式赋值,使用@Builder注解,用法如下:
// 实例化一个对象
User user = User.builder().id("1").username("test").name("张三").age(20).createTime(new Date()).build();
当实体的某些属性需要格式化时,比如时间,可使用@JsonFormat,参数说明如下:
pattern:时区
timezone:时区
@JsonFormat 默认是标准时区的时间,中国地区会少8小时,因此使用时,按需求加上时区,北京时间为东八区,timezone=“GMT+8”
接口IndexController
package org.example.web.controller;
import org.example.web.model.R;
import org.example.web.model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
public class IndexController {
// http://127.0.0.1:8080/user
@RequestMapping("/user")
public R<User> user() {
User user = User.builder().id("1").username("test").name("张三").age(20).createTime(new Date()).build();
return R.ok(user);
}
}
运行
运行后,访问http://localhost:8080/user