【微服务】SpringBoot 对接飞书多维表格事件回调监听流程详解

目录

一、前言

二、前置准备

[2.1 创建一个应用](#2.1 创建一个应用)

[2.2 准备一张测试使用的多维表](#2.2 准备一张测试使用的多维表)

[2.3 获取对接文档](#2.3 获取对接文档)

[2.4 工程中添加SDK](#2.4 工程中添加SDK)

三、对接过程

[3.1 配置Encrypt Key 和 Verification Token](#3.1 配置Encrypt Key 和 Verification Token)

[3.2 配置订阅方式](#3.2 配置订阅方式)

[3.3 添加事件](#3.3 添加事件)

[3.4 申请权限](#3.4 申请权限)

[3.5 编写订阅代码](#3.5 编写订阅代码)

[3.6 订阅文档事件](#3.6 订阅文档事件)

[3.7 效果测试](#3.7 效果测试)

四、在springboot工程中集成

[4.1 导入基础以依赖](#4.1 导入基础以依赖)

[4.2 自定义一个配置类](#4.2 自定义一个配置类)

[4.3 启动服务和效果测试](#4.3 启动服务和效果测试)

五、写在文末


一、前言

在上一篇 【微服务】Java 对接飞书多维表格使用详解_飞书 java 多维表格-CSDN博客,分享了基于飞书开放平台对接多维表的过程,紧接着上一篇,本文将分享如何通过飞书提供的事件订阅机制,并集成到SpringBoot项目中对多维表数据的记录变更进行对接的详细流程。

二、前置准备

2.1 创建一个应用

参考上一篇创建应用的详细过程,后面在程序代码中调用API的前提都是基于创建的应用产生的信息。

2.2 准备一张测试使用的多维表

创建一张测试使用的多维表,将这个多维表的权限授权给上一步添加的应用,并提前为多维表添加几条数据

2.3 获取对接文档

通过飞书的开放平台找到事件与订阅部分的对接文档,文档链接:https://open.feishu.cn/document/server-docs/event-subscription-guide/overview

2.4 工程中添加SDK

如果在上一篇对接中添加了,可以忽略,以Java为例,在pom文件中添加如下依赖

复制代码
<dependency>
    <groupId>com.larksuite.oapi</groupId>
    <artifactId>oapi-sdk</artifactId>
    <version>2.3.6</version>
</dependency>

三、对接过程

接下来按照平台文档提供的操作步骤进行对接

3.1 配置Encrypt Key 和 Verification Token

这两个参数,官方文档说明是可选项,即可以不配,不配的话平台会默认生成两个参数,但如果你对数据传输安全性要求比较高的话,建议做一下配置(参数的位置,我的应用 ---> 事件与回调 ---> 加密策略)

3.2 配置订阅方式

这一步,表示后续在应用程序中通过哪种方式接收飞书平台的事件消息,平台提供了2种方式:

  • 将事件发送至开发者服务器

    • 这种方式需要开发者按照平台的要求,开发一个webhook接口,部署到IPV4类型服务器上,并在平台的控制台进行配置;
  • 使用长连接接收事件

    • 该方式是飞书 SDK 内提供的能力,你可以通过集成飞书 SDK 与开放平台建立一条 WebSocket 全双工通道(你的服务器需要能够访问公网)。后续当应用订阅的事件发生时,开放平台会通过该通道向你的服务器发送消息。

    • 这也是官方推荐的一种配置方式;

点击进入到我的应用控制台,在订阅方式这里选择 "长连接" 的方式

3.3 添加事件

这一步表示你需要对接哪些事件,是订阅多维表记录变更的事件?部门员工移除事件?还是一个审批通过的事件呢?即需要为当前应用关联需要处理的事件,这样飞书平台才能在后续将此类变更事件推送到应用程序。

添加事件入口如下,进入到我的应用之后,在事件与回调中,在上一步的基础上,点击右侧的添加事件,选择你要对接的事件进行添加,比如我这里选择的是多维表记录变更的事件。

3.4 申请权限

做完上面添加的监听事件之后,需要重新发布一下应用才能生效

选择版本管理,新增一个版本并点击发布,等待管理员审批通过即可

3.5 编写订阅代码

接下来,需要在代中编写监听程序,从而监听订阅的事件的数据变更,通过平台提供的示例代码直接拿来使用,简单修改下参数,然后运行起来即可,平台提供的参考代码链接:https://open.feishu.cn/document/server-docs/event-subscription-guide/event-subscription-configure-/request-url-configuration-case

完整的参考代码如下,代码中几个核心参数文档上面有描述,这里再单独说明一下:

  • appId

    • 上一篇中创建应用后产生的那个 appId ;
  • appSecret

    • 上一篇中创建应用后产生的那个 appSecret ;
  • Encrypt Key

    • 事件与回调控制台上面那个参数,为空就不填;
  • Verification Token

    • 事件与回调控制台上面那个参数,为空就不填;

    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 内的 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

    ", 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

    ", 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();
    }

    }

代码运行起来之后,通过控制台输出日志可以看到已经与平台建立了通信

3.6 订阅文档事件

为了能让你的代码与平台给你正常推送事件消息匹配,还需手动在这里调用一下订阅文档事件的接口,官方客服解释说,只有调用一次,平台才知道后续是针对哪个事件的文档?哪个事件的多维表给你推送事件消息。

API控制台操作文档链接:

https://open.feishu.cn/document/server-docs/docs/drive-v1/event/subscribeappId=cli_a79f0662f9bd500c

以本次测试使用的多维表为例进行说明,此处控制台中在调试时的几个参数至关重要,这里单独说明:

  • Authorization

    • 这里的token使用用户的token,不要使用tenant的那个token;
  • file_type

    • 这里取值为 bitable;
  • file_token

    • 即多维表格类型的那个token,在上一步中有提到;

    • 即这里的file_token取值为下图中的obj_token值,这个切记;

3.7 效果测试

上述都做完之后,然后回到多维表,删除下面这条数据

很快,在控制台上就能看到这个事件被捕获到了,相关的参数日志信息也输出出来了,后续程序中就可以基于这个输出的事件参数,做进一步的参数解析,从而进行后续的数据和逻辑处理了

四、在springboot工程中集成

细心的伙伴不难发现,官方提供的示例程序是一个main入口的演示代码,在真实的工程中集成时,这种方式肯定是不行的,下面来看怎么在springbooot工程中进行集成使用。

4.1 导入基础以依赖

依赖包含了飞书的SDK以及springboot运行所需的基础依赖

复制代码
<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 自定义一个配置类

该类模拟示例代码中的main程序,相当于是通过这个自定义的类启动一个异步任务,完整代码如下:

复制代码
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("监听飞书多维表程序启动...");
    }

    // onP2MessageReceiveV1 为接收消息 v2.0;onCustomizedEvent 内的 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
", 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
", new String(event.getBody(), StandardCharsets.UTF_8));
                }
            })
            .build();

}

4.3 启动服务和效果测试

将工程运行起来,通过控制台输出日志可以看到已经与飞书平台建立了通信连接

然后和上面操作类似,我们在测试的多维表中添加一条数据,通过控制台输出日志可以看到,程序已经捕捉到多维表的数据变化,后续只需要根据实际需要解析参数进行数据处理即可。

五、写在文末

本文通过案例和代码操作详细介绍了如何对接飞书多维表格事件回调监听流程,希望对看到的伙伴有用哦,本篇到此结束,感谢观看。

相关推荐
皮皮林55112 小时前
拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
java·spring boot
用户908324602733 天前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
用户8307196840824 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解4 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解4 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记4 天前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者5 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840825 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解5 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
初次攀爬者6 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq