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.FeedItem、ConnectApi.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 应用中。