Connect in Apex:ConnectApi 命名空间完全指南

Connect in Apex(ConnectApi命名空间)完整指南:架构(静态方法类+输入输出类/用户上下文/本地化结构化数据)、限制(写=DML/API计入/RateLimitException/API版本)、核心类(ChatterFeeds/ChatterUsers/ChatterGroups/ChatterMessages/Topics/Communities/Commerce/ManagedContent/ConnectApiHelper)、完整示例(获取Feed多态重载/文本+@mention+话题发布/新文件二进制附件/Action Link按钮集成+HTTP POST+OAuth头部/评论+@mention/点赞/书签/私信/关注记录/批量Feed触发器/B2B Commerce购物车创建/Repository文件管理)、JSON序列化与Connect REST API一致、测试覆盖率要求。...

📅 2026/7/16 ✍️ ponybai 🏷️ apex, salesforce

Connect in Apex

Connect in Apex

Connect in Apex 提供对 B2B Commerce、CMS 管理内容、Experience Cloud 站点、Topics 等的编程访问。Connect REST API 的许多资源操作暴露为 ConnectApi 命名空间中类的静态方法——相比通过 SOQL 查询和 sObject 对象访问,ConnectApi 类更简单:数据已本地化并结构化用于显示(例如一次调用即可获取和组装 Feed)。所有 Connect in Apex 方法在调用用户上下文中执行——不运行在系统模式。

限制:每个 ConnectApi 写操作消耗 1 个 DML 语句;大多数方法调用计入 24 小时 API 请求限制(ConnectApi 方法注释指明是否需要 Chatter)。需要 Chatter 的方法受每小时每用户每命名空间的速率限制——超出时抛出 ConnectApi.RateLimitException,代码必须捕获处理。ConnectApi 仅在文档指定的 API 版本中受支持——如在 API 33.0 引入的方法在更早版本中不可用。

ConnectApi 核心概念

核心概念

ConnectApi 命名空间结构:静态方法类(如 ConnectApi.ChatterFeeds)访问 Connect REST API 数据;输入类(如 ConnectApi.FeedItemInput)作为参数;输出类(如 ConnectApi.FeedItemConnectApi.FeedElementPage)是静态方法调用的返回值。输出对象 JSON 序列化类似 Connect REST API;输入对象 JSON 反序列化格式也与 API 一致。

主要功能类:ChatterFeeds(Feed 元素/评论/点赞/书签)、ChatterUsers(用户信息和照片)、ChatterGroups(组和成员)、ChatterMessages(私信)、Topics/ManagedTopics(话题管理)、Communities(Experience Cloud 站点)、Commerce(B2B Commerce 购物车)、ManagedContent(CMS 内容交付)、ConnectApiHelper(辅助工具类——简化富文本发布)。

ConnectApi 完整任务示例

任务示例

获取 Feed 元素(多态重载):

// 当前用户的新闻 Feed
ConnectApi.FeedElementPage fep = ConnectApi.ChatterFeeds.getFeedElementsFromFeed(
    Network.getNetworkId(), ConnectApi.FeedType.News, 'me');

// 其他用户的资料 Feed
ConnectApi.FeedElementPage fep = ConnectApi.ChatterFeeds.getFeedElementsFromFeed(
    Network.getNetworkId(), ConnectApi.FeedType.UserProfile, '005R0000000HwMA');

// 使用 FeedType.Record 获取组 Feed(组是记录类型)
ConnectApi.FeedElementPage page = ConnectApi.ChatterFeeds.getFeedElementsFromFeed(
    null, ConnectApi.FeedType.News, 'subjectId', 25,
    ConnectApi.FeedSortMode.LastModifiedDate, ConnectApi.FeedDensity.AllUpdates, null);

发布 Feed 元素(文本+@mention+话题):

