Apex 集成服务:连接 Salesforce 与外部系统

掌握 Apex 集成服务:用 REST 和 SOAP callout 连接外部系统,把 Apex 类暴露为 REST/SOAP web 服务。本文系统讲解 HTTP callout 基础、GET/POST 数据收发、WSDL2Apex 生成 SOAP 代理类、用 StaticResourceCalloutMock/HttpCalloutMock/WebServiceMock 测试 callout,以及授权端点、输入校验等安全考量,构建安全可靠的 Salesforce 集成。...

📅 2026/10/5 ✍️ ponybai 🏷️ salesforce, developer, apex, headless

一、Apex 集成概览

slide_2

本单元学习目标:理解 Web service callout 与 HTTP callout 的区别;用 Remote Site Settings 授权外部站点。Apex callout 让你把 Salesforce 与外部系统紧密连接——发起调用、接收响应,从而构建强大的集成。

发起 Callout 与授权端点

slide_3

Apex callout 让你把 Apex 代码与外部服务紧密集成:callout 向外部 web 服务发起调用,或从 Apex 代码发送 HTTP 请求,然后接收响应。Apex callout 分两种:

  • SOAP web service callout——使用 XML,通常需要 WSDL 文档来生成代码。
  • HTTP callout——通常使用 REST + JSON。

两种 callout 在「发送请求、接收响应」上类似,但 WSDL-based callout 只适用于 SOAP,HTTP callout 可用于任何 HTTP 服务(SOAP 或 REST)。那该用哪种?尽可能用 HTTP 服务——它们更易交互、代码更少、JSON 更易读。SOAP 多用于集成遗留应用,或需要正式交换格式、有状态操作的事务。

授权端点(Authorize Endpoint Addresses):Salesforce 重视安全,任何 callout 到外部站点前必须先授权——不能让代码未经批准就随意调用任意端点。在 Remote Site Settings 页面维护 org 的已批准站点列表:Setup → Remote Site Settings → New Remote Site → 填名称、URL → Active 勾选 → Save。本模块用两个端点:https://th-apex-http-callout.herokuapp.com 和 https://th-apex-soap-service.herokuapp.com。这是平台级安全控制——Salesforce 不允许 callout 到未授权端点,否则报 Unauthorized endpoint 错误。

二、Apex REST Callout

slide_4

本单元掌握 REST callout:HTTP 基础、GET 请求获取数据、POST 请求发送数据,以及用 mock 响应测试 callout。

HTTP 与 Callout 基础

slide_5

REST callout 基于 HTTP。每个 callout 请求关联一个 HTTP 方法和一个端点,HTTP 方法表示期望的动作类型。最简单的请求是 GET——表示发送方想从服务器获取资源信息。常见 HTTP 方法:

  • GET——获取 URL 标识的数据。
  • POST——创建资源或向服务器提交数据。
  • DELETE——删除 URL 标识的资源。
  • PUT——创建或替换请求体中的资源。

除 HTTP 方法外,每个请求还设置 URI(服务所在端点地址)和 headers(如 content type)。服务器处理请求后,在响应中返回状态码:200 表示成功,404 表示文件未找到,500 表示内部服务器错误。

获取数据与发送数据

slide_6

获取数据(GET):发送 GET 请求,把 JSON 响应反序列化为 Apex 对象。用 JSON.deserialize 把响应字符串转为 Apex 对象(或 JSON.deserializeUntyped 转为基本类型集合)。

发送数据(POST):把 Apex 对象序列化为 JSON 放进请求体。用 JSON.serialize 把 Apex 对象转 JSON,设置 Content-Type header 告知服务数据格式,然后发送。

处理响应前务必检查状态码:200 范围是成功,4xx 是客户端错误(请求无效),5xx 是服务端错误。所有情况都要优雅处理。

用 Mock 响应测试 Callout

slide_7

