產(chǎn)品介紹
什么是數(shù)環(huán)通
基礎(chǔ)概念講解
應(yīng)用場(chǎng)景
多渠道數(shù)據(jù)融合
業(yè)務(wù)、財(cái)務(wù)、辦公自動(dòng)化
產(chǎn)業(yè)鏈應(yīng)用與數(shù)據(jù)集成
工業(yè)應(yīng)用與設(shè)備互聯(lián)
智慧園區(qū)與未來(lái)社區(qū)
快速入門(mén)
創(chuàng)建LinkUp
應(yīng)用授權(quán)
判斷用法
監(jiān)控用法
分支用法
列表逐條處理
變量與表達(dá)式
流程管理
項(xiàng)目管理
流程創(chuàng)建
編輯器操作
單步測(cè)試與預(yù)覽
試運(yùn)行
發(fā)布與版本管理
錯(cuò)誤步驟重試
數(shù)據(jù)同步
JSON Path 使用
輸出處理
數(shù)據(jù)編排
1、功能使用手冊(cè)
2、腳本使用手冊(cè)
1 、簡(jiǎn)單查詢
2、謂詞查詢
3、函數(shù)與表達(dá)式
4、構(gòu)建結(jié)構(gòu)結(jié)果
5、查詢組合
6、排序、分組和聚合
7、處理模型
8、函數(shù)式編程
9、正則表達(dá)式
10、日期、時(shí)間處理
11、路徑運(yùn)算符
12、數(shù)字運(yùn)算符
13、比較運(yùn)算符
14、布爾運(yùn)算符
15、其他運(yùn)算符
16、字符串函數(shù)
17、數(shù)值函數(shù)
18、 數(shù)字聚合函數(shù)
19、布爾函數(shù)
20、數(shù)組函數(shù)
21、對(duì)象函數(shù)
22、日期/時(shí)間函數(shù)
23、高階函數(shù)
運(yùn)行日志
運(yùn)行記錄
開(kāi)發(fā)工具
連接器工具
連接器源碼配置
控件類(lèi)型配置
腳本配置說(shuō)明
內(nèi)置函數(shù)
應(yīng)用講解
內(nèi)置應(yīng)用
瀏覽器插件
數(shù)據(jù)表
文本字符串
日期
數(shù)據(jù)篩選
數(shù)據(jù)處理
延時(shí)處理
數(shù)學(xué)計(jì)算器
定時(shí)觸發(fā)器
子流程調(diào)用
手動(dòng)觸發(fā)器
物流地址解析
腳本執(zhí)行器
自定義變量
文件讀取
Webhook
SMTP發(fā)送郵件
文件傳輸
JSON工具
網(wǎng)絡(luò)工具
消息處理
PDF水印工具
文件存儲(chǔ)
API服務(wù)
Http請(qǐng)求
循環(huán)控制
EDI 自定義標(biāo)準(zhǔn)數(shù)據(jù)轉(zhuǎn)換
對(duì)象類(lèi)型判斷
瀏覽器操作
三方應(yīng)用
簡(jiǎn)道云
金山數(shù)據(jù)表
抖音
釘釘(自建應(yīng)用)
語(yǔ)雀
金山表單
微信公眾號(hào)
企業(yè)微信群機(jī)器人
聚水潭
企業(yè)微信三方授權(quán)
MySQL
SqlServer
ChatGpt
快手
金山輕維表
抖店
維格表
巨量千川
飛書(shū)多維表
釘釘機(jī)器人
飛書(shū)(自建)
釘釘
百度網(wǎng)盤(pán)
QQ郵箱
金山工作表
易知微DTable
MQTT
Doirs
中通快遞
韻達(dá)速遞
企業(yè)微信(代開(kāi)發(fā))
知乎效果營(yíng)銷(xiāo)平臺(tái)
飛書(shū)云文檔
騰訊企業(yè)郵箱
API管理
API管理概述
數(shù)據(jù)概覽
API服務(wù)
訪問(wèn)憑證
API門(mén)戶
API安全密鑰簽名
API監(jiān)控預(yù)警
擴(kuò)展工具
代理網(wǎng)關(guān)
消息處理
管理中心
企業(yè)管理
操作日志
成員管理
開(kāi)放平臺(tái)
開(kāi)放平臺(tái)簡(jiǎn)介
接入教程
常見(jiàn)問(wèn)題
數(shù)環(huán)通ip白名單
最佳實(shí)踐
彥祖文化 |通過(guò)數(shù)環(huán)通實(shí)現(xiàn)全渠道數(shù)據(jù)融合打通
新石器|通過(guò)數(shù)環(huán)通實(shí)現(xiàn)跨系統(tǒng)、跨部門(mén)高效協(xié)同
幫助首頁(yè)
開(kāi)發(fā)工具
連接器源碼配置
連接器源碼配置
# 1. 連接器定義 ## 1.1 授權(quán)定義 * auth:連接器調(diào)用對(duì)應(yīng) SaaS 軟件的授權(quán)方式,授權(quán)的定義是一個(gè)對(duì)象,當(dāng)沒(méi)有授權(quán)時(shí)可以為空 * authType 授權(quán)類(lèi)型,是第三方 SaaS 軟件驗(yàn)證數(shù)環(huán)通權(quán)限的方式,目前主要有以下幾種類(lèi)型 * api_token 通過(guò) AppKey + AppSecret 直接訪問(wèn)或者通過(guò) AppKey + AppSecret 換取 AccessToken 進(jìn)行調(diào)用第三方 SaaS 的 API 接口,典型的 SaaS 有:自建釘釘,維格表等 * oauth2 數(shù)環(huán)通作為第三方 SaaS 的平臺(tái)服務(wù)商申請(qǐng) AppKey+ AppSecret, 用戶通過(guò)授權(quán)數(shù)環(huán)通,由數(shù)環(huán)通獲取用戶的授權(quán) AccessToken 調(diào)用第三方 SaaS 的 API 接口,典型的 SaaS 有:企業(yè)微信三方,釘釘三方 * polling_oauth2 數(shù)環(huán)通作為第三方 SaaS 的平臺(tái)服務(wù)商申請(qǐng) AppKey+ AppSecret, 用戶通過(guò)授權(quán)數(shù)環(huán)通,由數(shù)環(huán)通獲取用戶的授權(quán) AccessToken 調(diào)用第三方 SaaS 的 API 接口,但是與 Oauth2 的區(qū)別在于,用戶的授權(quán)信息是通過(guò)后端服務(wù)接口進(jìn)行推送的,典型的 SaaS 有:聚水潭  * test 測(cè)試輸入賬號(hào)有效性的執(zhí)行方法,主要是在新增賬號(hào)時(shí)調(diào)用,用于驗(yàn)證用戶輸入的數(shù)據(jù)是否有效,具體執(zhí)行方法的定義參考執(zhí)行方法定義 * validate 驗(yàn)證當(dāng)前賬號(hào)的授權(quán)有效性的執(zhí)行方法,主要是在賬號(hào)新增賬號(hào)成功后調(diào)用,用于驗(yàn)證當(dāng)前授權(quán)信息如 AccessToken 等是否是有效狀態(tài),具體執(zhí)行方法的定義參考執(zhí)行方法定義 * apiTokenConfig api_token 類(lèi)型的配置 * autoRefresh 是否需要自動(dòng)刷新,Boolean 類(lèi)型 * true 需要刷新,需要配置 refreshAccessToken * false 不需要自動(dòng)刷新,AccessToken 是永久有效的 * autoRefreshInterval 自動(dòng)刷新的間隔,Integer 類(lèi)型 單位秒 例如 3600 表示每小時(shí)刷新一次 token * accessToken 獲取 AccessToken 的執(zhí)行方法 * refreshAccessToken 刷新 AccessToken 的執(zhí)行方法 * oauth2Config oauth2 和 polling_oauth2 的授權(quán)配置 * autoRefresh 是否需要自動(dòng)刷新,Boolean 類(lèi)型 * true 需要刷新,需要配置 refreshAccessToken * false 不需要自動(dòng)刷新,AccessToken 是永久有效的 * autoRefreshInterval 自動(dòng)刷新的間隔,Integer 類(lèi)型 單位秒 例如 3600 表示每小時(shí)刷新一次 token * preAuthorize 獲取授權(quán)鏈接前執(zhí)行方法列表,例如獲取預(yù)授權(quán)碼 * authorizeUrl 獲取授權(quán)鏈接的執(zhí)行方法 * accessToken 獲取 AccessToken 的執(zhí)行方法 * refreshAccessToken 刷新 AccessToken 的執(zhí)行方法 * thirdAuthConfig third_auth 類(lèi)型的配置 * autoRefresh 是否需要自動(dòng)刷新,Boolean 類(lèi)型 * true 需要刷新,需要配置 refreshAccessToken * false 不需要自動(dòng)刷新,AccessToken 是永久有效的 * autoRefreshInterval 自動(dòng)刷新的間隔,Integer 類(lèi)型 單位秒 例如 3600 表示每小時(shí)刷新一次 token * accessToken 獲取 AccessToken 的執(zhí)行方法 * refreshAccessToken 刷新 AccessToken 的執(zhí)行方法 * helpFields 顯示提示幫助的字段列表,如提示用戶如何進(jìn)行配置賬號(hào)和事件訂閱 * inputFields 用戶需要輸入的參數(shù)字段列表,例如 Appkey,AppSecret 等,具體的字段配置參考字段定義 * outputFields 保存到數(shù)據(jù)的參數(shù)列表,具體的字段配置參考字段定義 授權(quán)類(lèi)型的說(shuō)明: api_token 類(lèi)型的授權(quán)流程:  oauth2 授權(quán)流程:  polling_oauth2 類(lèi)型授權(quán)流程:  ## 1.2 賬號(hào)定義 * asset:連接器的賬號(hào)配置,主要是配置授權(quán)的哪些數(shù)據(jù)需要保存到賬號(hào)資產(chǎn)的數(shù)據(jù)庫(kù)中 * autoRefresh 是否需要自動(dòng)刷新,Boolean 類(lèi)型,需要與授權(quán)定義中保持一致 * true 需要刷新,需要配置 refreshAccessToken * false 不需要自動(dòng)刷新,AccessToken 是永久有效的 * autoRefreshInterval 自動(dòng)刷新的間隔,Integer 類(lèi)型 單位秒 例如 3600 表示每小時(shí)刷新一次 token * assetTemplate 保存的字段列表,用于定義哪些字段需要存進(jìn)賬號(hào)資產(chǎn)中 * assetNameField 賬號(hào)名稱(chēng)字段 * assetUkField 賬號(hào)唯一性標(biāo)識(shí)字段 ## 1.3 模板配置 * requestTemplate:連接器的請(qǐng)求模板配置,主要是配置當(dāng)前連接器發(fā)起 Http 請(qǐng)求時(shí)的公共參數(shù),如 appKey,簽名配置等公共的配置,可以減少請(qǐng)求的配置 * method 發(fā)起請(qǐng)求的方法,支持以下選項(xiàng) * GET * PUT * POST * PATCH * DELETE * HEAD * url 請(qǐng)求的完整地址 * body 請(qǐng)求 body 配置 * bodyType 請(qǐng)求體類(lèi)型 * NULL 為空 * STRING 字符串 * ARRAY 數(shù)組 * OBJECT JSON 對(duì)象類(lèi)型 * XML XML 格式 * bodyContent 請(qǐng)求體內(nèi)容,根據(jù) bodyType 傳入具體的值 * queryParams 查詢請(qǐng)求參數(shù),KV 形式 * formParams 表單請(qǐng)求參數(shù),KV 形式 * headers 頭部請(qǐng)求參數(shù) * signConfig 簽名配置 * signType 簽名類(lèi)型,簽名的實(shí)現(xiàn),目前可以使用簽名腳本類(lèi)型 * script 通過(guò)簽名腳本進(jìn)行簽名 * signOutField 簽名輸出字段 * signInField 簽名字段參數(shù),KV 形式 * signSetting 簽名配置,針對(duì)腳本簽名需要增加以下參數(shù) * connectorId 連接器 ID * scriptType 腳本類(lèi)型 * sceneCode 場(chǎng)景編碼 * version 腳本版本 * responseType 請(qǐng)求返回值類(lèi)型,默認(rèn)按照 STRING 處理 * BINARY 二進(jìn)制 * JSON JSON 格式 * STRING 純文本格式 * beforeRequest 請(qǐng)求前執(zhí)行方法列表,一般用于對(duì)請(qǐng)求參數(shù)進(jìn)行處理 * afterResponse 請(qǐng)求后執(zhí)行方法列表,一般用于對(duì)于返回?cái)?shù)據(jù)進(jìn)行處理 * triggerTemplate:消息通知和回調(diào)的配置。主要是配置當(dāng)前連接器接收平臺(tái) Http 請(qǐng)求時(shí)的參數(shù),可用來(lái)做觸發(fā)器配置 * pushUrl:消息推送回調(diào)地址。如:${eventDomainHost}/event/customPush/com.yuque.app/${assetId}/test * com.yuque.app 為連接器 ID,用戶務(wù)必配置為當(dāng)前連接器的 ID * test 為用戶自定義參數(shù) * pushExecutor:推送數(shù)據(jù)的腳本配置 * executeType:執(zhí)行類(lèi)型。設(shè)置為 script * connectorId:當(dāng)前連接器的 ID * connectorVersion:當(dāng)前連接器的版本 * sceneCode:場(chǎng)景碼。這里設(shè)置為 dealPushEventContent * type:腳本類(lèi)型。可選擇 java,js,pythone * version:腳本的版本號(hào)。可設(shè)置為 1~9 ## 1.4 觸發(fā)器 * triggers 觸發(fā)器列表,用于觸發(fā)器定義,觸發(fā)器列表是個(gè) KV 列表,其中 Key 是觸發(fā)器的關(guān)鍵字定義,Value 是一個(gè)觸發(fā)器定義 * key 用于唯一標(biāo)識(shí)觸發(fā)器 * value 觸發(fā)器的具體定義 觸發(fā)器對(duì)象的定義: * key 觸發(fā)器的 key 和前文的 key 保持一致 * paramClass 參數(shù)對(duì)象類(lèi)型,主要為了以后對(duì)參數(shù)映射進(jìn)行擴(kuò)展使用,當(dāng)前暫時(shí)可以不配置 * resultClass 結(jié)果對(duì)象類(lèi)型,主要為了以后對(duì)參數(shù)映射進(jìn)行擴(kuò)展使用,當(dāng)前暫時(shí)可以不配置 * resultIsList 結(jié)果是否是一個(gè)數(shù)組列表,此處主要針對(duì)的是一級(jí)結(jié)果,默認(rèn)為 false * true 表示結(jié)果是一個(gè)數(shù)組列表 * false 表示結(jié)果不是一個(gè)數(shù)組列表 * display 展示配置,用于前端頁(yè)面展示觸發(fā)器的名稱(chēng)等信息 m * label 觸發(fā)器展示的名稱(chēng) * description 觸發(fā)器的描述信息 * directions 鏈接信息,可以設(shè)置為該觸發(fā)器的來(lái)源頁(yè)面地址 * important 是否置頂,默認(rèn)為 false * true 表示需要置頂 * false 表示不需要置頂 * hidden 是否隱藏,當(dāng)設(shè)置為 true 時(shí)前端不展示該觸發(fā)器,默認(rèn)為 false * true 表示需要隱藏 * false 表示不需要隱藏 * triggerMode 觸發(fā)器的模式,主要是定義觸發(fā)器的數(shù)據(jù)來(lái)源,目前的選項(xiàng)有:輪詢和事件觸發(fā) * polling 通過(guò)輪詢方式查詢數(shù)據(jù),一般是通過(guò)時(shí)間來(lái)查詢某個(gè)列表 * pushing 事件或者消息來(lái)源,一般是第三方 SaaS 通過(guò)配置回調(diào)接口,進(jìn)行事件推送 * triggerConfig 觸發(fā)器配置,主要是針對(duì)輪詢方式的觸發(fā)器的配置 * cron 輪詢的時(shí)間表達(dá)式, * outOfFrequencyControl 配置為 true cron 表達(dá)式才生效,否則會(huì)根據(jù)用戶版本設(shè)置輪訓(xùn)周期 * startTime 開(kāi)始觸發(fā)的時(shí)間 * ukFields 唯一標(biāo)識(shí)記錄的字段列表,主要用于標(biāo)識(shí)該條記錄有沒(méi)有觸發(fā)過(guò) * supportPaging 是否支持分頁(yè),支持分頁(yè)時(shí)需要 * true 支持 * false 不支持 * pageSize 分頁(yè)大小設(shè)置 * pageSizeField 分頁(yè)大小對(duì)應(yīng)的字段名稱(chēng) * pageIndexField 分頁(yè)頁(yè)碼對(duì)應(yīng)的字段名稱(chēng) * operation 獲取觸發(fā)數(shù)據(jù)的執(zhí)行方法,對(duì)于輪詢的觸發(fā)器需要進(jìn)行定義,事件觸發(fā)的無(wú)需定義,要求執(zhí)行方法返回的數(shù)據(jù)是數(shù)組 * sample 獲取樣本數(shù)據(jù)的執(zhí)行方法,對(duì)于輪詢的觸發(fā)器需要進(jìn)行定義,事件觸發(fā)的無(wú)需定義,要求執(zhí)行方法返回的數(shù)據(jù)是單個(gè)對(duì)象 * beforeTrigger 觸發(fā)器執(zhí)行請(qǐng)求前執(zhí)行方法列表,一般用于對(duì)請(qǐng)求參數(shù)進(jìn)行處理,beforeTrigger 的執(zhí)行時(shí)機(jī)是在獲取到觸發(fā)事件的數(shù)據(jù)之后,進(jìn)行流程觸發(fā)之前,對(duì)于事件觸發(fā)的是在收到第三方的事件觸發(fā)之后,對(duì)于輪詢觸發(fā)的是在執(zhí)行輪詢 operation,獲取到單個(gè)對(duì)象之后 * afterTrigger 觸發(fā)器后執(zhí)行方法列表,一般用于對(duì)于返回?cái)?shù)據(jù)進(jìn)行處理,執(zhí)行時(shí)機(jī)是在發(fā)出觸發(fā)事件之后 ## 1.5 執(zhí)行器 * operations 執(zhí)行器列表,用于執(zhí)行器定義,執(zhí)行器列表是個(gè) KV 列表,其中 Key 是執(zhí)行器的關(guān)鍵字定義,Value 是一個(gè)執(zhí)行器定義 * key 用于唯一標(biāo)識(shí)執(zhí)行器 * value 執(zhí)行器的具體定義 執(zhí)行器對(duì)象的定義: * key 執(zhí)行器的 key 和前文的 key 保持一致 * paramClass 參數(shù)對(duì)象類(lèi)型,主要為了以后對(duì)參數(shù)映射進(jìn)行擴(kuò)展使用,當(dāng)前暫時(shí)可以不配置 * resultClass 結(jié)果對(duì)象類(lèi)型,主要為了以后對(duì)參數(shù)映射進(jìn)行擴(kuò)展使用,當(dāng)前暫時(shí)可以不配置 * resultIsList 結(jié)果是否是一個(gè)數(shù)組列表,此處主要針對(duì)的是一級(jí)結(jié)果,默認(rèn)為 false * true 表示結(jié)果是一個(gè)數(shù)組列表 * false 表示結(jié)果不是一個(gè)數(shù)組列表 * hidden 是否隱藏,當(dāng)設(shè)置為 true 時(shí)前端不展示該執(zhí)行器,默認(rèn)為 false * true 表示需要隱藏 * false 表示不需要隱藏 * display 展示配置,用于前端頁(yè)面展示執(zhí)行器的名稱(chēng)等信息 * label 執(zhí)行器展示的名稱(chēng) * description 執(zhí)行器的描述信息 * directions 鏈接信息,可以設(shè)置為該執(zhí)行器的來(lái)源頁(yè)面地址 * important 是否置頂,默認(rèn)為 false * true 表示需要置頂 * false 表示不需要置頂 * categoryName 分類(lèi)名,把同一類(lèi)的放在一個(gè)組下,如 訂單、商品、 * operation 執(zhí)行器的請(qǐng)求定義,在此定義執(zhí)行器方法(具體定義看 3.8 執(zhí)行方法定義) * inputFields 執(zhí)行器輸入字段定義 * outputFields 執(zhí)行器輸出字段定義 * tags 該執(zhí)行器的備注信息 ## 1.6 執(zhí)行方法定義 執(zhí)行方法是引擎支持的某個(gè)具體的執(zhí)行定義,當(dāng)前支持 4 種類(lèi)型,分別為: * request 請(qǐng)求類(lèi)型 * function 函數(shù)類(lèi)型 * dependency 依賴(lài)類(lèi)型 * script 腳本類(lèi)型 根據(jù)每個(gè)類(lèi)型有具體的定義: ### 1.6.1 請(qǐng)求類(lèi)型 請(qǐng)求類(lèi)型是指主體功能是調(diào)用 HTTP API * executeType: request 請(qǐng)求類(lèi)型 * method 發(fā)起請(qǐng)求的方法,支持以下選項(xiàng) * GET * PUT * POST * PATCH * DELETE * HEAD * url 請(qǐng)求的完整地址 * body 請(qǐng)求 body 配置 * bodyType 請(qǐng)求體類(lèi)型 * NULL 為空 * STRING 字符串 * ARRAY 數(shù)組 * OBJECT JSON 對(duì)象類(lèi)型 * XML XML 格式 * bodyContent 請(qǐng)求體內(nèi)容,根據(jù) bodyType 傳入具體的值 * queryParams 查詢請(qǐng)求參數(shù),KV 形式 * formParams 表單請(qǐng)求參數(shù),KV 形式 * headers 頭部請(qǐng)求參數(shù) (在此定義優(yōu)先級(jí)高于 requestTemplate 中的定義) * signConfig 簽名配置 * signType 簽名類(lèi)型,簽名的實(shí)現(xiàn),目前可以使用簽名腳本類(lèi)型 * script 通過(guò)簽名腳本進(jìn)行簽名 * signOutField 簽名輸出字段 * signInField 簽名字段參數(shù),KV 形式 * signSetting 簽名配置,針對(duì)腳本簽名需要增加以下參數(shù) * connectorId 腳本連接器 ID * scriptType 腳本類(lèi)型 * sceneCode 場(chǎng)景編碼 version 腳本版本 * beforeRequest 請(qǐng)求前執(zhí)行方法列表,一般用于對(duì)請(qǐng)求參數(shù)進(jìn)行處理 * afterResponse 請(qǐng)求后執(zhí)行方法列表,一般用于對(duì)于返回?cái)?shù)據(jù)進(jìn)行處理 ### 1.6.2 函數(shù)類(lèi)型 函數(shù)類(lèi)型是指調(diào)用一個(gè)內(nèi)置類(lèi)的函數(shù),或者內(nèi)置表達(dá)式 * executeType function 函數(shù)類(lèi)型 * isExpress 是否是表達(dá)式 * true 是 執(zhí)行的是內(nèi)置表達(dá)式 * false 否 執(zhí)行的是類(lèi)方法 * providerClass 執(zhí)行類(lèi)的全路徑,isExpress 為 false 時(shí)必填 示例: ? "providerClass":"com.shuhuan.ipaas.connector.spi.yunpian.InputAndOutputBuilder" * function 執(zhí)行的具體方法,對(duì)于表達(dá)式來(lái)說(shuō)是具體的表達(dá)式,對(duì)于執(zhí)行類(lèi)方法時(shí)是類(lèi)的方法,對(duì)于是表達(dá)式時(shí)是具體的表達(dá)式 示例: ? "function":"generateTemplateContentInput" ? "function":"${assert:equals(0,object:eval(body, '/msg'))}" * paramsExpression 參數(shù)表達(dá)式,對(duì)于執(zhí)行類(lèi)方法時(shí)傳入 * returnType 返回值類(lèi)型 * VOID 無(wú)返回值 * STRING 字符串 * BOOLEAN 布爾值 * NUM 數(shù)字 * INT 整形數(shù)字 * ARRAY 數(shù)組或者列表 * OBJECT 對(duì)象或者 Map 類(lèi)型 * returnItemType 返回列表的數(shù)據(jù)類(lèi)型,returnType 是 ARRAY 時(shí)需要 * VOID 無(wú)返回值 * STRING 字符串 * BOOLEAN 布爾值 * NUM 數(shù)字 * INT 整形數(shù)字 * ARRAY 數(shù)組或者列表 * OBJECT 對(duì)象或者 Map 類(lèi)型 ### 1.6.3 依賴(lài)類(lèi)型 依賴(lài)類(lèi)型是指可以調(diào)用一組已經(jīng)配置的執(zhí)行動(dòng)作,并做一些數(shù)據(jù)處理 * executeType dependency 依賴(lài)類(lèi)型 * dependencyOperationKeys 依賴(lài)的執(zhí)行動(dòng)作的 Key 列表 示例: ? "dependencyOperationKeys": ["getUidByMobile", "getUserDetailByUserId"] * afterResponse 所有依賴(lài)的執(zhí)行動(dòng)作執(zhí)行完成后執(zhí)行方法列表,一般用于對(duì)于返回?cái)?shù)據(jù)進(jìn)行處理 ### 1.6.4 腳本類(lèi)型 腳本類(lèi)型是指執(zhí)行一個(gè)腳本 * executeType script 腳本類(lèi)型 * connectorId 腳本對(duì)應(yīng)的連接器 ID * sceneCode 腳本場(chǎng)景碼,用來(lái)標(biāo)識(shí)該腳本應(yīng)用場(chǎng)景 * type 腳本類(lèi)型 * java * js * python * version 腳本版本 * paramsExpression 執(zhí)行的參數(shù)表達(dá)式,表達(dá)式為空時(shí)將會(huì)將整個(gè)參數(shù)上下文傳入,不為空時(shí)計(jì)算完成表達(dá)式后傳入 * returnType 返回值類(lèi)型 * VOID 無(wú)返回值 * STRING 字符串 * BOOLEAN 布爾值 * NUM 數(shù)字 * INT 整形數(shù)字 * ARRAY 數(shù)組或者列表 * OBJECT 對(duì)象或者 Map 類(lèi)型 * returnItemType 返回列表的數(shù)據(jù)類(lèi)型,returnType 是 ARRAY 時(shí)需要 * VOID 無(wú)返回值 * STRING 字符串 * BOOLEAN 布爾值 * NUM 數(shù)字 * INT 整形數(shù)字 * ARRAY 數(shù)組或者列表 * OBJECT 對(duì)象或者 Map 類(lèi)型 ## 1.7 字段定義 * key 用于該執(zhí)行方法中唯一標(biāo)識(shí)字段 * label 展示配置,用于前端頁(yè)面展示字段名稱(chēng) * helpText 幫助信息,作為輸入字段時(shí)需要,非必要不填寫(xiě) * placeholder 輸入框提示信息,作為輸入字段時(shí)需要 * type 字段類(lèi)型 * widget 前端控件 [widgetConfig 配置說(shuō)明文檔](http://www.dczqhc.cn/help/article/1970) * widgetConfig 前端組件的配置 KV 形式 * required 是否為必填選項(xiàng),作為輸入字段時(shí)需要 * true 必填 * false 選填 * defaultValue 默認(rèn)值 * supportMultiple 是否支持多選,默認(rèn) false(搭配選擇控件時(shí)使用) * true 支持 * false 不支持 * datasource 可選數(shù)據(jù)源,KV 形式 * label 展示鍵 * value 實(shí)際值 * dynamicDataSource 動(dòng)態(tài)數(shù)據(jù)源 [動(dòng)態(tài)數(shù)據(jù)路由](http://www.dczqhc.cn/help/article/1970) * routerType 動(dòng)態(tài)類(lèi)型 * beforeRequest 在請(qǐng)求之前 * afterRequest 在請(qǐng)求響應(yīng)之后 * constant 常量 * condition 判斷是否符合路由條件 * params 執(zhí)行動(dòng)態(tài)數(shù)據(jù)源的參數(shù)列表 * selectCondition 判斷是否可選的條件表達(dá)式 * deepCondition 判斷是否可下拉的條件表達(dá)式 * refOperation 獲取動(dòng)態(tài)數(shù)據(jù)源的執(zhí)行動(dòng)作 * refLabel 動(dòng)態(tài) label 的取值方式 * refValue 動(dòng)態(tài) value 的取值方式 * router 下級(jí)的路由規(guī)則 * datasource 靜態(tài)數(shù)據(jù)源,routerType 為 constant 時(shí)設(shè)置 * dynamicFields 動(dòng)態(tài)字段 [dynamicFields](http://www.dczqhc.cn/help/article/1970) * routerType 動(dòng)態(tài)類(lèi)型 * beforeRequest 在請(qǐng)求之前 * afterRequest 在請(qǐng)求響應(yīng)之后 * constant 常量 * condition 判斷是否符合路由條件 * params 參數(shù)列表 * refOperation 獲取動(dòng)態(tài)字段的執(zhí)行動(dòng)作 * refInputFields 動(dòng)態(tài)輸入字段的取值表達(dá)式 * refOutputFields 動(dòng)態(tài)輸出字段的取值表達(dá)式 * inputFields 對(duì)于 routerType 是 constant 時(shí)設(shè)置 * outputFields 對(duì)于 routerType 是 constant 時(shí)設(shè)置 * childrenType 子節(jié)點(diǎn)類(lèi)型 * children 子節(jié)點(diǎn) # 2.簽名腳本開(kāi)發(fā) 詳細(xì)參考:http://www.dczqhc.cn/doc/131/ 在應(yīng)用 shuhuan-ipaas-app-libs 的 signer 目錄下開(kāi)發(fā)簽名類(lèi),簽名算法改成通過(guò) java 執(zhí)行腳本的方案實(shí)現(xiàn)簽名算法,簽名類(lèi)需要繼承 JavaScriptRunner 類(lèi)重寫(xiě) execute 方法 ``` /** * @author yunmu * @date 2022-03-04 6:44 下午 */ public abstract class JavaScriptRunner { public abstract <T> T execute(Object params); } ``` params 是一個(gè) Map 對(duì)象,Map 中會(huì)包含以下數(shù)據(jù): * 上下文參數(shù)數(shù)據(jù) * signRequest 待簽名的 http 請(qǐng)求獲取方式: ``` 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 為所有參數(shù), TreeMap 表示為樹(shù)形結(jié)構(gòu)的哈希容器 // 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.觸發(fā)器腳本開(kāi)發(fā) 詳細(xì)參考:http://www.dczqhc.cn/doc/131/ 編寫(xiě)事件回調(diào)數(shù)據(jù)處理腳本。例如 1. ```java 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; /** * 推送事件 數(shù)據(jù)處理 * 文檔地址: 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": "會(huì)議簽到" * }, * "fields": { * "姓名": "草料", * "手機(jī)": "18888648888", * "微信名": "CHEN", * "身份證號(hào)": "330200000000000000", * "工號(hào)": "FBI100", * "單選項(xiàng)": "是" * } * } * } * } * * * @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": "會(huì)議簽到" * }, * "fields": { * "姓名": "草料", * "手機(jī)": "18888648888", * "微信名": "CHEN", * "身份證號(hào)": "330200000000000000", * "工號(hào)": "FBI100", * "單選項(xiàng)": "是" * } * } * } * } * ] * } */ public static JSONObject buildPushEventOutput(Object params) { JSONObject output = new JSONObject(); if (!(params instanceof Map)) { log.error("當(dāng)前腳本入?yún)㈩?lèi)型錯(cuò)誤!期望是 Map,但是實(shí)際為{},具體值為{}", params.getClass().getName(), JSON.toJSONString(params)); return output; } JSONObject input = (JSONObject) params; /** * 這里的事件內(nèi)容的數(shù)據(jù)類(lèi)型,有可能是數(shù)組,也可能是對(duì)象,具體按照推送方格式為準(zhǔn),作匹配的處理: * 1.解密(不是所有的消息都需要做) * 2.獲取事件的標(biāo)識(shí) * 3.將事件標(biāo)識(shí)轉(zhuǎn)換為觸發(fā)器的 key * 4.構(gòu)造接口返回,務(wù)必與推送方要求保持一致 */ List<JSONObject> eventContents = Lists.newArrayList(); JSONObject data = (JSONObject) input.get(BODY); JSONObject item = new JSONObject(); //2. 獲取對(duì)應(yīng)事件的 key。 String event = (String) data.get("event"); //3. 做觸發(fā)器的 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. 對(duì)應(yīng)事件的輸出內(nèi)容,與觸發(fā)器的輸出字段保持一致 item.put(EVENT_CONTENT, JSON.parseObject(data.getString("data"))); eventContents.add(item); output.put(EVENT_CONTENTS, eventContents); //推送事件后的響應(yīng)結(jié)果,必須和推送方要求的返回結(jié)果一致 Map<String, Object> result = new HashMap<>(16); result.put("code", 0); result.put("message", "success"); output.put(RESULT, result); return output; } } ```
上一篇
連接器工具
下一篇
控件類(lèi)型配置
手機(jī)掃碼
復(fù)制鏈接
手機(jī)掃一掃轉(zhuǎn)發(fā)分享
復(fù)制鏈接
Markdown文件
分享
鏈接
類(lèi)型
密碼
更新密碼
主站蜘蛛池模板:
日韩一区二区三区在线观看
|
天天操天天拍
|
精品无码久久久久国产
|
日韩成人
|
欧美精品v国产精品v日韩精品
|
亚洲精品国产综合
|
播放欧美一级片
|
成人免费在线视频
|
激情久久久
|
中文字幕精品一区二区精品绿巨人
|
国产欧美高清在线观看
|
黄色大片免费网址
|
亚洲日本国产
|
国产精品免费一区二区三区四区
|
亚洲国产精品99久久久久久久久
|
精品国偷自产国产一区
|
在线观看黄色
|
久久中文字幕一区
|
国产精品久久久久久亚洲调教
|
成人高清在线
|
日韩和欧美的一区二区
|
欧美日韩免费在线
|
欧美精品99
|
日韩中文字幕在线免费观看
|
欧美成人激情视频
|
日日色视频
|
成人免费看片
|
亚洲在线日韩
|
超色视频在线观看
|
日本视频二区
|
日韩精品影院
|
久久精品无码一区二区日韩av
|
免费成人av网址
|
天天舔日日干
|
亚洲电影天堂在线观看
|
午夜寂寞少妇aaa片毛片
|
久久精品电影
|
亚洲精品一区二区在线
|
欧美日韩成人在线
|
av免费在线观看网站
|
毛片网站免费在线观看
|