亚洲国产日韩a在线亚洲,久久精品视频一区,国产精品电影网在线好看,欧美女人性生活视频,亚洲伊人天堂,日本精品99

立即注冊

連接器配置

1. 連接器定義

1.1 授權定義

  • auth:連接器調用對應SaaS軟件的授權方式,授權的定義是一個對象,當沒有授權時可以為空

    • authType  授權類型,是第三方SaaS軟件驗證數環通權限的方式,目前主要有以下幾種類型

      • api_token 通過AppKey + AppSecret 直接訪問或者通過AppKey + AppSecret 換取AccessToken進行調用第三方SaaS的API接口,典型的SaaS有:自建釘釘,維格表等

      • oauth2 數環通作為第三方SaaS的平臺服務商申請AppKey+ AppSecret, 用戶通過授權數環通,由數環通獲取用戶的授權AccessToken調用第三方SaaS的API接口,典型的SaaS有:企業微信三方,釘釘三方

        • polling_oauth2 數環通作為第三方SaaS的平臺服務商申請AppKey+ AppSecret, 用戶通過授權數環通,由數環通獲取用戶的授權AccessToken調用第三方SaaS的API接口,但是與Oauth2 的區別在于,用戶的授權信息是通過后端服務接口進行推送的,典型的SaaS有:聚水潭

  • test 測試輸入賬號有效性的執行方法,主要是在新增賬號時調用,用于驗證用戶輸入的數據是否有效,具體執行方法的定義參考執行方法定義

  • validate 驗證當前賬號的授權有效性的執行方法,主要是在賬號新增賬號成功后調用,用于驗證當前授權信息如AccessToken等是否是有效狀態,具體執行方法的定義參考執行方法定義

  • apiTokenConfig api_token類型的配置

    • autoRefresh 是否需要自動刷新,Boolean類型

      • true 需要刷新,需要配置refreshAccessToken

      • false 不需要自動刷新,AccessToken 是永久有效的

    • autoRefreshInterval 自動刷新的間隔,Integer類型 單位秒 例如3600 表示每小時刷新一次token

    • accessToken 獲取AccessToken的執行方法

    • refreshAccessToken 刷新AccessToken的執行方法

  • oauth2Config oauth2 和 polling_oauth2的授權配置

    • autoRefresh 是否需要自動刷新,Boolean類型

      • true 需要刷新,需要配置refreshAccessToken

      • false 不需要自動刷新,AccessToken 是永久有效的

    • autoRefreshInterval 自動刷新的間隔,Integer類型 單位秒 例如3600 表示每小時刷新一次token

    • preAuthorize 獲取授權鏈接前執行方法列表,例如獲取預授權碼

    • authorizeUrl 獲取授權鏈接的執行方法

    • accessToken 獲取AccessToken的執行方法

    • refreshAccessToken 刷新AccessToken的執行方法

  • thirdAuthConfig third_auth類型的配置

    • autoRefresh 是否需要自動刷新,Boolean類型

      • true 需要刷新,需要配置refreshAccessToken

      • false 不需要自動刷新,AccessToken 是永久有效的

    • autoRefreshInterval 自動刷新的間隔,Integer類型 單位秒 例如3600 表示每小時刷新一次token

    • accessToken 獲取AccessToken的執行方法

    • refreshAccessToken 刷新AccessToken的執行方法

  • helpFields 顯示提示幫助的字段列表,如提示用戶如何進行配置賬號和事件訂閱

  • inputFields 用戶需要輸入的參數字段列表,例如Appkey,AppSecret等,具體的字段配置參考字段定義

  • outputFields 保存到數據的參數列表,具體的字段配置參考字段定義

授權類型的說明:

api_token類型的授權流程:

oauth2 授權流程:

polling_oauth2 類型授權流程:

 

