完美兼容老項目!Dataway 4.1.6 返回結構的全面控制

Dataway介紹

Dataway 是基於 DataQL 服務聚合能力,爲應用提供的一個接口配置工具。使得使用者無需開發任何代碼就配置一個滿足需求的接口。 整個接口配置、測試、冒煙、發佈。一站式都通過 Dataway 提供的 UI 界面完成。UI 會以 Jar 包方式提供並集成到應用中並和應用共享同一個 http 端口,應用無需單獨爲 Dataway 開闢新的管理端口。

這種內嵌集成方式模式的優點是,可以使得大部分老項目都可以在無侵入的情況下直接應用 Dataway。進而改進老項目的迭代效率,大大減少企業項目研發成本。

Dataway 工具化的提供 DataQL 配置能力。這種研發模式的變革使得,相當多的需求開發場景只需要配置即可完成交付。 從而避免了從數據存取到前端接口之間的一系列開發任務,例如:Mapper、BO、VO、DO、DAO、Service、Controller 統統不在需要。

在《Dataway讓Spring Boot不在需要Controller、Service、DAO、Mapper》文章中,我們介紹瞭如何使用。Dataway 來配置接口避免開發工作。這篇文章來介紹一下剛剛發佈的新版本 Dataway。4.1.6 正式發佈的時間是2020年 05月 10日,整體 Dataway 迭代速度還是非常快的。

如果你是老版本的 Dataway 工程,例如 4.1.3、4.1.4。那麼需要先閱讀一下這篇文章做一下版本升級:《Dataway 4.1.5 以上版本升級指南

老項目

在 4.1.5 之前,所有 Dataway 的接口調用都會有一個 API 標準返回結構,例如:

一些老的項目或者目前正在迭代的項目,有自己的返回值格式定義。這樣一來 Dataway 在項目的融入上就比較麻煩。爲此有一些 issue 在諮詢如何解決這個問題。例如:

如何把返回結果的默認結構去掉 - https://github.com/zycgit/hasor/issues/40

默認結構介紹

在 4.1.6 之後可以通過下面兩種方式來完全自定義返回結構。

默認情況下,模版的內容如上所示。

{
  "success"      : "@resultStatus",   // 執行狀態:失敗還是成功
  "message"      : "@resultMessage",  // 消息
  "code"         : "@resultCode",     // 執行推出碼
  "lifeCycleTime": "@timeLifeCycle",  // 整個執行消耗時間,單位毫秒
  "executionTime": "@timeExecution",  // 真正執行 DataQL 的消耗時間,單位毫秒
  "value"        : "@resultData"      // 執行結果。
}

其中  lifeCycleTime - executionTime ,可以粗略算出。參數解析和 DataQL 查詢編譯的消耗時間。

自定義結構:模版方式

如果我們要改變默認返回的結構,比如下面這種:

{
  "success": true,
  "message": "操作成功!",
  "code": 200,
  "result": ....
}

這時候就可以配置 Structure 爲如下內容:

{
  "success" : "@resultStatus",   // 執行狀態:失敗還是成功
  "message" : "@resultMessage",  // 消息
  "code"    : "@resultCode",     // 執行推出碼
  "value"   : "@resultData"      // 執行結果。
}

在執行一下就會發現出現我們需要的結果了。

自定義結構:代碼方式

有時候模版中想要輸出的內容中模版的內置 變量並沒有提供,例如:我想輸出當前時間戳。

那麼這個時候就可以採用代碼形式,通過代碼我們自定義返回結構。

首先,我們在Dataway 上把 API 的 Structure 關掉。這時所有執行的返回結果都沒有外層結構了。

然後通過 ResultProcessChainSpi 自行封裝我們需要的結構。

apiBinder.bindSpiListener(ResultProcessChainSpi.class, new ResultProcessChainSpi() {
    public Object callAfter(boolean formPre, ApiInfo apiInfo, Object result) {
        if (formPre) {
            return result; //如果前置攔截器處理了。那麼後置攔截器就不處理。
        }
        return new HashMap<String, Object>() {{
            put("method", apiInfo.getMethod());
            put("path", apiInfo.getApiPath());
            put("result", result);
        }};
    }

    public Object callError(boolean formPre, ApiInfo apiInfo, Throwable e) {
        return new HashMap<String, Object>() {{
            put("method", apiInfo.getMethod());
            put("path", apiInfo.getApiPath());
            put("errorMessage", e.getMessage());
         }};
    }
});

再次執行就可以看到我們需要的結果了。

小技巧:如何批量關掉 Structure 

首先 Dataway 頁面上並未提供批量設置  Structure 的能力。不過頁面不提供不代表,其它地方不能做到。這裏提供一個辦法:

apiBinder.bindSpiListener(ResultProcessChainSpi.class, new ResultProcessChainSpi() {
    public Object callAfter(boolean formPre, ApiInfo apiInfo, Object result) {
        if(....) {
            Map<String, Object> optionMap = apiInfo.getOptionMap();
            optionMap.put("resultStructure", false); // 手工設置關閉
            apiInfo.setOptionMap(optionMap);
            return Result.ok(result);
        }
        //
        ....
    }
});

提供這個辦法的 Issue 在這裏:https://github.com/zycgit/hasor/issues/40

 

最後放幾個有用的連接:

- Dataway 官方手冊:https://www.hasor.net/web/dataway/about.html
- Dataway 在 OSC 上的項目地址,歡迎收藏:https://www.oschina.net/p/dataway
- DataQL 手冊地址:https://www.hasor.net/web/dataql/what_is_dataql.html
- Hasor 項目的首頁:https://www.hasor.net/web/index.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章