最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何實現(xiàn)OpenAPI開發(fā)動態(tài)處理接口的返回數(shù)據(jù)

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

0 | 需求說明

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

需求是:

  • 服務(wù)A可以動態(tài)的接入服務(wù)B/C的接口,對外暴露并無需重啟(《OpenAPI開發(fā) | 如何動態(tài)的添加接口》
  • 對接的服務(wù)B/C的接口部分字段需要過濾掉,不透出給外部用戶(如數(shù)據(jù)庫的自增ID等敏感信息)。

1 | 思路方案

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

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

方案a有幾個缺陷:

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

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

/**
 * Json字符串轉(zhuǎn)為指定的對象
 * @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的修改,沒有體現(xiàn)出標(biāo)題的“動態(tài)”二字。那么如何可以動態(tài)的對返回的body數(shù)據(jù)進(jìn)行過濾處理呢?用 groovy 動態(tài)加載類。

2 | 具體實施

  • 獲取接口的返回(以string類型):
ResponseEntity<String> exchange = restTemplate.getForEntity($url, String.class);
String body = exchange.getBody();
  • 通過groovy獲取動態(tài)編譯類
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 對象即為過濾后的對象,可以加工后返回給前端。

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

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

相關(guān)文章

  • JAVA使用POI(XSSFWORKBOOK)讀取EXCEL文件過程解析

    JAVA使用POI(XSSFWORKBOOK)讀取EXCEL文件過程解析

    這篇文章主要介紹了JAVA使用POI(XSSFWORKBOOK)讀取EXCEL文件過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Mybatis使用foreach批量更新數(shù)據(jù)報無效字符錯誤問題

    Mybatis使用foreach批量更新數(shù)據(jù)報無效字符錯誤問題

    這篇文章主要介紹了Mybatis使用foreach批量更新數(shù)據(jù)報無效字符錯誤問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Spring Boot+Nginx實現(xiàn)大文件下載功能

    Spring Boot+Nginx實現(xiàn)大文件下載功能

    相信很多小伙伴,在日常開放中都會遇到大文件下載的情況,大文件下載方式也有很多,比如非常流行的分片下載、斷點(diǎn)下載;當(dāng)然也可以結(jié)合Nginx來實現(xiàn)大文件下載,在中小項目非常適合使用,這篇文章主要介紹了Spring Boot結(jié)合Nginx實現(xiàn)大文件下載,需要的朋友可以參考下
    2024-05-05
  • Java中基于Nacos實現(xiàn)Sentinel規(guī)則持久化詳解

    Java中基于Nacos實現(xiàn)Sentinel規(guī)則持久化詳解

    這篇文章主要介紹了Java中基于Nacos實現(xiàn)Sentinel規(guī)則持久化詳解,Sentinel Dashboard中添加的規(guī)則數(shù)據(jù)存儲在內(nèi)存,微服務(wù)停掉規(guī)則數(shù)據(jù)就消失,在?產(chǎn)環(huán)境下不合適,我們可以將Sentinel規(guī)則數(shù)據(jù)持久化到Nacos配置中?,讓微服務(wù)從Nacos獲取規(guī)則數(shù)據(jù),需要的朋友可以參考下
    2023-09-09
  • Java8實現(xiàn)Stream流的合并的方法展示

    Java8實現(xiàn)Stream流的合并的方法展示

    本文介紹了Java8中Stream流的合并方法,包括concat()、flatMap()和reduce()三種方法。其中,concat()方法可以將兩個Stream流合并成一個,flatMap()方法可以將一個Stream流中的元素映射成多個Stream流并合并成一個,reduce()方法可以將Stream流中的元素逐個合并成一個結(jié)果
    2023-05-05
  • java判斷對象中某個屬性是否為空方法代碼

    java判斷對象中某個屬性是否為空方法代碼

    這篇文章主要給大家介紹了關(guān)于java判斷對象中某個屬性是否為空的相關(guān)資料,最近遇到后臺接收值的時候,需要對接收對象進(jìn)行非空校驗,需要的朋友可以參考下
    2023-07-07
  • Spring boot整合Springfox生成restful的在線api文檔

    Spring boot整合Springfox生成restful的在線api文檔

    這篇文章主要為大家介紹了Spring boot整合Springfox生成restful在線api文檔,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • spring-data-elasticsearch @Field注解無效的完美解決方案

    spring-data-elasticsearch @Field注解無效的完美解決方案

    這篇文章主要介紹了spring-data-elasticsearch @Field注解無效的完美解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot 如何讀取pom.xml中的值

    SpringBoot 如何讀取pom.xml中的值

    這篇文章主要介紹了SpringBoot 如何讀取pom.xml中的值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • ElasticSearch學(xué)習(xí)之文檔API相關(guān)操作

    ElasticSearch學(xué)習(xí)之文檔API相關(guān)操作

    這篇文章主要為大家介紹了ElasticSearch學(xué)習(xí)之文檔API相關(guān)操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評論

汾阳市| 富源县| 襄樊市| 班戈县| 铜鼓县| 重庆市| 崇州市| 阿图什市| 水富县| 清河县| 河南省| 晋宁县| 海晏县| 伊金霍洛旗| 上饶市| 辽阳市| 永济市| 社会| 玉树县| 汪清县| 华亭县| 沧州市| 台东县| 尼木县| 嵩明县| 江山市| 保德县| 全州县| 齐齐哈尔市| 茶陵县| 安陆市| 吉林省| 昭通市| 金秀| 阿城市| 揭阳市| 齐河县| 澄城县| 定襄县| 虞城县| 福建省|