1.2 賬號定義

  • asset:連接器的賬號配置,主要是配置授權的哪些數據需要保存到賬號資產的數據庫中

    • autoRefresh 是否需要自動刷新,Boolean類型,需要與授權定義中保持一致

      • true 需要刷新,需要配置refreshAccessToken

      • false 不需要自動刷新,AccessToken 是永久有效的

    • autoRefreshInterval 自動刷新的間隔,Integer類型 單位秒 例如3600 表示每小時刷新一次token

    • assetTemplate 保存的字段列表,用于定義哪些字段需要存進賬號資產中

    • assetNameField 賬號名稱字段

    • assetUkField 賬號唯一性標識字段

 

1.3 模板配置

  • requestTemplate:連接器的請求模板配置,主要是配置當前連接器發起Http請求時的公共參數,如appKey,簽名配置等公共的配置,可以減少請求的配置

    • method 發起請求的方法,支持以下選項

      • GET

      • PUT

      • POST

      • PATCH

      • DELETE

      • HEAD

    • url 請求的完整地址

    • body 請求body配置

      • bodyType  請求體類型

        • NULL 為空

        • STRING 字符串

        • ARRAY 數組

        • OBJECT JSON對象類型

        • XML XML格式

      • bodyContent 請求體內容,根據bodyType傳入具體的值

    • queryParams 查詢請求參數,KV形式

    • formParams  表單請求參數,KV形式

    • headers 頭部請求參數

    • signConfig 簽名配置

      • signType 簽名類型,簽名的實現,目前可以使用簽名腳本類型

        • script 通過簽名腳本進行簽名

      • signOutField 簽名輸出字段

      • signInField 簽名字段參數,KV形式

      • signSetting 簽名配置,針對腳本簽名需要增加以下參數

        • connectorId 連接器ID

        • scriptType 腳本類型

        • sceneCode 場景編碼

        • version 腳本版本

    • responseType 請求返回值類型,默認按照STRING處理

      • BINARY 二進制

      • JSON JSON格式

      • STRING 純文本格式

    • beforeRequest 請求前執行方法列表,一般用于對請求參數進行處理

    • afterResponse 請求后執行方法列表,一般用于對于返回數據進行處理

  • triggerTemplate:消息通知和回調的配置。主要是配置當前連接器接收平臺Http請求時的參數,可用來做觸發器配置

    • pushUrl:消息推送回調地址。如:${eventDomainHost}/event/customPush/com.yuque.app/${assetId}/test

      • com.yuque.app 為連接器ID,用戶務必配置為當前連接器的ID

      • test 為用戶自定義參數

    • pushExecutor:推送數據的腳本配置

      • executeType:執行類型。設置為script

      • connectorId:當前連接器的ID

      • connectorVersion:當前連接器的版本

      • sceneCode:場景碼。這里設置為dealPushEventContent

      • type:腳本類型。可選擇java,js,pythone

      • version:腳本的版本號。可設置為1~9

1.4 觸發器

  • triggers 觸發器列表,用于觸發器定義,觸發器列表是個KV列表,其中Key是觸發器的關鍵字定義,Value是一個觸發器定義

    • key 用于唯一標識觸發器

    • value 觸發器的具體定義

