一、Apex 集成概览
本单元学习目标:理解 Web service callout 与 HTTP callout 的区别;用 Remote Site Settings 授权外部站点。Apex callout 让你把 Salesforce 与外部系统紧密连接——发起调用、接收响应,从而构建强大的集成。
发起 Callout 与授权端点
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
本单元掌握 REST callout:HTTP 基础、GET 请求获取数据、POST 请求发送数据,以及用 mock 响应测试 callout。
HTTP 与 Callout 基础
REST callout 基于 HTTP。每个 callout 请求关联一个 HTTP 方法和一个端点,HTTP 方法表示期望的动作类型。最简单的请求是 GET——表示发送方想从服务器获取资源信息。常见 HTTP 方法:
- GET——获取 URL 标识的数据。
- POST——创建资源或向服务器提交数据。
- DELETE——删除 URL 标识的资源。
- PUT——创建或替换请求体中的资源。
除 HTTP 方法外,每个请求还设置 URI(服务所在端点地址)和 headers(如 content type)。服务器处理请求后,在响应中返回状态码:200 表示成功,404 表示文件未找到,500 表示内部服务器错误。
获取数据与发送数据
获取数据(GET):发送 GET 请求,把 JSON 响应反序列化为 Apex 对象。用 JSON.deserialize 把响应字符串转为 Apex 对象(或 JSON.deserializeUntyped 转为基本类型集合)。
发送数据(POST):把 Apex 对象序列化为 JSON 放进请求体。用 JSON.serialize 把 Apex 对象转 JSON,设置 Content-Type header 告知服务数据格式,然后发送。
处理响应前务必检查状态码:200 范围是成功,4xx 是客户端错误(请求无效),5xx 是服务端错误。所有情况都要优雅处理。
用 Mock 响应测试 Callout
Apex 测试方法不支持真实 callout,执行 callout 的测试会失败。好消息是测试运行时允许你「mock」callout——指定测试中要返回的响应,而不是真的调用 web 服务。两种方式:
- StaticResourceCalloutMock——响应用静态资源存储,适合简单、固定不变的响应。
- HttpCalloutMock 接口——实现
respond()方法,根据请求返回动态响应,适合响应多变的复杂场景。
用 Test.setMock(HttpCalloutMock.class, mock) 在 callout 前注册 mock,Test.startTest/Test.stopTest 强制同步执行。这样无需真正命中端点,即可测试成功、错误、超时和边界场景。
三、Apex SOAP Callout
本单元学习 SOAP callout:用 WSDL2Apex 从 WSDL 生成 Apex 类、执行 SOAP 请求,以及用 mock 响应测试。
WSDL2Apex 与执行 Callout
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
SOAP callout 测试用 WebServiceMock 接口(SOAP 版的 HttpCalloutMock):实现 doInvoke() 方法,根据请求细节配置响应,把 mock 响应对象放进 response map,再用 Test.setMock(WebServiceMock.class, mock) 注册。
WebServiceMock 比 HttpCalloutMock 更复杂,因为 SOAP 有更强的请求/响应结构——需要为每个操作创建正确的响应类型。但原理一样:拦截 → mock → 返回。
四、Apex Web 服务
本单元反过来:把 Apex 类暴露为 REST 和 SOAP web 服务,供外部系统调用,并做全面测试和安全加固。
将 Apex 暴露为 REST 和 SOAP 服务
Apex 既能消费也能提供 web 服务。暴露为 REST 服务:用 @RestResource(urlMapping='/accounts/*') 注解类,方法加 HTTP 注解——@HttpGet(获取)、@HttpPost(创建)、@HttpPut(全量更新)、@HttpPatch(部分更新)、@HttpDelete(删除)。暴露为 SOAP 服务:方法加 webservice 关键字和 static 修饰符。
REST 现代、基于 JSON、URL 映射;SOAP 传统、基于 XML、由 WSDL 生成。新的集成优先选 REST。
REST 演练与测试
REST 操作映射 HTTP 方法:POST 创建记录、GET 获取记录、PUT 全量更新(本质是 upsert)、PATCH 部分更新、DELETE 删除记录。
测试 Apex REST:创建测试记录 → 设置 RestContext.request(测试端点 URI 和方法)→ 直接调用 REST 方法 → 断言响应。REST 类可以像其他 Apex 类一样直接调用方法测试,无需真实 HTTP 服务器。
安全考量
保护 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。安全的核心原则:永远不要信任外部输入——始终校验、始终检查权限。












