R响应实体
- 响应实体R(Response Entity)具体作用说明?
-
- 普通响应实体
- 优化后的R:高级响应实体类
响应实体R(Response Entity)具体作用说明?
1、用与数据传输
- 传输请求结果 :当客户端向服务器发送请求后,服务器通过响应实体将请求的处理结果返回给客户端。例如,在一个在线购物系统中,客户端请求查看某个商品的详情,服务器将商品的名称、价格、库存等详细信息封装在响应实体中发送给客户端。
- 携带资源内容 :对于资源获取类的请求,响应实体可以携带具体的资源内容,如网页的 HTML 代码、图片数据、文件内容等。比如用户请求访问一个网页时,服务器将网页的 HTML 文件作为响应实体返回,客户端浏览器根据该响应实体内容进行页面渲染。
2、用于状态反馈
- 指示请求处理状态 :响应实体中的状态码可以明确指示请求的处理情况,如成功(2xx)、客户端错误(4xx)、服务器错误(5xx)等。例如,状态码 200 表示请求已成功处理,404 表示请求的资源未找到,500 表示服务器内部错误等。
- 提供详细状态信息 :除了状态码,响应实体还可以包含更详细的状态描述信息,帮助客户端更好地理解请求的处理结果。比如在返回 401 未授权状态码时,响应实体中可以包含提示信息,如 “未提供有效的身份验证凭据” 等。
3、指令与控制
- 指导客户端操作 :响应实体可以包含一些指令,指导客户端进行后续的操作。例如,在文件下载请求的响应中,服务器可以指示客户端以特定的方式处理下载的文件,如自动打开、保存到指定目录等。
- 控制客户端行为 :通过响应实体,服务器可以对客户端的行为进行一定程度的控制,如限制客户端的访问频率、控制客户端对某些资源的访问权限等。
普通响应实体
package com.pojo.vo;import java.io.Serializable;
public class R implements Serializable {private static final long serialVersionUID = 1L;private Integer code;private String message;private Object data;public R() {}public R(Integer code, String message, Object data) {this.code = code;this.message = message;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public static R ok() {return new R(200, "成功", null);}public static R ok(Object data) {return new R(200, "成功", data);}public static R ok(String message, Object data) {return new R(200, message, data);}public static R error() {return new R(500, "失败", null);}public static R error(String message) {return new R(500, message, null);}public static R error(Integer code, String message) {return new R(code, message, null);}
}
优化后的R:高级响应实体类
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import org.springframework.context.MessageSource;
public class R implements Serializable {private static final long serialVersionUID = 1L;public static final int CODE_SUCCESS = 200;public static final int CODE_BAD_REQUEST = 400;public static final int CODE_UNAUTHORIZED = 401;public static final int CODE_FORBIDDEN = 403;public static final int CODE_NOT_FOUND = 404;public static final int CODE_INTERNAL_ERROR = 500;private Integer code;private String message;private Object data;private Map<String, String> headers = new HashMap<>();public R() {}public R(Integer code, String message, Object data) {this.code = code;this.message = message;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public Map<String, String> getHeaders() {return headers;}public void setHeaders(Map<String, String> headers) {this.headers = headers;}public static R ok() {return new R(CODE_SUCCESS, "成功", null);}public static R ok(Object data) {return new R(CODE_SUCCESS, "成功", data);}public static R ok(String messageKey, Object... args) {String message = MessageSource.getMessage(messageKey, args, Locale.getDefault());return new R(CODE_SUCCESS, message, null);}public static R error() {return new R(CODE_INTERNAL_ERROR, "失败", null);}public static R error(String message) {return new R(CODE_INTERNAL_ERROR, message, null);}public static R error(Integer code, String message) {return new R(code, message, null);}public static R resourceNotFound() {return new R(CODE_NOT_FOUND, "资源未找到", null);}public static R forbidden() {return new R(CODE_FORBIDDEN, "禁止访问", null);}public static R badRequest() {return new R(CODE_BAD_REQUEST, "请求错误", null);}public static R unauthorized() {return new R(CODE_UNAUTHORIZED, "未授权", null);}public static R validationError(List<String> errors) {return new R(CODE_BAD_REQUEST, "参数验证失败", errors);}public R code(Integer code) {this.code = code;return this;}public R message(String message) {this.message = message;return this;}public R data(Object data) {this.data = data;return this;}public R header(String name, String value) {headers.put(name, value);return this;}public R put(String key, Object value) {if (this.data == null) {this.data = new HashMap<>();}((Map<String, Object>) this.data).put(key, value);return this;}public static R okWithPage(Object content, Long totalElements, Integer totalPages, Integer currentPage) {return new R(CODE_SUCCESS, "成功", content).put("totalElements", totalElements).put("totalPages", totalPages).put("currentPage", currentPage);}public static R okWithI18n(String messageKey, Object... args) {String message = MessageSource.getMessage(messageKey, args, Locale.getDefault());return new R(CODE_SUCCESS, message, null);}public static R okWithCache(Object data, long cacheTime) {return new R(CODE_SUCCESS, "成功", data).header("Cache-Control", "max-age=" + cacheTime);}public static R validationError(List<String> errors) {return new R(CODE_BAD_REQUEST, "参数验证失败", errors);}private static class MessageSource {public static String getMessage(String messageKey, Object[] args, Locale locale) {ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);return bundle.getString(messageKey);}}
}