觸發器對象的定義:

  • key 觸發器的key 和前文的key 保持一致

  • paramClass 參數對象類型,主要為了以后對參數映射進行擴展使用,當前暫時可以不配置

  • resultClass 結果對象類型,主要為了以后對參數映射進行擴展使用,當前暫時可以不配置

  • resultIsList 結果是否是一個數組列表,此處主要針對的是一級結果,默認為false

    • true 表示結果是一個數組列表

    • false 表示結果不是一個數組列表

  • display 展示配置,用于前端頁面展示觸發器的名稱等信息m

    • label 觸發器展示的名稱

    • description 觸發器的描述信息

    • directions 鏈接信息,可以設置為該觸發器的來源頁面地址

    • important 是否置頂,默認為false

      • true 表示需要置頂

      • false 表示不需要置頂

    • hidden 是否隱藏,當設置為true時前端不展示該觸發器,默認為false

      • true 表示需要隱藏

      • false 表示不需要隱藏

  • triggerMode 觸發器的模式,主要是定義觸發器的數據來源,目前的選項有:輪詢和事件觸發

    • polling 通過輪詢方式查詢數據,一般是通過時間來查詢某個列表

    • pushing 事件或者消息來源,一般是第三方SaaS通過配置回調接口,進行事件推送

  • triggerConfig 觸發器配置,主要是針對輪詢方式的觸發器的配置

    • cron 輪詢的時間表達式,

    • outOfFrequencyControl 配置為true cron表達式才生效,否則會根據用戶版本設置輪訓周期

    • startTime 開始觸發的時間

    • ukFields 唯一標識記錄的字段列表,主要用于標識該條記錄有沒有觸發過

    • supportPaging 是否支持分頁,支持分頁時需要

      • true 支持

      • false 不支持

    • pageSize 分頁大小設置

    • pageSizeField 分頁大小對應的字段名稱

    • pageIndexField 分頁頁碼對應的字段名稱

  • operation 獲取觸發數據的執行方法,對于輪詢的觸發器需要進行定義,事件觸發的無需定義,要求執行方法返回的數據是數組

  • sample 獲取樣本數據的執行方法,對于輪詢的觸發器需要進行定義,事件觸發的無需定義,要求執行方法返回的數據是單個對象

  • beforeTrigger 觸發器執行請求前執行方法列表,一般用于對請求參數進行處理,beforeTrigger的執行時機是在獲取到觸發事件的數據之后,進行流程觸發之前,對于事件觸發的是在收到第三方的事件觸發之后,對于輪詢觸發的是在執行輪詢operation,獲取到單個對象之后

  • afterTrigger 觸發器后執行方法列表,一般用于對于返回數據進行處理,執行時機是在發出觸發事件之后

1.5 執行器

  • operations 執行器列表,用于執行器定義,執行器列表是個KV列表,其中Key是執行器的關鍵字定義,Value是一個執行器定義

  • key 用于唯一標識執行器

  • value 執行器的具體定義

執行器對象的定義:

  • key 執行器的key 和前文的key 保持一致

  • paramClass 參數對象類型,主要為了以后對參數映射進行擴展使用,當前暫時可以不配置

  • resultClass 結果對象類型,主要為了以后對參數映射進行擴展使用,當前暫時可以不配置

  • resultIsList 結果是否是一個數組列表,此處主要針對的是一級結果,默認為false

    • true 表示結果是一個數組列表

    • false 表示結果不是一個數組列表

  • hidden 是否隱藏,當設置為true時前端不展示該執行器,默認為false

    • true 表示需要隱藏

    • false 表示不需要隱藏

  • display 展示配置,用于前端頁面展示執行器的名稱等信息

    • label 執行器展示的名稱

    • description 執行器的描述信息

    • directions 鏈接信息,可以設置為該執行器的來源頁面地址

    • important 是否置頂,默認為false

      • true 表示需要置頂

      • false 表示不需要置頂

  • categoryName 分類名,把同一類的放在一個組下,如 訂單、商品、

  • operation 執行器的請求定義,在此定義執行器方法(具體定義看 3.8 執行方法定義)

  • inputFields 執行器輸入字段定義

  • outputFields 執行器輸出字段定義

  • tags 該執行器的備注信息

1.6 執行方法定義

執行方法是引擎支持的某個具體的執行定義,當前支持4種類型,分別為:

  • request 請求類型

  • function 函數類型

  • dependency 依賴類型

  • script 腳本類型

根據每個類型有具體的定義:

1.6.1 請求類型

