Salesforce Callin 全解析:入站调用方式、限制与最佳实践
在 Salesforce 集成架构中,除了 Salesforce 主动调用外部系统的 Callout 外,还存在外部系统主动访问 Salesforce 的 Callin(入站调用)场景。本文将全面介绍 Salesforce 支持的所有 Callin 方式,分析其适用场景、优缺点及限制,并提供实战示例代码。
一、Callin 基础概念
Callin 指外部系统通过 API 或其他方式主动访问 Salesforce,实现数据交互或触发业务逻辑。常见用途包括:
- 外部电商平台创建订单后同步到 Salesforce 生成 Opportunity
- ERP 系统更新产品库存后实时同步到 Salesforce 产品对象
- 第三方表单系统提交数据后在 Salesforce 创建 Lead
- 物联网设备发送状态数据触发 Salesforce 工作流
Salesforce 提供了多种 Callin 接入方式,需根据外部系统能力、数据量和实时性要求选择合适方案。
二、主要 Callin 方式及实现
1. REST API Callin
适用场景:外部系统通过 HTTP/HTTPS 协议调用 Salesforce REST API,适合轻量级、实时性要求高的交互(如单条记录创建/更新、查询数据)。
实现方式:外部系统通过 OAuth 2.0 认证获取访问令牌,然后调用 Salesforce 标准 REST API 或自定义 Apex REST 接口。
关键信息
- 认证方式:支持 OAuth 2.0(推荐)、用户名密码流、JWT Bearer 令牌等
- 数据格式:JSON(推荐)或 XML
- 端点格式:
https://your-instance.salesforce.com/services/data/vXX.X/(XX.X 为 API 版本)
示例 1:调用标准 REST API 创建 Account
步骤 1:获取访问令牌(OAuth 2.0 用户名密码流)
# 发送认证请求
curl -X POST https://login.salesforce.com/services/oauth2/token \
-d "grant_type=password" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "username=YOUR_USERNAME" \
-d "password=YOUR_PASSWORD+SECURITY_TOKEN"
成功响应:
{
"access_token": "00Dxx0000001234!AQEAQ...",
"instance_url": "https://your-instance.salesforce.com",
"id": "https://login.salesforce.com/id/00Dxx0000001234EAQ/005xx000000ABCD",
"token_type": "Bearer",
"issued_at": "1620000000000",
"signature": "abc123..."
}
步骤 2:使用令牌创建 Account
# 调用标准 REST API 创建账户
curl -X POST https://your-instance.salesforce.com/services/data/v58.0/sobjects/Account/ \
-H "Authorization: Bearer 00Dxx0000001234!AQEAQ..." \
-H "Content-Type: application/json" \
-d '{
"Name": "外部系统创建的公司",
"Industry": "Technology",
"Website": "https://example.com"
}'
成功响应:
{
"id": "001xx00000ABCDE",
"success": true,
"errors": []
}
示例 2:自定义 Apex REST 接口(处理复杂业务)
当标准 API 无法满足需求时,可创建自定义 REST 接口:
@RestResource(urlMapping='/custom/order/*') // 自定义端点路径
global with sharing class CustomOrderRestResource {
// 处理 POST 请求:创建订单并关联机会
@HttpPost
global static String createOrder() {
// 获取请求体
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
try {
// 解析 JSON 请求
Map<String, Object> requestData = (Map<String, Object>)JSON.deserializeUntyped(req.requestBody.toString());
// 验证必填字段
if (!requestData.containsKey('opportunityId') || !requestData.containsKey('amount')) {
res.statusCode = 400; // 错误状态码:参数缺失
return '错误:缺少必填字段(opportunityId 或 amount)';
}
// 创建订单记录
Order ord = new Order(
OpportunityId = (String)requestData.get('opportunityId'),
Amount = (Decimal)requestData.get('amount'),
Status = 'Draft',
EffectiveDate = Date.today()
);
insert ord;
// 返回成功结果
return JSON.serialize(new Map<String, Object>{
'success' => true,
'orderId' => ord.Id,
'message' => '订单创建成功'
});
} catch (Exception e) {
res.statusCode = 500; // 服务器错误
return '处理失败:' + e.getMessage();
}
}
}
外部系统调用自定义接口:
curl -X POST https://your-instance.salesforce.com/services/apexrest/custom/order/ \
-H "Authorization: Bearer 00Dxx0000001234!AQEAQ..." \
-H "Content-Type: application/json" \
-d '{
"opportunityId": "006xx00000ABCDE",
"amount": 50000.00
}'
优点:
- 轻量级、灵活,支持 JSON 格式
- 标准 API 无需开发,开箱即用
- 自定义接口可实现复杂业务逻辑
缺点:
- 单请求数据量有限(最大 6MB)
- 不适合大批量数据
Salesforce入站调用全解析

最低0.47元/天 解锁文章

619

被折叠的 条评论
为什么被折叠?