Apex 测试方法不支持真实 callout,执行 callout 的测试会失败。好消息是测试运行时允许你「mock」callout——指定测试中要返回的响应,而不是真的调用 web 服务。两种方式:

  • StaticResourceCalloutMock——响应用静态资源存储,适合简单、固定不变的响应。
  • HttpCalloutMock 接口——实现 respond() 方法,根据请求返回动态响应,适合响应多变的复杂场景。

用 Test.setMock(HttpCalloutMock.class, mock) 在 callout 前注册 mock,Test.startTest/Test.stopTest 强制同步执行。这样无需真正命中端点,即可测试成功、错误、超时和边界场景。

三、Apex SOAP Callout

slide_8

本单元学习 SOAP callout:用 WSDL2Apex 从 WSDL 生成 Apex 类、执行 SOAP 请求,以及用 mock 响应测试。

WSDL2Apex 与执行 Callout

slide_9

WSDL2Apex 从 WSDL(Web Service Description Language)文档自动生成 Apex 类:下载 web 服务的 WSDL 文件 → Setup → Apex Classes → Generate from WSDL → 上传 WSDL → Salesforce 生成 Apex 类(stub 类 + 每个操作的请求/响应类)。生成的代码自动处理 SOAP envelope、序列化和反序列化,你无需手动构造和解析 XML。

执行 callout:实例化生成的 stub 类 → 创建请求对象并设参数 → 调用方法执行 → 拿到响应对象读取结果。WSDL2Apex 解析是出了名的挑剔——可能因不支持的类型、多个 binding 或未知元素而失败,必要时需手动编码或用 HTTP。

测试 Web Service Callout

slide_10

SOAP callout 测试用 WebServiceMock 接口(SOAP 版的 HttpCalloutMock):实现 doInvoke() 方法,根据请求细节配置响应,把 mock 响应对象放进 response map,再用 Test.setMock(WebServiceMock.class, mock) 注册。

WebServiceMock 比 HttpCalloutMock 更复杂,因为 SOAP 有更强的请求/响应结构——需要为每个操作创建正确的响应类型。但原理一样:拦截 → mock → 返回。

四、Apex Web 服务

slide_11

本单元反过来:把 Apex 类暴露为 REST 和 SOAP web 服务,供外部系统调用,并做全面测试和安全加固。

将 Apex 暴露为 REST 和 SOAP 服务

slide_12

Apex 既能消费也能提供 web 服务。暴露为 REST 服务:用 @RestResource(urlMapping='/accounts/*') 注解类,方法加 HTTP 注解——@HttpGet(获取)、@HttpPost(创建)、@HttpPut(全量更新)、@HttpPatch(部分更新)、@HttpDelete(删除)。暴露为 SOAP 服务:方法加 webservice 关键字和 static 修饰符。

REST 现代、基于 JSON、URL 映射;SOAP 传统、基于 XML、由 WSDL 生成。新的集成优先选 REST。

REST 演练与测试

slide_13

REST 操作映射 HTTP 方法:POST 创建记录、GET 获取记录、PUT 全量更新(本质是 upsert)、PATCH 部分更新、DELETE 删除记录。

测试 Apex REST:创建测试记录 → 设置 RestContext.request(测试端点 URI 和方法)→ 直接调用 REST 方法 → 断言响应。REST 类可以像其他 Apex 类一样直接调用方法测试,无需真实 HTTP 服务器。

安全考量

slide_14

保护 Apex web 服务:

  • 认证——对外 callout 用 OAuth、session ID 或 Named Credentials。
  • 授权——REST/SOAP 方法中先检查用户权限再处理。
  • 输入校验——校验所有入站数据,防止注入攻击和数据损坏。
  • CSRF 保护——REST 端点由 Salesforce 自动处理。
  • 速率限制——governor limits 同样适用于 REST/SOAP 方法。

支持的数据类型:基本类型、sObject(标准/自定义)、集合(List/Set/Map)、自定义 Apex 类(序列化为 JSON)。命名空间:托管包用 /namespace/endpoint,非托管用 /services/apexrest/endpoint。安全的核心原则:永远不要信任外部输入——始终校验、始终检查权限。


文章来源:Trailhead - Apex Integration Services