請求類型是指主體功能是調用HTTP API

 

  • executeType: request  請求類型

  • method 發起請求的方法,支持以下選項

    • GET

    • PUT

    • POST

    • PATCH

    • DELETE

    • HEAD

  • url 請求的完整地址

  • body 請求body配置

    • bodyType  請求體類型

      • NULL 為空

      • STRING 字符串

      • ARRAY 數組

      • OBJECT JSON對象類型

      • XML XML格式

    • bodyContent 請求體內容,根據bodyType傳入具體的值

  • queryParams 查詢請求參數,KV形式

  • formParams  表單請求參數,KV形式

  • headers 頭部請求參數 (在此定義優先級高于requestTemplate中的定義)

  • signConfig 簽名配置

    • signType 簽名類型,簽名的實現,目前可以使用簽名腳本類型

      • script 通過簽名腳本進行簽名

    • signOutField 簽名輸出字段

    • signInField 簽名字段參數,KV形式

    • signSetting 簽名配置,針對腳本簽名需要增加以下參數

      • connectorId 腳本連接器ID

      • scriptType 腳本類型

      • sceneCode 場景編碼version 腳本版本

  • beforeRequest 請求前執行方法列表,一般用于對請求參數進行處理

  • afterResponse 請求后執行方法列表,一般用于對于返回數據進行處理

 

1.6.2 函數類型

函數類型是指調用一個內置類的函數,或者內置表達式

  • executeType  function  函數類型

  • isExpress 是否是表達式

    • true 是 執行的是內置表達式

    • false 否 執行的是類方法

  • providerClass 執行類的全路徑,isExpress 為false時必填

示例:

? "providerClass":"com.shuhuan.ipaas.connector.spi.yunpian.InputAndOutputBuilder"

  • function 執行的具體方法,對于表達式來說是具體的表達式,對于執行類方法時是類的方法,對于是表達式時是具體的表達式

示例:

? "function":"generateTemplateContentInput"

? "function":"${assert:equals(0,object:eval(body, '/msg'))}"

  • paramsExpression 參數表達式,對于執行類方法時傳入

  • returnType 返回值類型

    • VOID 無返回值

    • STRING 字符串

    • BOOLEAN 布爾值

    • NUM 數字

    • INT 整形數字

    • ARRAY 數組或者列表

    • OBJECT 對象或者Map類型

  • returnItemType 返回列表的數據類型,returnType是ARRAY時需要

    • VOID 無返回值

    • STRING 字符串

    • BOOLEAN 布爾值

    • NUM 數字

    • INT 整形數字

    • ARRAY 數組或者列表

    • OBJECT 對象或者Map類型

1.6.3 依賴類型

依賴類型是指可以調用一組已經配置的執行動作,并做一些數據處理

  • executeType  dependency  依賴類型

  • dependencyOperationKeys 依賴的執行動作的Key列表

示例:

? "dependencyOperationKeys": ["getUidByMobile", "getUserDetailByUserId"]

  • afterResponse 所有依賴的執行動作執行完成后執行方法列表,一般用于對于返回數據進行處理

 

1.6.4 腳本類型

腳本類型是指執行一個腳本

  • executeType  script  腳本類型

  • connectorId 腳本對應的連接器ID

  • sceneCode 腳本場景碼,用來標識該腳本應用場景

  • type 腳本類型

    • java

    • js

    • python

  • version 腳本版本

  • paramsExpression 執行的參數表達式,表達式為空時將會將整個參數上下文傳入,不為空時計算完成表達式后傳入

  • returnType 返回值類型

    • VOID 無返回值

    • STRING 字符串

    • BOOLEAN 布爾值

    • NUM 數字

    • INT 整形數字

    • ARRAY 數組或者列表

    • OBJECT 對象或者Map類型

  • returnItemType 返回列表的數據類型,returnType是ARRAY時需要

    • VOID 無返回值

    • STRING 字符串

    • BOOLEAN 布爾值

    • NUM 數字

    • INT 整形數字

    • ARRAY 數組或者列表

    • OBJECT 對象或者Map類型

