您好,登錄后才能下訂單哦!
本篇內容主要講解“如何約定前后端對接數據格式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何約定前后端對接數據格式”吧!
清單1:返回信息格式約定源碼示例
package site.syksy.qingzhou.web.response; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.media.Schema; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import java.io.Serializable; /** * @author Raspberry */ @Schema(title = "返回信息") public class ResponseMessage<T> implements Serializable { private static final long serialVersionUID = 1L; @Schema(title = "是否成功") private Boolean success; @Schema(title = "數據") private T data; @Schema(title = "錯誤碼") private String errorCode; @Schema(title = "錯誤信息") private String errorMessage; /** * error display type: 0 silent; 1 message.warn; 2 message.error; 4 notification; 9 page */ @Schema(title = "錯誤信息顯示類型") private Integer showType; /** * Convenient for back-end Troubleshooting: unique request ID */ @Schema(title = "唯一請求ID") private String traceId; /** * onvenient for backend Troubleshooting: host of current access server */ @Schema(title = "當前訪問服務器的主機") private String host; ......省略部分代碼,詳細請到輕舟源碼中查找...... }
ResponseMessage 類中的屬性是依據 ant design pro 文檔中推薦。
約定好前后端交互數據格式后,我們將在每個 HTTP 接口方法中對返回結果進行包裝,但這樣顯得冗余。這些重復冗余的代碼能否集中處理呢?當然是可以的!只需創(chuàng)建一個類,實現 **ResponseBodyAdvice **接口,再加上一個注解 **@RestControllerAdvice **就能實現統(tǒng)一對返回結果進行包裝處理,具體請看清單2中的源碼。
清單2:統(tǒng)一包裝返回信息源碼示例
package site.syksy.qingzhou.web.response; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; /** * @author Raspberry */ @RestControllerAdvice public class GeneralResponseBodyAdvice implements ResponseBodyAdvice<Object> { private final static String PACKAGE_PATH = "site.syksy.qingzhou"; @Override public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) { String className = methodParameter.getMethod().getDeclaringClass().getName(); if (className.startsWith(PACKAGE_PATH)) { return true; } else { return false; } } @Override public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { if (o instanceof ResponseMessage) { return o; } if (o instanceof String) { return ResponseMessage.success(o).toJSON(); } return ResponseMessage.success(o); } }
**GeneralResponseBodyAdvice **類中的兩個方法解釋如下:
supports:通過檢查 Controller 類包路徑是否匹配 site.syksy.qingzhou,返回 ture ,則會執(zhí)行 beforeBodyWrite 方法。
beforeBodyWrite:先對 Controller 返回結果進行判斷,是否已包裝過(類型屬于 ResponseMessage ),是否是 String 類型( String 類型,后續(xù)轉換器不會將其轉成 json)。如果以上判斷皆未通過,將對結果包裝成 ResponseMessage 格式。
清單2示例中通過包路徑來約束,也可通過其它方式來約束。不過注意,一定要約束范圍,否則如 springdoc-openapi 的接口也將包裝,則訪問 swagger ui 時將不能正確解析。
到此,相信大家對“如何約定前后端對接數據格式”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。