聚合系統(tǒng)設(shè)計(jì):利用泛型來(lái)重構(gòu)三方服務(wù)的底層調(diào)用
主流官媒都開始使用“標(biāo)題黨”這種網(wǎng)絡(luò)傳播套路了....適當(dāng)網(wǎng)絡(luò)化表達(dá)可增強(qiáng)傳播力,但過度追求流量易損害公信力。關(guān)鍵在于平衡,區(qū)分時(shí)政要聞與文化報(bào)道的傳播尺度,在創(chuàng)新形式的同時(shí)堅(jiān)守媒體責(zé)任,實(shí)現(xiàn)有效傳播與價(jià)值引領(lǐng)的統(tǒng)一。
↓↓↓以下為正文?!?/p>
三方服務(wù)API接口響應(yīng)說(shuō)明
我司通道服務(wù)里調(diào)用的一個(gè)三方服務(wù)商,其響應(yīng)結(jié)構(gòu)如下:
| 字段名 | 類型 | 描述 |
|---|---|---|
| code | int | 業(yè)務(wù)響應(yīng)的 code 碼(非 HTTP 狀態(tài)碼) |
| message | string | 返回值的狀態(tài)描述 |
| data | obj | 業(yè)務(wù)數(shù)據(jù),具體字段參考各 API 接口返回值 |
這個(gè)標(biāo)準(zhǔn)化響應(yīng)格式,大家都比較熟悉。正常響應(yīng)時(shí),code=200,并將數(shù)據(jù)結(jié)果放到data里。非正常響應(yīng)時(shí),code是非200的錯(cuò)誤碼,data為空。
- 示例:
錯(cuò)誤響應(yīng)示例:
{"code": 400, "message": "手機(jī)號(hào)格式不正確"}
{"code":404,"data":null,"message":"訂單不存在"}
正確響應(yīng)示例:
{
"code": 200,
"data": {
"orderId": "ORD20250720001",
"status": "已支付",
"amount": 299.00
},
"message": "訂單查詢成功"
}
{"code":200,"message":"用戶簽約成功"}
與之對(duì)應(yīng),我們程序里定義了相應(yīng)的模型類:
@Data
public class SanHeCommonResponse<T> implements Serializable {
/** 業(yè)務(wù)響應(yīng)的code 碼(非HTTP 狀態(tài)碼) */
private Integer code;
/** 返回值的狀態(tài)描述 */
private String message;
/** 業(yè)務(wù)數(shù)據(jù),具體的字段內(nèi)容參考各個(gè)API 接口的返回值 */
private T data;
// 判斷響應(yīng)是否成功(code為200時(shí)表示成功)
public boolean isSuccess(){
return code == 200;
}
}
三方服務(wù)底層調(diào)用封裝——execute方法及實(shí)現(xiàn)
三方服務(wù)API對(duì)接層中,我們將數(shù)據(jù)加密/簽名、http通信、驗(yàn)簽/數(shù)據(jù)解密等通用性功能封裝在底層,見下面的execute方法如下。注意,后面我們重點(diǎn)要談針對(duì)這個(gè)方法的重構(gòu)。
/**
* 安**宇服務(wù)商接口通信(含請(qǐng)求及響應(yīng))封裝
*/
public static SanHeCommonResponse execute(NewSanHeApiEnum apiEnum, String token) {
SanHeCommonRequest requestBody = new SanHeCommonRequest();
requestBody.setNonceStr(RandomUtil.randomString(10));
requestBody.setData...
JSONObject requestParams = JSON.parseObject(JSON.toJSONString(requestBody));
HttpEntity<Object> requestEntity;
HttpHeaders headers = new HttpHeaders();
headers.add("x-access-token", token);
requestEntity = new HttpEntity<>(requestParams, headers);
RestTemplate restTemplate = new RestTemplate();
String body;
try {
url = url.concat(apiEnum.getUrl());
ResponseEntity<String> response = restTemplate.exchange(API_URL, HttpMethod.POST, requestEntity, String.class);
body = response.getBody();
} catch (Exception ex) {
log.error("安**宇接口調(diào)用異常:", ex);
throw BizException.build("接口調(diào)用異常");
}
SanHeCommonResponse sanHeCommonResponse = JSON.parseObject(body, SanHeCommonResponse.class);
if (!sanHeCommonResponse.isSuccess()) {
throw BizException.build(sanHeCommonResponse.getCode(), sanHeCommonResponse.getMessage());
}
return sanHeCommonResponse;
}
execute方法返回值重構(gòu)
OOP程序設(shè)計(jì)的一個(gè)重要思想是明確對(duì)象的職責(zé)。
針對(duì)這種三方服務(wù)對(duì)接的需求場(chǎng)景,我們需要把握好一個(gè)設(shè)計(jì)理念:將三方服務(wù)調(diào)用涉及的數(shù)據(jù)加密/簽名、http通信、驗(yàn)簽/數(shù)據(jù)解密等通用性功能封裝在底層,使上層的接口處理方法專注于接口數(shù)據(jù)的邏輯處理。
這個(gè)execute方法在返回值方面存在的問題是:調(diào)用方需要通過SanHeCommonResponse.data獲取并轉(zhuǎn)換為實(shí)際業(yè)務(wù)數(shù)據(jù),這增加了編碼成本。
SanHeCommonResponse response = execute(API_ORDER, token);
if (!response.isSuccess()) {
throw new BizException("查詢失敗");
}
OrderResponse data = JSON.parseObject(response.getData().toString(), OrderResponse.class);
針對(duì)返回值方面的這個(gè)問題,重構(gòu)結(jié)果如下:
/**
* 安**宇服務(wù)商接口通信(含請(qǐng)求及響應(yīng))封裝
*/
public static <T> T SanHeCommonResponse execute(NewSanHeApiEnum apiEnum, String token, Class<T> clazz) {
...
SanHeCommonResponse<JSONObject> sanHeCommonResponse = JSON.parseObject(body, new TypeReference<SanHeCommonResponse<JSONObject>>(){});//用`new TypeReference<SanHeCommonResponse<JSONObject>>(){}`來(lái)解析帶有泛型的響應(yīng), 避免IDE類型轉(zhuǎn)換警告。
if (!sanHeCommonResponse.isSuccess()) {
throw BizException.build(sanHeCommonResponse.getCode(), sanHeCommonResponse.getMessage());
}
return Optional.ofNullable(sanHeCommonResponse.getData())
.orElse(new JSONObject())
.toJavaObject(clazz);
}
這時(shí),上層調(diào)用直接一行代碼搞定:
OrderResponse data = execute(API_ORDER, token, OrderResponse.class);
重構(gòu)的目的是使方法更通用,能夠直接返回業(yè)務(wù)數(shù)據(jù)對(duì)象,而不是整個(gè)SanHeCommonResponse對(duì)象。通過使用泛型,讓調(diào)用者可以指定期望返回的業(yè)務(wù)數(shù)據(jù)類型,將類型安全性提前至編譯期,有效增強(qiáng)程序健壯性。
當(dāng)看到一些不好的代碼時(shí),會(huì)發(fā)現(xiàn)我還算優(yōu)秀;當(dāng)看到優(yōu)秀的代碼時(shí),也才意識(shí)到持續(xù)學(xué)習(xí)的重要!--buguge
本文來(lái)自博客園,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/buguge/p/19005338
posted on 2025-07-28 09:25 buguge 閱讀(73) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)