1.7 字段定義

  • key 用于該執行方法中唯一標識字段

  • label 展示配置,用于前端頁面展示字段名稱

  • helpText 幫助信息,作為輸入字段時需要,非必要不填寫

  • placeholder 輸入框提示信息,作為輸入字段時需要

  • type 字段類型

  • widget 前端控件widgetConfig 配置說明文檔

  • widgetConfig 前端組件的配置 KV形式

  • required 是否為必填選項,作為輸入字段時需要

    • true 必填

    • false 選填

  • defaultValue 默認值

  • supportMultiple 是否支持多選,默認false(搭配選擇控件時使用)

    • true 支持

    • false 不支持

  • datasource 可選數據源,KV形式

    • label 展示鍵

    • value 實際值

  • dynamicDataSource 動態數據源 動態數據路由

    • routerType 動態類型

      • beforeRequest 在請求之前

      • afterRequest 在請求響應之后

      • constant 常量

    • condition 判斷是否符合路由條件

    • params  執行動態數據源的參數列表

    • selectCondition 判斷是否可選的條件表達式

    • deepCondition 判斷是否可下拉的條件表達式

    • refOperation 獲取動態數據源的執行動作 

    • refLabel 動態label的取值方式

    • refValue  動態value的取值方式

    • router 下級的路由規則

    • datasource 靜態數據源,routerType 為constant時設置

  • dynamicFields 動態字段 dynamicFields

    • routerType 動態類型

      • beforeRequest 在請求之前

      • afterRequest 在請求響應之后

      • constant 常量

    • condition 判斷是否符合路由條件

    • params 參數列表

    • refOperation 獲取動態字段的執行動作 

    • refInputFields 動態輸入字段的取值表達式

    • refOutputFields 動態輸出字段的取值表達式

    • inputFields 對于routerType 是constant時設置

    • outputFields 對于routerType 是constant時設置

  • childrenType 子節點類型

  • children 子節點

2.簽名腳本開發

在應用shuhuan-ipaas-app-libs的signer目錄下開發簽名類,簽名算法改成通過java執行腳本的方案實現簽名算法,簽名類需要繼承JavaScriptRunner類重寫execute方法    

/**
 * @author yunmu
 * @date 2022-03-04 6:44 下午
 */
public abstract class JavaScriptRunner {

    public abstract <T> T execute(Object params);
}

params 是一個Map對象,Map中會包含以下數據:

  • 上下文參數數據

  • signRequest 待簽名的http請求獲取方式:

HttpApiRequest apiRequest = (HttpApiRequest) paramsMap.get(SignConfigConstant.SIGN_REQUEST);
  • 簽名配置中的signInField 中的信息

  • signOutField 簽名的輸出字段

簽名腳本示例:

package com.shuhuan.ipaas.applibs.signer;

import com.aliyun.unicorn.http.MultipartFormData;
import com.aliyun.unicorn.http.MultipartFormValue;
import com.aliyun.unicorn.http.QueryString;
import com.aliyun.unicorn.sdk.HttpApiRequest;
import com.aliyun.unicorn.type.Consumer;
import com.aliyun.unicorn.type.Parameter;
import com.shuhuan.ipaas.common.ResultCode;
import com.shuhuan.ipaas.core.encryption.Md5Util;
import com.shuhuan.ipaas.exception.IpaasException;
import com.shuhuan.ipaas.meta.constants.SignConfigConstant;
import com.shuhuan.ipaas.script.java.JavaScriptRunner;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

/**
 * @author yunmu
 * @date 2022-03-05 4:22 下午
 */
public class BanniuScriptSigner extends JavaScriptRunner {

    private static final String METHOD = "method";
    private static final String ACCESS_TOKEN = "access_token";
    public static final String TIMESTAMP = "timestamp";
    private static final String SIGN = "sign";

