亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解如何實(shí)現(xiàn)OpenAPI開(kāi)發(fā)動(dòng)態(tài)處理接口的返回?cái)?shù)據(jù)

 更新時(shí)間:2023年04月13日 11:07:35   作者:爛筆頭  
這篇文章主要為大家介紹了OpenAPI開(kāi)發(fā)動(dòng)態(tài)處理接口的返回?cái)?shù)據(jù)如何實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

0 | 需求說(shuō)明

業(yè)務(wù)場(chǎng)景:服務(wù)A對(duì)接了服務(wù)B,服務(wù)C等服務(wù)的一些接口,然后由服務(wù)A統(tǒng)一暴露接口給到外部用戶使用。

需求是:

1 | 思路方案

基本思路:在服務(wù)A里對(duì)各個(gè)服務(wù)接口返回的數(shù)據(jù)進(jìn)行攔截并二次加工后再返回給前端。

  • 攔截:比較簡(jiǎn)單,可以在服務(wù)A對(duì)其他服務(wù)接口請(qǐng)求的返回之后進(jìn)行業(yè)務(wù)操作,也可以統(tǒng)一放到切面里用 @After 注解進(jìn)行操作。從 demo 的快速演示考慮,這里選擇直接在請(qǐng)求的返回體直接進(jìn)行業(yè)務(wù)操作。
  • 二次加工:服務(wù)A對(duì)返回body的部分字段過(guò)濾掉,不返回給前端。二次加工的方法有很多種,比如:
  • a. 用一個(gè) map 去接收 body,然后對(duì)這個(gè) body map 進(jìn)行遍歷,和服務(wù)A里的 map 進(jìn)行比較, 將服務(wù)A map 里需要的 key-value,從 body map 里遍歷取出,put 到一個(gè)新的 map,最后返回這個(gè)新的 map 給前端。
  • b. 用 string 去接收 body,接收到的body是一個(gè) json 字符串,然后將 json 字符串轉(zhuǎn)成特定的對(duì)象(這個(gè)對(duì)象是返回給前端的),這樣對(duì)象里沒(méi)有定義的字段在 json 字符串轉(zhuǎn)對(duì)象的過(guò)程中就會(huì)被舍棄。

方案a有幾個(gè)缺陷:

  • 首先,要求其他服務(wù)接口的返回必須是一個(gè) json 類(lèi)型(可用 map 接收),如果是一個(gè) json數(shù)組([{},{}])的話, 就無(wú)法用map接收,這樣會(huì)導(dǎo)致對(duì)接入服務(wù)的接口數(shù)據(jù)結(jié)構(gòu)有限制,不ok;
  • 其次,map 數(shù)據(jù)類(lèi)型可能會(huì)很復(fù)雜,由于不確定 map 里的 value的數(shù)據(jù)結(jié)構(gòu)是 string,list 還是 map 等,就需要用 instanceof 對(duì)所有的數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷判斷再比較賦值,很復(fù)雜,計(jì)算效率也不高。
  • 沒(méi)有可利用的輪子,類(lèi)似將對(duì)象A賦值給對(duì)象B的屬性拷貝(BeanUtils.copyProperties()),可以將mapA的 key-value 賦值給mapB
# mapA
{
    "a": "a",
    "b": "b",
    "c": "c"
}
# mapB
{
    "a": null,
    "b": null,
}

相反,方案b有一個(gè)很大的優(yōu)勢(shì):可以利用現(xiàn)成的序列化和反序列化工具(如Gson)來(lái)實(shí)現(xiàn)我們的需求。先放一個(gè)反序列化的工具,后面會(huì)用到:

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

但是說(shuō)到這里,解決的只是對(duì)接口返回body的修改,沒(méi)有體現(xiàn)出標(biāo)題的“動(dòng)態(tài)”二字。那么如何可以動(dòng)態(tài)的對(duì)返回的body數(shù)據(jù)進(jìn)行過(guò)濾處理呢?用 groovy 動(dòng)態(tài)加載類(lèi)。

2 | 具體實(shí)施

  • 獲取接口的返回(以string類(lèi)型):
ResponseEntity<String> exchange = restTemplate.getForEntity($url, String.class);
String body = exchange.getBody();
  • 通過(guò)groovy獲取動(dòng)態(tài)編譯類(lèi)
