91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么實現OpenAPI開發動態處理接口的返回數據

發布時間:2023-04-13 17:47:58 來源:億速云 閱讀:175 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么實現OpenAPI開發動態處理接口的返回數據”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么實現OpenAPI開發動態處理接口的返回數據”文章能幫助大家解決問題。

0 | 需求說明

業務場景:服務A對接了服務B,服務C等服務的一些接口,然后由服務A統一暴露接口給到外部用戶使用。

需求是:

  • 服務A可以動態的接入服務B/C的接口,對外暴露并無需重啟

  • 對接的服務B/C的接口部分字段需要過濾掉,不透出給外部用戶(如數據庫的自增ID等敏感信息)。

1 | 思路方案

基本思路:在服務A里對各個服務接口返回的數據進行攔截并二次加工后再返回給前端。

  • 攔截:比較簡單,可以在服務A對其他服務接口請求的返回之后進行業務操作,也可以統一放到切面里用 @After 注解進行操作。從 demo 的快速演示考慮,這里選擇直接在請求的返回體直接進行業務操作。

  • 二次加工:服務A對返回body的部分字段過濾掉,不返回給前端。二次加工的方法有很多種,比如:

  • a. 用一個 map 去接收 body,然后對這個 body map 進行遍歷,和服務A里的 map 進行比較, 將服務A map 里需要的 key-value,從 body map 里遍歷取出,put 到一個新的 map,最后返回這個新的 map 給前端。

  • b. 用 string 去接收 body,接收到的body是一個 json 字符串,然后將 json 字符串轉成特定的對象(這個對象是返回給前端的),這樣對象里沒有定義的字段在 json 字符串轉對象的過程中就會被舍棄。

方案a有幾個缺陷:

  • 首先,要求其他服務接口的返回必須是一個 json 類型(可用 map 接收),如果是一個 json數組([{},{}])的話, 就無法用map接收,這樣會導致對接入服務的接口數據結構有限制,不ok;

  • 其次,map 數據類型可能會很復雜,由于不確定 map 里的 value的數據結構是 string,list 還是 map 等,就需要用 instanceof 對所有的數據結構進行遍歷判斷再比較賦值,很復雜,計算效率也不高。

  • 沒有可利用的輪子,類似將對象A賦值給對象B的屬性拷貝(BeanUtils.copyProperties()),可以將mapA的 key-value 賦值給mapB

# mapA
{
    "a": "a",
    "b": "b",
    "c": "c"
}
# mapB
{
    "a": null,
    "b": null,
}

相反,方案b有一個很大的優勢:可以利用現成的序列化和反序列化工具(如Gson)來實現我們的需求。先放一個反序列化的工具,后面會用到:

/**
 * Json字符串轉為指定的對象
 * @param ret json字符串
 * @param clazz 指定對象的類
 * @return T 指定的對象
 */
public class JsonUtil {
    public static  <T> T jsonStr2Obj(String ret, Class<T> clazz) {
        Gson gson = new Gson();
        return gson.fromJson(ret, (Type) clazz);
    }    
}

但是說到這里,解決的只是對接口返回body的修改,沒有體現出標題的“動態”二字。那么如何可以動態的對返回的body數據進行過濾處理呢?用 groovy 動態加載類。

2 | 具體實施

  • 獲取接口的返回(以string類型):

ResponseEntity<String> exchange = restTemplate.getForEntity($url, String.class);
String body = exchange.getBody();
  • 通過groovy獲取動態編譯類

String clazzInString = getFromRedis($key) // 從redis獲取字符串類型的java class
Object obj = DynamicClassCompilerUtil.run(clazzInString)
public class DynamicClassCompilerUtil {
    public static Object run(String cls) {
        Class<?> clazz = new GroovyClassLoader().parseClass(cls);
        try {
            return clazz.newInstance();
        } catch (Exception e) {
            log.error("parse groovy class failed: {}", e);
            return null;
        }
    }
}
  • 將 body 反序列化

Object ret = JsonUtil.jsonStr2Obj(body, obj.getClass())

該 ret 對象即為過濾后的對象,可以加工后返回給前端。

關于“怎么實現OpenAPI開發動態處理接口的返回數據”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桐城市| 昆山市| 辉县市| 凤庆县| 二手房| 伊宁县| 泌阳县| 奉贤区| 永德县| 从化市| 哈密市| 潞城市| 阳泉市| 泊头市| 民和| 夹江县| 高淳县| 拜泉县| 曲靖市| 临沭县| 连山| 邳州市| 通城县| 深泽县| 钦州市| 裕民县| 漳浦县| 合水县| 依安县| 阳朔县| 腾冲县| 宁明县| 大方县| 普洱| 大荔县| 康乐县| 大同县| 常山县| 阳江市| 原平市| 亳州市|