SpringBoot?對(duì)接飛書多維表格事件回調(diào)監(jiān)聽流程分析
一、前言
在上一篇 【微服務(wù)】Java 對(duì)接飛書多維表格使用詳解,分享了基于飛書開放平臺(tái)對(duì)接多維表的過程,緊接著上一篇,本文將分享如何通過飛書提供的事件訂閱機(jī)制,并集成到SpringBoot項(xiàng)目中對(duì)多維表數(shù)據(jù)的記錄變更進(jìn)行對(duì)接的詳細(xì)流程。
二、前置準(zhǔn)備
2.1 創(chuàng)建一個(gè)應(yīng)用
參考上一篇?jiǎng)?chuàng)建應(yīng)用的詳細(xì)過程,后面在程序代碼中調(diào)用API的前提都是基于創(chuàng)建的應(yīng)用產(chǎn)生的信息。
2.2 準(zhǔn)備一張測(cè)試使用的多維表
創(chuàng)建一張測(cè)試使用的多維表,將這個(gè)多維表的權(quán)限授權(quán)給上一步添加的應(yīng)用,并提前為多維表添加幾條數(shù)據(jù)

2.3 獲取對(duì)接文檔
通過飛書的開放平臺(tái)找到事件與訂閱部分的對(duì)接文檔,文檔鏈接:https://open.feishu.cn/document/server-docs/event-subscription-guide/overview

2.4 工程中添加SDK
如果在上一篇對(duì)接中添加了,可以忽略,以Java為例,在pom文件中添加如下依賴
<dependency>
<groupId>com.larksuite.oapi</groupId>
<artifactId>oapi-sdk</artifactId>
<version>2.3.6</version>
</dependency>三、對(duì)接過程
接下來按照平臺(tái)文檔提供的操作步驟進(jìn)行對(duì)接

3.1 配置Encrypt Key 和 Verification Token
這兩個(gè)參數(shù),官方文檔說明是可選項(xiàng),即可以不配,不配的話平臺(tái)會(huì)默認(rèn)生成兩個(gè)參數(shù),但如果你對(duì)數(shù)據(jù)傳輸安全性要求比較高的話,建議做一下配置(參數(shù)的位置,我的應(yīng)用 —> 事件與回調(diào) —> 加密策略)

3.2 配置訂閱方式
這一步,表示后續(xù)在應(yīng)用程序中通過哪種方式接收飛書平臺(tái)的事件消息,平臺(tái)提供了2種方式:
- 將事件發(fā)送至開發(fā)者服務(wù)器
- 這種方式需要開發(fā)者按照平臺(tái)的要求,開發(fā)一個(gè)webhook接口,部署到IPV4類型服務(wù)器上,并在平臺(tái)的控制臺(tái)進(jìn)行配置;
- 使用長(zhǎng)連接接收事件
- 該方式是飛書 SDK 內(nèi)提供的能力,你可以通過集成飛書 SDK 與開放平臺(tái)建立一條 WebSocket 全雙工通道(你的服務(wù)器需要能夠訪問公網(wǎng))。后續(xù)當(dāng)應(yīng)用訂閱的事件發(fā)生時(shí),開放平臺(tái)會(huì)通過該通道向你的服務(wù)器發(fā)送消息。
- 這也是官方推薦的一種配置方式;

點(diǎn)擊進(jìn)入到我的應(yīng)用控制臺(tái),在訂閱方式這里選擇 ”長(zhǎng)連接” 的方式

3.3 添加事件
這一步表示你需要對(duì)接哪些事件,是訂閱多維表記錄變更的事件?部門員工移除事件?還是一個(gè)審批通過的事件呢?即需要為當(dāng)前應(yīng)用關(guān)聯(lián)需要處理的事件,這樣飛書平臺(tái)才能在后續(xù)將此類變更事件推送到應(yīng)用程序。

添加事件入口如下,進(jìn)入到我的應(yīng)用之后,在事件與回調(diào)中,在上一步的基礎(chǔ)上,點(diǎn)擊右側(cè)的添加事件,選擇你要對(duì)接的事件進(jìn)行添加,比如我這里選擇的是多維表記錄變更的事件。

3.4 申請(qǐng)權(quán)限
做完上面添加的監(jiān)聽事件之后,需要重新發(fā)布一下應(yīng)用才能生效

選擇版本管理,新增一個(gè)版本并點(diǎn)擊發(fā)布,等待管理員審批通過即可

3.5 編寫訂閱代碼
接下來,需要在代中編寫監(jiān)聽程序,從而監(jiān)聽訂閱的事件的數(shù)據(jù)變更,通過平臺(tái)提供的示例代碼直接拿來使用,簡(jiǎn)單修改下參數(shù),然后運(yùn)行起來即可,平臺(tái)提供的參考代碼鏈接:https://open.feishu.cn/document/server-docs/event-subscription-guide/event-subscription-configure-/request-url-configuration-case