String clazzInString = getFromRedis($key) // 從redis獲取字符串類(lèi)型的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 對(duì)象即為過(guò)濾后的對(duì)象,可以加工后返回給前端。

至此,“對(duì)接的服務(wù)B/C的接口部分字段需要過(guò)濾掉,不透出給外部用戶(如數(shù)據(jù)庫(kù)的自增ID等敏感信息)” 需求實(shí)現(xiàn)了。

至于 “服務(wù)A可以動(dòng)態(tài)的接入服務(wù)B/C的接口,對(duì)外暴露并無(wú)需重啟” 需求,有時(shí)間的話,將會(huì)另起一篇來(lái)講,更多關(guān)于OpenAPI動(dòng)態(tài)處理接口返回?cái)?shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java兩個(gè)List<T> 求交集,差集,并集,去重后的并集

    Java兩個(gè)List<T> 求交集,差集,并集,去重后的并集

    本文主要介紹了Java兩個(gè)List<T> 求交集,差集,并集,去重后的并集,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • servlet上傳文件實(shí)現(xiàn)代碼詳解(四)

    servlet上傳文件實(shí)現(xiàn)代碼詳解(四)

    這篇文章主要為大家詳細(xì)介紹了servlet上傳文件的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java使用Lettuce客戶端在Redis在主從復(fù)制模式下命令執(zhí)行的操作

    Java使用Lettuce客戶端在Redis在主從復(fù)制模式下命令執(zhí)行的操作

    這篇文章主要介紹了Java使用Lettuce客戶端在Redis在主從復(fù)制模式下命令執(zhí)行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Java RandomAccessFile的用法詳解

    Java RandomAccessFile的用法詳解

    下面小編就為大家?guī)?lái)一篇Java RandomAccessFile的用法詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • hadoop?切片機(jī)制分析與應(yīng)用

    hadoop?切片機(jī)制分析與應(yīng)用

    切片這個(gè)詞對(duì)于做過(guò)python開(kāi)發(fā)的同學(xué)一定不陌生,但是與hadoop中的切片有所區(qū)別,hadoop中的切片是為了優(yōu)化hadoop的job在處理過(guò)程中MapTask階段的性能達(dá)到最優(yōu)而言
    2022-02-02
  • Java求兩集合中元素交集的四種方法對(duì)比分析

    Java求兩集合中元素交集的四種方法對(duì)比分析

    這篇文章主要介紹了Java求兩集合中元素交集的四種方法對(duì)比總結(jié),四種求集合中元素交集的方法,按照在處理大量數(shù)據(jù)的效率來(lái)看,使用map集合的特性的方法效率最高,之后是使用Java流的方法,其次是使用for循環(huán)和迭代器的方法,需要的朋友可以參考下
    2023-05-05
  • Javaweb開(kāi)發(fā)中通過(guò)Servlet生成驗(yàn)證碼圖片

    Javaweb開(kāi)發(fā)中通過(guò)Servlet生成驗(yàn)證碼圖片

    這篇文章主要為大家詳細(xì)介紹了Javaweb開(kāi)發(fā)中通過(guò)Servlet生成驗(yàn)證碼圖片的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • IDEA 2022 CPU占用100%的問(wèn)題及解決方法

    IDEA 2022 CPU占用100%的問(wèn)題及解決方法

    這篇文章主要介紹了IDEA 2022 CPU占用100%問(wèn)題及解決方法,其實(shí)解決方法很簡(jiǎn)單,只需要禁用三個(gè)插件然后重啟idea即可成功解決,需要的朋友可以參考下本文
    2022-08-08
  • 使用自定義Json注解實(shí)現(xiàn)輸出日志字段脫敏

    使用自定義Json注解實(shí)現(xiàn)輸出日志字段脫敏

    這篇文章主要介紹了使用自定義Json注解實(shí)現(xiàn)輸出日志字段脫敏,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot2零基礎(chǔ)到精通之JUnit 5與指標(biāo)監(jiān)控

    SpringBoot2零基礎(chǔ)到精通之JUnit 5與指標(biāo)監(jiān)控

    SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)JUnit 5與指標(biāo)監(jiān)控
    2022-03-03

最新評(píng)論