ConnectApi.FeedItemInput input = new ConnectApi.FeedItemInput();
input.body = new ConnectApi.MessageBodyInput();
input.body.messageSegments = new List<ConnectApi.MessageSegmentInput>();
// 文本段
ConnectApi.TextSegmentInput text = new ConnectApi.TextSegmentInput();
text.text = 'Check out this update ';
input.body.messageSegments.add(text);
// @mention 段
ConnectApi.MentionSegmentInput mention = new ConnectApi.MentionSegmentInput();
mention.id = '005xx0000000000';
input.body.messageSegments.add(mention);
// 话题段
ConnectApi.HashtagSegmentInput hash = new ConnectApi.HashtagSegmentInput();
hash.tag = 'Salesforce';
input.body.messageSegments.add(hash);
input.subjectId = 'me';
ConnectApi.FeedItem result = ConnectApi.ChatterFeeds.postFeedItem(null, input);

发布带新文件附件的 Feed:

ConnectApi.NewFileAttachmentInput file = new ConnectApi.NewFileAttachmentInput();
file.title = 'Q4_Report.pdf';
file.description = 'Quarterly report';
input.capabilities = new ConnectApi.FeedElementCapabilitiesInput();
input.capabilities.files = new ConnectApi.FilesCapabilityInput();
input.capabilities.files.items = new List<ConnectApi.FileIdInput>{file};
ConnectApi.FeedItem result = ConnectApi.ChatterFeeds.postFeedItem(null, input);

发布带 Action Link 的 Feed——按钮驱动操作:

ConnectApi.ActionLinkGroupDefinition group = new ConnectApi.ActionLinkGroupDefinition();
ConnectApi.ActionLink actionLink = new ConnectApi.ActionLink();
actionLink.actionUrl = 'https://api.example.com/approve?id=' + recordId;
actionLink.method = ConnectApi.HTTPMethod.POST;
actionLink.requestBody = '{"status":"approved"}';
actionLink.headers = new Map<String, String>{
    'Authorization' => 'Bearer ' + token};
group.actionLinks = new List<ConnectApi.ActionLink>{actionLink};
input.capabilities.associatedActions = group;

评论、点赞、书签与私信:

// 发布评论 + @mention
ConnectApi.CommentInput comment = new ConnectApi.CommentInput();
comment.body = new ConnectApi.MessageBodyInput();
ConnectApi.Comment result = ConnectApi.ChatterFeeds.postComment('feedElementId', comment);

// 点赞
ConnectApi.ChatterFeeds.likeFeedElement(null, 'feedElementId');

// 书签
ConnectApi.ChatterFeeds.bookmarkFeedElement(null, 'feedElementId');

// 关注/取消关注记录
ConnectApi.ChatterFeeds.followRecord(null, 'recordId');
ConnectApi.ChatterFeeds.unfollowRecord(null, 'recordId');

// 私信
ConnectApi.ChatterMessages.sendMessage('userId', 'Hello!');

批量 Feed 触发器 + Commerce 购物车:

trigger AccountFeedTrigger on Account (after insert) {
    List<ConnectApi.FeedItemInput> items = new List<ConnectApi.FeedItemInput>();
    for (Account acc : Trigger.new) {
        ConnectApi.FeedItemInput input = new ConnectApi.FeedItemInput();
        input.body = new ConnectApi.MessageBodyInput();
        input.body.messageSegments = new List<ConnectApi.MessageSegmentInput>{
            new ConnectApi.TextSegmentInput() {{ text = 'New: ' + acc.Name; }}};
        input.subjectId = acc.OwnerId;
        items.add(input);
    }
    ConnectApi.ChatterFeeds.postFeedElementBatch(null, items);
}

// B2B Commerce——创建购物车
ConnectApi.CartInput cartInput = new ConnectApi.CartInput();
cartInput.communityId = Network.getNetworkId();
cartInput.effectiveAccountId = 'accountId';
ConnectApi.Cart cart = ConnectApi.Commerce.createCart(cartInput);

Repository 文件管理:获取文件预览、创建/更新 Google Drive 仓库文件(metadata only 或含二进制内容)、获取认证 URL。ConnectApi 的 JSON 序列化/反序列化与 Connect REST API 结构一致。使用 ConnectApiHelper 辅助类简化富文本(内嵌图片、代码块)的发布。所有 ConnectApi 代码需要与其他 Apex 代码相同的测试覆盖率。

Connect in Apex 从简单的 Feed 发布到复杂的 Action Link 集成、B2B Commerce 购物车和 CMS 管理内容——将 Chatter、Commerce 和 Experience Cloud 深度集成到你的 Apex 应用中。