完整的參考代碼如下,代碼中幾個(gè)核心參數(shù)文檔上面有描述,這里再單獨(dú)說明一下:
- appId
- 上一篇中創(chuàng)建應(yīng)用后產(chǎn)生的那個(gè) appId ;
- appSecret
- 上一篇中創(chuàng)建應(yīng)用后產(chǎn)生的那個(gè) appSecret ;
- Encrypt Key
- 事件與回調(diào)控制臺(tái)上面那個(gè)參數(shù),為空就不填;
- Verification Token
- 事件與回調(diào)控制臺(tái)上面那個(gè)參數(shù),為空就不填;
package com.congge.web;
import com.lark.oapi.core.request.EventReq;
import com.lark.oapi.core.utils.Jsons;
import com.lark.oapi.event.CustomEventHandler;
import com.lark.oapi.event.EventDispatcher;
import com.lark.oapi.service.im.ImService;
import com.lark.oapi.service.im.v1.model.P2MessageReceiveV1;
import com.lark.oapi.ws.Client;
import java.nio.charset.StandardCharsets;
public class Sample {
// onP2MessageReceiveV1 為接收消息 v2.0;onCustomizedEvent 內(nèi)的 message 為接收消息 v1.0。
private static final EventDispatcher EVENT_HANDLER = EventDispatcher.newBuilder("7ZCxxfFBXsCJUa2j0MpfcTYiLkfJXAGG", "")
.onP2MessageReceiveV1(new ImService.P2MessageReceiveV1Handler() {
@Override
public void handle(P2MessageReceiveV1 event) throws Exception {
System.out.printf("[ onP2MessageReceiveV1 access ], data: %s\n", Jsons.DEFAULT.toJson(event.getEvent()));
}
})
.onCustomizedEvent("drive.file.bitable_record_changed_v1", new CustomEventHandler() {
@Override
public void handle(EventReq event) throws Exception {
System.out.printf("[ onCustomizedEvent access ], type: message, data: %s\n", new String(event.getBody(), StandardCharsets.UTF_8));
}
})
.build();
public static void main(String[] args) {
String appId = "你的appId ";
String appSecret = "你的appSecret ";
Client cli = new Client.Builder(appId, appSecret)
.eventHandler(EVENT_HANDLER)
.build();
cli.start();
}
}代碼運(yùn)行起來之后,通過控制臺(tái)輸出日志可以看到已經(jīng)與平臺(tái)建立了通信

3.6 訂閱文檔事件
為了能讓你的代碼與平臺(tái)給你正常推送事件消息匹配,還需手動(dòng)在這里調(diào)用一下訂閱文檔事件的接口,官方客服解釋說,只有調(diào)用一次,平臺(tái)才知道后續(xù)是針對(duì)哪個(gè)事件的文檔?哪個(gè)事件的多維表給你推送事件消息。
API控制臺(tái)操作文檔鏈接:
https://open.feishu.cn/document/server-docs/docs/drive-v1/event/subscribe?appId=cli_a79f0662f9bd500c

以本次測(cè)試使用的多維表為例進(jìn)行說明,此處控制臺(tái)中在調(diào)試時(shí)的幾個(gè)參數(shù)至關(guān)重要,這里單獨(dú)說明:
- Authorization
- 這里的token使用用戶的token,不要使用tenant的那個(gè)token;
- file_type
- 這里取值為 bitable;
- file_token
- 即多維表格類型的那個(gè)token,在上一步中有提到;
- 即這里的file_token取值為下圖中的obj_token值,這個(gè)切記;

3.7 效果測(cè)試
上述都做完之后,然后回到多維表,刪除下面這條數(shù)據(jù)

很快,在控制臺(tái)上就能看到這個(gè)事件被捕獲到了,相關(guān)的參數(shù)日志信息也輸出出來了,后續(xù)程序中就可以基于這個(gè)輸出的事件參數(shù),做進(jìn)一步的參數(shù)解析,從而進(jìn)行后續(xù)的數(shù)據(jù)和邏輯處理了

