From 72b4a4023f4e129a0cf653936e34a6a537554ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 6 Jun 2025 22:25:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7Response?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/zhangdeman/context/Response.java | 84 ++++++++++++++++++- .../cn/zhangdeman/context/RuntimeContext.java | 17 ++-- 2 files changed, 87 insertions(+), 14 deletions(-) diff --git a/src/main/java/cn/zhangdeman/context/Response.java b/src/main/java/cn/zhangdeman/context/Response.java index a0ccd6f..48a6879 100644 --- a/src/main/java/cn/zhangdeman/context/Response.java +++ b/src/main/java/cn/zhangdeman/context/Response.java @@ -1,12 +1,15 @@ package cn.zhangdeman.context; import cn.zhangdeman.consts.RecordField; +import cn.zhangdeman.exception.CustomException; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletResponse; import lombok.Getter; import lombok.Setter; +import org.springframework.http.HttpStatus; import java.util.HashMap; import java.util.Map; @@ -15,7 +18,7 @@ import java.util.Map; @Getter @Setter @JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知属性字段 -public class Response { +public class Response { @JsonProperty(RecordField.REQUEST_ID) private String requestId; // 本次请求request id @JsonProperty(RecordField.TRACE_ID) @@ -27,17 +30,25 @@ public class Response { @JsonProperty(RecordField.RESPONSE_MESSAGE) private String message; // 响应消息 @JsonProperty(RecordField.RESPONSE_DATA) - private Object data; // 响应数据 + private Data data; // 响应数据 @JsonProperty(RecordField.RESPONSE_ERROR_DETAIL) private Object errorDetail; // 异常详情 @JsonProperty(RecordField.RESPONSE_HTTP_CODE) - private Integer httpCode = 200; // 响应http状态码 + private HttpStatus httpCode = HttpStatus.OK; // 响应http状态码, 默认 200 @JsonProperty(RecordField.RESPONSE_HEADER) private Map header; // 响应头 @JsonProperty(RecordField.RESPONSE_COOKIE) private Map cookie; // 响应cookie @JsonIgnore - private HttpServletResponse httpServletResponse; // 响应实例 + private RuntimeContext runtimeContext; + + // 响应实例 + public Response(RuntimeContext runtimeContext) { + this.runtimeContext = runtimeContext; + setTraceId(runtimeContext.getTraceId()); + setRequestId(runtimeContext.getRequestId()); + setCost(System.currentTimeMillis() - runtimeContext.getStartTimeStamp()); // 耗时, 毫秒 + } public void addHeader(String key, String value) { if (null == this.header) { @@ -52,4 +63,69 @@ public class Response { } this.cookie.put(key, value); } + + // 设置响应的header与cookie + private void setResponseHeaderAndCookie() { + // 设置header + if (null != getHeader()) { + // 处理header + for (Map.Entry headerInfo: getHeader().entrySet()) { + runtimeContext.getHttpServletResponse().addHeader(headerInfo.getKey(), headerInfo.getValue()); + } + } + // 设置cookie + if (null != getCookie()) { + // 处理header + for (Map.Entry cookieInfo: getCookie().entrySet()) { + runtimeContext.getHttpServletResponse().addCookie(new Cookie(cookieInfo.getKey(), cookieInfo.getValue())); + } + } + // 设置响应状态码 + runtimeContext.getHttpServletResponse().setStatus(getHttpCode().value()); + } + + // 请求成功, 200 状态码 + public Response success(Data data) { + return success(HttpStatus.OK, data); + } + + // 请求成功, 自定义http状态码 + public Response success(HttpStatus httpStatus, Data data) { + if (null == getCode()) { + setCode("0"); + } + if (null == message) { + setMessage("请求成功"); + } + return any(httpStatus, getCode(), getMessage(), data); + } + + // 请求失败, 返回200 + public Response failure(String code, String message, Object errorDetail) { + return failure(HttpStatus.OK, code, message, errorDetail); + } + + public Response failure(HttpStatus httpStatus, String code, String message, Object errorDetail) { + setErrorDetail(errorDetail); + return any(httpStatus, code, message, null); + } + + public Response failure(CustomException customException) { + return failure(HttpStatus.OK, customException); + } + + public Response failure(HttpStatus httpStatus, CustomException customException) { + setErrorDetail(customException.getStackTrace()); // 异常堆栈 + return any(httpStatus, customException.getCode(), customException.getMessage(), null); + } + + // 任意姿势的响应 + public Response any(HttpStatus httpStatus, String code, String message, Data data) { + setHttpCode(httpStatus); + setCode(code); + setMessage(message); + setData(data); + setResponseHeaderAndCookie(); + return this; + } } diff --git a/src/main/java/cn/zhangdeman/context/RuntimeContext.java b/src/main/java/cn/zhangdeman/context/RuntimeContext.java index 062f3e3..c9b8f13 100644 --- a/src/main/java/cn/zhangdeman/context/RuntimeContext.java +++ b/src/main/java/cn/zhangdeman/context/RuntimeContext.java @@ -1,11 +1,14 @@ package cn.zhangdeman.context; import cn.zhangdeman.consts.RecordField; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.Getter; import lombok.Setter; @@ -19,24 +22,18 @@ import java.util.Map; public class RuntimeContext implements Serializable { @JsonProperty(RecordField.REQUEST_ID) private String requestId; // 本次请求request id - @JsonProperty(RecordField.COST) - private Long cost; // 请求耗时 @JsonProperty(RecordField.SERVER_IP) private String serverIp; // 服务器Ip @JsonProperty(RecordField.SERVER_HOSTNAME) private String serverHostname; // 服务器hostname - @JsonProperty(RecordField.FINISH_TIMESTAMP) - private Long finishTimeStamp; // 完成请求时间 @JsonProperty(RecordField.TRACE_ID) private String traceId; // 全局trace id @JsonProperty(RecordField.START_TIMESTAMP) private Long startTimeStamp; // 开始请求时间 - @JsonProperty(RecordField.CONTEXT_DATA) - private Map logData; // 本条日志的上下文信息 - @JsonProperty(RecordField.REQUEST_INFO) - private Request requestInfo;// 请求信息 - @JsonProperty(RecordField.RESPONSE_INFO) - private Response responseInfo; // 响应信息 + @JsonIgnore + private HttpServletRequest httpServletRequest;// 请求实例 + @JsonIgnore + private HttpServletResponse httpServletResponse; // 相应实例 // 序列化 @Override