    @Override
    public <T> T execute(Object params) {
        if (!(params instanceof Map)){
            throw new IpaasException(ResultCode.PARAM_ERROR, "params is not map");
        }
        Map<String,Object> paramsMap = (Map<String, Object>) params;
        HttpApiRequest apiRequest = (HttpApiRequest) paramsMap.get(SignConfigConstant.SIGN_REQUEST);
        String appKey = (String) paramsMap.get(SignConfigConstant.APP_KEY);
        String appSecret = (String) paramsMap.get(SignConfigConstant.APP_SECRET);

        QueryString queryString = apiRequest.getQueryString();

        TreeMap<String, String> pmap = new TreeMap<>();
        queryString.foreachValues((paramKey, value) -> {
            pmap.put(paramKey, value);
        });

        MultipartFormData formData = apiRequest.getForm();
        if (formData != null && !formData.isMultipart()) {
            apiRequest.getForm().foreach(new Consumer<Parameter<MultipartFormValue>>() {
                @Override
                public void accept(Parameter<MultipartFormValue> a) {
                    String v = a.getFirstValue() != null ? a.getFirstValue().getValue() : null;
                    if (METHOD.equals(a.getName())) {
                        pmap.put(METHOD, v);
                    }
                    if (ACCESS_TOKEN.equals(a.getName())) {
                        pmap.put(ACCESS_TOKEN, v);
                    }
                    if (TIMESTAMP.equals(a.getName())) {
                        pmap.put(METHOD, v);
                    }
                    if (ACCESS_TOKEN.equals(a.getName())) {
                        pmap.put(ACCESS_TOKEN, v);
                    }
                }
            });
        }

        String stringToSign = sign(pmap, appSecret);
        String signature = Md5Util.md5(stringToSign, "utf-8").toUpperCase();
        queryString.add(SIGN, signature);
        Map<String, String> resultMap = new HashMap<>();
        resultMap.put(SignConfigConstant.SIGNATURE, signature);
        resultMap.put(SignConfigConstant.STRING_TO_SIGN, stringToSign);
        return (T) resultMap;
    }

    // 代碼一, 簽名排序代碼.
    // pmap 為所有參數, TreeMap 表示為樹形結構的哈希容器
    // appSecret 班牛分配給您的密鑰
    private String sign(TreeMap<String, String> pmap, String appSecret) {
        StringBuilder sb = new StringBuilder(appSecret);
        Iterator i$ = pmap.entrySet().iterator();
        while (i$.hasNext()) {
            Map.Entry<String, String> entry = (Map.Entry) i$.next();
            String name = entry.getKey();
            String value = entry.getValue();
            if (StringUtils.isNoneEmpty(new String[]{name, value})) {
                sb.append(name).append(value);
            }
        }
        sb.append(appSecret);

        return sb.toString();
    }
}

 

3.觸發器腳本開發