四、在springboot工程中集成
細(xì)心的伙伴不難發(fā)現(xiàn),官方提供的示例程序是一個(gè)main入口的演示代碼,在真實(shí)的工程中集成時(shí),這種方式肯定是不行的,下面來看怎么在springbooot工程中進(jìn)行集成使用。
4.1 導(dǎo)入基礎(chǔ)以依賴
依賴包含了飛書的SDK以及springboot運(yùn)行所需的基礎(chǔ)依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.35</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<dependency>
<groupId>com.larksuite.oapi</groupId>
<artifactId>oapi-sdk</artifactId>
<version>2.3.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>4.2 自定義一個(gè)配置類
該類模擬示例代碼中的main程序,相當(dāng)于是通過這個(gè)自定義的類啟動(dòng)一個(gè)異步任務(wù),完整代碼如下:
package com.congge.config;
import com.lark.oapi.core.request.EventReq;
import com.lark.oapi.core.utils.Jsons;
import com.lark.oapi.event.CustomEventHandler;
import com.lark.oapi.event.EventDispatcher;
import com.lark.oapi.service.im.ImService;
import com.lark.oapi.service.im.v1.model.P2MessageReceiveV1;
import com.lark.oapi.ws.Client;
import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
@Component
public class SampleListenerTask {
@PostConstruct
public void start(){
String appId = "你的appId ";
String appSecret = "你的appSecret ";
Client cli = new Client.Builder(appId, appSecret)
.eventHandler(EVENT_HANDLER)
.build();
cli.start();
System.out.println("監(jiān)聽飛書多維表程序啟動(dòng)...");
}
// onP2MessageReceiveV1 為接收消息 v2.0;onCustomizedEvent 內(nèi)的 message 為接收消息 v1.0。
private static final EventDispatcher EVENT_HANDLER = EventDispatcher.newBuilder("7ZCxxfFBXsCJUa2j0MpfcTYiLkfJXAGG", "")
.onP2MessageReceiveV1(new ImService.P2MessageReceiveV1Handler() {
@Override
public void handle(P2MessageReceiveV1 event) throws Exception {
System.out.printf("[ onP2MessageReceiveV1 access ], data: %s\n", Jsons.DEFAULT.toJson(event.getEvent()));
}
})
.onCustomizedEvent("drive.file.bitable_record_changed_v1", new CustomEventHandler() {
@Override
public void handle(EventReq event) throws Exception {
System.out.printf("[ onCustomizedEvent access ], type: message, data: %s\n", new String(event.getBody(), StandardCharsets.UTF_8));
}
})
.build();
}4.3 啟動(dòng)服務(wù)和效果測(cè)試
將工程運(yùn)行起來,通過控制臺(tái)輸出日志可以看到已經(jīng)與飛書平臺(tái)建立了通信連接

然后和上面操作類似,我們?cè)跍y(cè)試的多維表中添加一條數(shù)據(jù),通過控制臺(tái)輸出日志可以看到,程序已經(jīng)捕捉到多維表的數(shù)據(jù)變化,后續(xù)只需要根據(jù)實(shí)際需要解析參數(shù)進(jìn)行數(shù)據(jù)處理即可。

五、寫在文末
本文通過案例和代碼操作詳細(xì)介紹了如何對(duì)接飛書多維表格事件回調(diào)監(jiān)聽流程,希望對(duì)看到的伙伴有用哦,本篇到此結(jié)束,感謝觀看。
到此這篇關(guān)于SpringBoot 對(duì)接飛書多維表格事件回調(diào)監(jiān)聽流程分析的文章就介紹到這了,更多相關(guān)SpringBoot 事件回調(diào)監(jiān)聽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot監(jiān)聽?wèi)?yīng)用程序啟動(dòng)的生命周期事件的四種方法
- SpringBoot使用Redis單機(jī)版過期鍵監(jiān)聽事件的實(shí)現(xiàn)示例
- springboot創(chuàng)建監(jiān)聽和處理事件的操作方法
- Java?Springboot異步執(zhí)行事件監(jiān)聽和處理實(shí)例
- SpringBoot中的ApplicationListener事件監(jiān)聽器使用詳解
- SpringBoot如何監(jiān)聽redis?Key變化事件案例詳解
- 詳解SpringBoot實(shí)現(xiàn)事件同步與異步監(jiān)聽
相關(guān)文章
Springboot Thymeleaf數(shù)字對(duì)象使用方法
這篇文章主要介紹了Springboot Thymeleaf數(shù)字對(duì)象使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2007-09-09
SpringBoot操作mongo實(shí)現(xiàn)方法解析
這篇文章主要介紹了SpringBoot操作mongo實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
mybatis resultmap 如何為對(duì)象賦值的調(diào)用順序
這篇文章主要介紹了mybatis resultmap 如何為對(duì)象賦值的調(diào)用順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
關(guān)于socket發(fā)送數(shù)據(jù)需要注意的問題
這篇文章主要介紹了關(guān)于socket發(fā)送數(shù)據(jù)需要注意的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
IDEA無法創(chuàng)建JDK1.8版本的Springboot項(xiàng)目問題解決(2種方法)
本文主要介紹了IDEA無法創(chuàng)建JDK1.8版本的Springboot項(xiàng)目問題解決,包含兩種解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
Java實(shí)體類不要使用基本類型的知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是關(guān)于Java包裝類之實(shí)體類不要使用基本類型的知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-02-02