編寫事件回調數據處理腳本。例如

  1. package com.shuhuan.ipaas.applibs.dealPushEventContent.caoliao;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.google.common.collect.Lists;
    import com.shuhuan.ipaas.script.java.JavaScriptRunner;
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 推送事件  數據處理
     * 文檔地址: https://cli.im/help/65847
     */
    @Slf4j
    public class caoliaoDemo extends JavaScriptRunner {
    
        private static final String EVENT_TYPE = "eventType";
    
        private static final String BODY = "body";
    
        private static final String EVENT_CONTENTS = "eventContents";
    
        private static final String EVENT_CONTENT = "eventContent";
    
        private static final String ASSET = "asset";
    
        private static final String RESULT = "result";
    
    
        @Override
        public <T> T execute(Object params) {
            return (T) buildPushEventOutput(params);
        }
    
        /**
         * @param params
    
         *
         * {
         *     "asset": {
         *     },
         *  "body": {
         *     "time": "2022-06-30 17:06:39",
         *     "event": "FORM_DATA_SUBMIT",
         *     "data": {
         *         "ref_data": {
         *             "created_at": "2022-06-30 17:06:39",
         *             "serial_number": "L1000001",
         *             "form": {
         *                 "number": "D20",
         *                 "name": "會議簽到"
         *             },
         *             "fields": {
         *                 "姓名": "草料",
         *                 "手機": "18888648888",
         *                 "微信名": "CHEN",
         *                 "身份證號": "330200000000000000",
         *                 "工號": "FBI100",
         *                 "單選項": "是"
         *             }
         *         }
         *     }
         * }
         *
         *
         * @return
         * {
         *     "result": {
         *         "code": 200,
         *         "message": "success"
         *     },
         *     "eventContents": [
         *         {
         *             "eventType": "FORM_DATA_SUBMIT",
         *             "eventContent": {
         *                 "ref_data": {
         *                     "created_at": "2022-06-30 17:06:39",
         *                     "serial_number": "L1000001",
         *                     "form": {
         *                         "number": "D20",
         *                         "name": "會議簽到"
         *                     },
         *                     "fields": {
         *                         "姓名": "草料",
         *                         "手機": "18888648888",
         *                         "微信名": "CHEN",
         *                         "身份證號": "330200000000000000",
         *                         "工號": "FBI100",
         *                         "單選項": "是"
         *                     }
         *                 }
         *             }
         *         }
         *     ]
         * }
         */
        public static JSONObject buildPushEventOutput(Object params) {
            JSONObject output = new JSONObject();
            if (!(params instanceof Map)) {
                log.error("當前腳本入參類型錯誤!期望是Map,但是實際為{},具體值為{}", params.getClass().getName(), JSON.toJSONString(params));
                return output;
            }
            JSONObject input = (JSONObject) params;
    
            /**
             * 這里的事件內容的數據類型,有可能是數組,也可能是對象,具體按照推送方格式為準,作匹配的處理:
             * 1.解密(不是所有的消息都需要做)
             * 2.獲取事件的標識
             * 3.將事件標識轉換為觸發器的key
             * 4.構造接口返回,務必與推送方要求保持一致
             */
    
            List<JSONObject> eventContents = Lists.newArrayList();
            JSONObject data = (JSONObject) input.get(BODY);
            JSONObject item = new JSONObject();
            //2. 獲取對應事件的key。
            String event = (String) data.get("event");
            //3. 做觸發器的key與事件的key映射
            if ("FORM_DATA_SUBMIT".equals(event)) {
                item.put(EVENT_TYPE, "FORM_DATA_SUBMIT");
            } else if ("FORM_DATA_EDITED".equals(event)) {
                item.put(EVENT_TYPE, "FORM_DATA_EDITED");
            } else if ("FORM_DATA_REVIEW".equals(event)) {
                item.put(EVENT_TYPE, "FORM_DATA_REVIEW");
            }
            //4. 對應事件的輸出內容,與觸發器的輸出字段保持一致
            item.put(EVENT_CONTENT, JSON.parseObject(data.getString("data")));
            eventContents.add(item);
    
            output.put(EVENT_CONTENTS, eventContents);
    
    
            //推送事件后的響應結果,必須和推送方要求的返回結果一致
            Map<String, Object> result = new HashMap<>(16);
            result.put("code", 0);
            result.put("message", "success");
    
            output.put(RESULT, result);
            return output;
        }
    
    
    }
    

     

 

 

本篇目錄

{{item.innerText}}

{{item.categoryName}}
主站蜘蛛池模板: 成人精品亚洲人成在线 | 春色www视频在线观看 | 男人天堂导航 | 久久久久久久国产精品电影 | 日韩亚洲综合精品国产 | www.色综合.com | 成人av电影网站 | 亚洲国产成人精品区 | 福利三区 | 国产成人高清视频 | 五月花综合网 | 青草悠悠视频在线观看 | 污污视频网站 | 97在线精品| 精品小视频在线 | 国产精品久久久久久久久久久搜索 | 99久久99热精品免费观看国产 | 福利在线免费观看 | 欧美成人性视频在线黑白配 | 99国产视频 | 国产日韩精品一区在线不卡 | 五月婷婷激情视频 | 国产成人精品曰本亚洲 | 99精品视频在线成人精彩视频 | 黄色小视频网址 | 国产成人精品曰本亚洲 | 国产精品主播视频 | 潦草影视大全 | 99re在线这里只有精品 | 久久精品国产99久久无毒不卡 | 国产二区精品 | 啪啪.com| 成 人 黄 色 视频免费播放 | 欧美日韩系列 | www.激情.com| 久久有码中文字幕 | 久久伊人成人 | 99久久国产综合精品网成人影院 | 午夜毛片电影 | 激情免费网站 | 国产精品视频免费视频 |