大对象

一个大对象在 Salesforce 上存储和管理大量数据 平台。您可以存档来自其他对象的数据,也可以从外部系统引入海量数据集 到一个大对象中,以获得客户的全貌。客户端和外部系统使用 用于访问大对象数据的标准 API 集。大对象提供一致的性能, 无论您拥有 100 万条记录、1 亿条记录,还是 10 亿条记录。这个比例给出了一个大对象 它的力量并定义了它的功能。

有两种类型的大物体。

  • 标准 大 objects – 对象 由 Salesforce 定义并包含在 Salesforce 产品中。 是一个标准的大对象,它将数据存储为 Field 的一部分 审计跟踪产品。标准大对象始终可用,无法自定义。FieldHistoryArchive
  • 定制大 对象 – 新建 您创建的用于存储组织特有信息的对象。自定义大对象扩展了 Lightning Platform 提供的功能。例如,如果您正在构建一个要跟踪的应用 产品库存,创建一个自定义大对象,用于跟踪历史库存水平以进行分析和 未来的优化。本实施指南用于配置和部署自定义 big 对象。HistoricalInventoryLevels

自定义大对象用例

  • 360°全景 的 customer – 扩展 您的 Salesforce 数据模型,包括来自忠诚度计划、提要、 点击次数、结算和配置信息等。
  • 审计和 tracking – 追踪 并保持对 Salesforce 或产品使用情况的长期看法,以便进行分析或合规性 目的。
  • 历史的 存档 – 维护 访问历史数据以进行分析或合规,同时优化性能 您的核心 CRM 或 Lightning 平台应用程序。

大对象与其他对象的区别

因为一个大对象可以无限尺度地存储数据,所以它具有不同的特征 而不是其他对象,如 sObjects。大对象也存储在 闪电平台。

大物体s对象
可水平扩展的分布式数据库关系数据库
非事务性数据库事务数据库
数亿甚至数十亿条记录数以百万计的记录

这些大对象行为可确保一致且可扩展的体验。

  • 大对象仅支持对象和字段权限,不支持常规或标准共享 规则。
  • 不支持触发器、流、流程和 Salesforce 移动应用程序等功能 大物体。
  • 当您多次插入具有相同表示的相同大对象记录时, 仅创建单个记录,以便写入可以是幂等的。此行为是不同的 从 sObject,它为每个创建对象的请求创建一条记录。

对大型对象的 API 支持

您可以轻松地将自定义大对象与您的实时 Salesforce 数据集成。你可以处理大 具有 SOQL、Bulk、Chatter 和 SOAP API 的对象。

注意

这些 API 是唯一受支持的 API 适用于大物体。例如,不支持 REST API。

另见

大对象最佳实践

大型对象是独一无二的,因为它能够针对大量对象进行扩展 数据。

适用于:Salesforce Classic 和 Lightning Experience
适用于:EnterprisePerformanceUnlimited 和 Developer Edition,最多可保存 100 万条记录

使用大对象时的注意事项

  • 要定义大对象或向自定义大对象添加字段,请使用元数据 API 或 设置。
  • 大型对象支持自定义 Lightning 和 Visualforce 组件,而不是标准 UI 元素主页、详细信息页面或列表视图。
  • 每个组织最多可以创建 100 个大对象。大对象字段的限制类似 对自定义对象的限制,并取决于组织的许可证类型。
  • 您不能使用 Salesforce Connect 外部对象访问其他组织中的大对象。
  • 大型对象不支持加密。如果从标准或 自定义对象,它以明文形式存储在大对象上。如果您使用 Salesforce Shield Platform 加密、标准或自定义对象字段历史记录已加密。 对于字段历史记录,使用 Shield 字段历史记录存档对数据进行存档。大物体 尊重静态加密。Shield Platform Encryption 则不然 支持自定义大对象。

在设计时考虑弹性

大对象数据库存储数十亿条记录,是一个有利于 一致性高于可用性。该数据库旨在确保行级别的一致性。

在使用 API 或 Apex 处理大数据和写入批量记录时,您可以 在写入某些记录而未写入其他记录时遇到部分批处理失败。因为 数据库在大规模上具有高度响应性和一致性,这种类型的行为是预期的。在 在这些情况下,只需重试,直到写入所有记录。

在处理大型对象时,请牢记这些原则。

  • 写入大对象时,最佳做法是采用重试机制。重试 批处理,直到您从 API 或 Apex 方法获得成功的结果。提示要添加 记录到自定义对象并向用户显示错误,请使用该方法。请参阅异常简介 处理。addError()提示若要验证是否保存了所有记录,请检查类。请参阅 SaveResult 类 参考。Database.SaveResult
  • 不要试图弄清楚哪些记录成功,哪些记录失败。重试整个 批。
  • 大对象不支持事务。如果尝试读取或写入大对象 sObject 上的触发器、进程或流,请使用异步 Apex。异步 Apex 具有以下功能 就像隔离 DML 的接口一样 对不同的 sObject 类型进行操作,以防止混合 DML 错误。Queueable
  • 由于客户端代码必须重试,因此请使用异步 Apex 写入大对象。由 异步写入,可以更好地处理数据库生命周期事件。

另见

定义和部署自定义大对象

您可以使用元数据 API 或在设置中定义自定义大对象。在定义和 部署一个大对象,您可以查看它或在设置中添加字段。在部署了大型 对象,则无法编辑或删除索引。要更改索引,请从新的大 对象。要在设置中定义大对象,请参阅 Salesforce 帮助。

定义自定义大对象

通过元数据 API 定义自定义大对象,方法是创建包含以下内容的 XML 文件 其定义、字段和索引。

  • 对象文件 – 为每个对象创建一个文件 定义自定义大对象、其字段及其索引。
  • 权限集/配置文件 – 创建权限集或配置文件以指定权限 对于每个字段。这些文件不是必需的,但需要授予 访问用户。默认情况下,对自定义大对象的访问是 限制。
  • package file – 为元数据 API 创建一个文件 指定要迁移的元数据的内容。注意包装 文件与 Salesforce 的打包功能无关。此文件 不是已解锁、非托管或托管的包。它只是一个文件 由元数据 API 使用。

注意

虽然自定义大对象使用 CustomObject 元数据类型,但某些 参数对于大型对象是唯一的,其他参数则不适用。具体的 适用于大型对象的元数据参数在此中概述 公文。

自定义大对象的命名约定

对象名称在所有标准对象、自定义对象、外部对象中必须是唯一的 对象,以及组织中的大对象。在 API 中,自定义大对象的名称 后缀为两个下划线,后跟小写字母“b”(__b)。为 例如,一个名为“HistoricalInventoryLevels”的大对象被视为 HistoricalInventoryLevels__b该组织的 WSDL 中。我们建议您制作 对象标签在组织中的所有对象中是唯一的 – 标准、自定义、外部和 大物体。

CustomObject 元数据

字段名称字段类型描述
deploymentStatusDeploymentStatus (枚举类型 字符串)自定义大对象的部署状态(适用于所有大对象 对象)Deployed
fields自定义字段[]大对象中字段的定义
fullName字符串大对象的唯一 API 名称
indexes索引[]指数的定义
label字符串UI 中显示的大对象名称
pluralLabel字符串UI 中显示的字段复数名称

CustomField 元数据

字段名称字段类型描述
fullName字符串字段的唯一 API 名称。
label字符串UI 中显示的字段名称。
lengthint字段的长度(以字符为单位)(Text 和 LongTextArea 字段 仅)。中所有文本字段中的字符总数 索引不能超过 100。要增加此值,请联系 Salesforce 客户支持。注意电子邮件字段为 80 个字符。电话字段 是 40 个字符。设计时请牢记这些长度 您的索引,因为它们计入 100 个字符 限制。
pluralLabel字符串UI 中显示的字段复数名称。
precisionint数字值的位数。例如,数字 256.99 的精度为 5(仅限数字字段)。
referenceTo字符串查阅字段的相关对象类型 (查阅字段 仅)。
relationshipName字符串UI 中显示的关系的名称(查找字段 仅)。
required布尔指定该字段是否为必填字段。属于 的索引必须标记为必需。
scaleint数字小数点右边的位数 价值。例如,数字 256.99 的小数位数为 2(数字 仅限字段)。
type字段类型字段类型。支持日期时间、电子邮件、查找、号码、电话、 Text、LongTextArea 和 URL。注意不能包含 LongTextArea 和 索引中的 URL 字段。

注意

自定义字段不支持唯一性。

索引元数据

表示在自定义 big 中定义的索引 对象。使用此元数据类型定义 自定义大对象。

字段名称字段类型描述
领域索引字段[]索引中字段的定义。
标签字符串必填。此名称用于指代用户界面中的大对象。 在 API 版本 41.0 及更高版本中可用。

IndexField 元数据

定义构成索引的字段、它们的顺序和排序 方向。定义字段的顺序决定了字段的列出顺序 在索引中。

注意

索引中所有文本字段的总字符数不能超过 100. 要增加此值,请联系 Salesforce 客户支持。

字段名称字段类型描述
名字字符串必填。属于索引的字段的 API 名称。此值必须 匹配相应值 字段,并标记为必填。fullName警告什么时候 通过 SOQL 查询一个大对象记录,并将结果作为参数传递给 删除 API,如果任何索引字段名称具有前导或尾随空格,则 无法删除大对象记录。
排序方向字符串必填。索引中字段的排序方向。有效值为升序和降序。ASCDESC

创建用于部署的元数据文件

以下 XML 摘录创建可部署的元数据文件。每个客户 交互对象表示在线视频中单个会话中的客户数据 游戏。、 和 字段定义索引,查找字段将 客户与 Account 对象的交互。Account__cGame_Platform__cPlay_Date__cCustomer_Interaction__b.object

<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
    <deploymentStatus>Deployed</deploymentStatus>

    <fields>
        <fullName>In_Game_Purchase__c</fullName>
        <label>In-Game Purchase</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
    <fields>
        <fullName>Level_Achieved__c</fullName>
        <label>Level Achieved</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
    <fields>
        <fullName>Lives_This_Game__c</fullName>
        <label>Lives Used This Game</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
    <fields>
        <fullName>Game_Platform__c</fullName>
        <label>Platform</label>
        <length>16</length>
        <required>true</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    
     <fields>
        <fullName>Score_This_Game__c</fullName>
        <label>Score This Game</label>
        <length>16</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
    </fields>

    <fields>
        <fullName>Account__c</fullName>
        <label>User Account</label>
        <referenceTo>Account</referenceTo>
        <relationshipName>Game_User_Account</relationshipName>
        <required>true</required>
        <type>Lookup</type>
    </fields>

    <fields>
        <fullName>Play_Date__c</fullName>
        <label>Date of Play</label>
        <required>true</required>
        <type>DateTime</type>
    </fields>

    <fields>
        <fullName>Play_Duration__c</fullName>
        <label>Play Duration</label>
        <required>false</required>
        <type>Number</type>
        <scale>2</scale>
        <precision>18</precision>
    </fields>

    <indexes>
        <fullName>CustomerInteractionsIndex</fullName>
        <label>Customer Interactions Index</label>
        <fields>
            <name>Account__c</name>
            <sortDirection>DESC</sortDirection>
        </fields>
        <fields>
            <name>Game_Platform__c</name>
            <sortDirection>ASC</sortDirection>
        </fields>
        <fields>
        <name>Play_Date__c</name>
        <sortDirection>DESC</sortDirection>
        </fields>        
    </indexes>
    
    <label>Customer Interaction</label>
    <pluralLabel>Customer Interactions</pluralLabel>
</CustomObject>

包.xml

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
        <members>*</members>
        <name>CustomObject</name>
    </types>
    <types>
        <members>*</members>
        <name>PermissionSet</name>
    </types>
    <version>41.0</version>
</Package>

Customer_Interaction_BigObject.权限集

<?xml version="1.0" encoding="UTF-8"?>
<PermissionSet xmlns="http://soap.sforce.com/2006/04/metadata">
     
    <label>Customer Interaction Permission Set</label>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.In_Game_Purchase__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Level_Achieved__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Lives_This_Game__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Play_Duration__c</field>
        <readable>true</readable>
    </fieldPermissions>
     
    <fieldPermissions>
        <editable>true</editable>
        <field>Customer_Interaction__b.Score_This_Game__c</field>
        <readable>true</readable>
    </fieldPermissions>
     

</PermissionSet>

使用元数据 API 部署自定义大对象

使用 Metadata API 和 Ant Migration Tool 进行部署。在构建文件以部署自定义大对象时,请确保对象文件位于名为 objects 的文件夹中,并且权限集文件位于 在名为 permissionsets 的文件夹中。将 package.xml 文件放在根目录中,而不是放在 子文件夹。

在设置中查看自定义大对象

部署自定义大对象后,您可以通过登录到 组织,然后从“设置”中输入“快速查找”框,然后选择“大” 对象Big Objects

若要查看其字段和关系,请单击大对象的名称。

另见

使用 Zip 文件部署和检索元数据

和调用用于部署和检索 .zip 文件。在 .zip 文件是一个项目清单 (package.xml),其中列出了要执行的操作 检索或部署,以及组织到文件夹中的一个或多个 XML 组件。

deploy()retrieve()

注意

组件是元数据类型的实例。例如,是自定义对象的元数据类型,并且 该组件是 自定义对象。CustomObjectMyCustomObject__c

在 .zip 文件中检索或部署的文件可能是未打包的组件 驻留在组织中(例如标准对象)或打包组件 驻留在命名包中。

注意

您可以部署或 一次最多可检索 10,000 个文件。AppExchange 软件包使用不同的限制: 最多可包含 35,000 个文件。已部署或检索的 .zip 的最大大小 文件大小为 39 MB。如果文件在解压缩的文件夹中解压缩,则大小限制 是 400 MB。

  • 如果使用 Ant 迁移工具执行 部署解压后的文件夹,首先压缩文件夹中的所有文件。这 解压缩文件夹中未压缩组件的最大大小为 400 MB 或更少 取决于压缩比。如果文件具有高压缩比, 您总共可以迁移大约 400 MB,因为压缩的大小 将小于 39 MB。但是,如果组件不能被压缩太多,比如 二进制静态资源,可以迁移小于 400 MB。
  • 元数据 API base-64 对组件进行编码 它们被压缩了。生成的 .zip 文件不能超过 50 MB,即 SOAP 消息的限制。Base-64 编码会增加有效负载的大小,因此 在编码之前,压缩的有效负载不能超过大约 39 MB。
  • 您可以执行大 对象仅在定义其索引时才被定义。如果在安装程序中创建了一个大对象,并且 尚未定义索引,则无法检索它。retrieve()

每个 .zip 文件都包含一个项目清单、一个名为 package.xml 的文件以及一组包含 组件。清单文件定义您尝试执行的组件 在 .zip 文件中检索或部署。清单还定义了 API 版本 用于部署或检索。

注意

您可以编辑项目 清单,但如果您修改它所包含的组件列表,请小心。当你 部署或检索组件时,元数据 API 会引用 清单,而不是 .zip 文件中的目录。

下面是一个示例包 .xml 文件。您可以检索 通过在元素中指定元数据类型的 fullName 字段值来获取元数据类型的单个组件。您还可以 使用 检索元数据类型的所有组件。members<members>*</members>

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
        <members>MyCustomObject__c</members>
        <name>CustomObject</name>
    </types>
    <types>
        <members>*</members>
        <name>CustomTab</name>
    </types>
    <types>
        <members>Standard</members>
        <name>Profile</name>
    </types>
    <version>59.0</version>
</Package>

可以在 package.xml 中定义以下元素。

  • <fullName>包含服务器端的名称 包。如果不存在,则 package.xml 定义客户端包。<fullName>unpackaged
  • <types>包含元数据类型的名称 (例如,) 和 成员(例如,) 为 检索或部署。您可以在清单文件中添加多个元素。CustomObjectmyCustomObject__c<types>
  • <members>包含组件的 fullName,例如 。该调用对 确定特定组件的 fullName 元数据类型(如果要检索单个组件)。对于许多元数据 类型,您可以将 中的值替换为通配符(星号) 而不是单独列出每个成员。有关特定 type 以确定该类型是否支持通配符。 每个组件 在元数据 API 部署中必须具有唯一的名称。解析为 重复项,例如一个符号和 UTF-8 编码符号以及一对名为 xyz.typename 和 xyz.typename-meta.xml 仍然是 重复。MyCustomObject__clistMetadata()members*注意在元素中指定 Security,在名称中指定 Settings 元素。<members>
  • <name>包含元数据类型,例如 或 。在 目录。任何扩展元数据的元数据类型都是有效值。输入的名称 必须与元数据 API WSDL 中定义的元数据类型匹配。有关列表,请参阅元数据类型。CustomObjectProfile
  • <version>是使用的 API 版本号 部署或检索 .zip 文件时。当前有效值为 。59.0

有关演示如何工作的更多示例包 .xml 清单文件 使用不同的元数据子集,请参阅示例包 .xml 清单 文件。

要删除组件,请参阅从 组织。

填充自定义大对象

使用 Salesforce API 填充自定义大对象。您可以使用 CSV 文件通过 Bulk API 2.0 将数据加载到自定义大对象中。这 CSV 文件中的第一行必须包含用于将 CSV 数据映射到的字段标签 导入期间自定义大对象中的字段。

注意

批量 API 和批量 API 2.0 支持查询和插入大对象。

插入是幂等的,因此插入已存在的数据不会导致 重复。在上传数百万条记录时,重新插入非常有用。如果错误 发生时,重新插入会重新上传失败的上传,而不会出现重复数据。在 重新插入时,如果提供的索引不存在任何记录,则新记录为 插入。例如,此 CSV 文件包含要导入 Customer Interaction 的数据 对象。

Play Start,In-Game Purchase,Level Achieved,Lives Used,Platform,Play Stop,Score,Account
2015-01-01T23:01:01Z,A12569,57,7,PC,2015-01-02T02:27:01Z,55736,001R000000302D3
2015-01-03T13:22:01Z,B78945,58,7,PC,2015-01-03T15:47:01Z,61209,001R000000302D3
2015-01-04T15:16:01Z,D12156,43,5,iOS,2015-01-04T16:55:01Z,36148,001R000000302D3

使用 Apex 填充自定义大对象

使用 Apex 填充自定义大对象。

您可以使用该方法在 Apex 中创建和更新自定义大对象记录。Database.insertImmediate()

警告

不允许使用混合 DML 调用的 Apex 测试,否则会失败。如果你写 仅对大对象,测试会将错误数据插入到目标大对象中,然后 必须手动删除。若要包含对目标大对象的测试 DML 调用,请使用模拟 框架替换为存根 API。

我们建议您在插入值之前使用 Apex 方法删除前导和尾随空格,尤其是对于 主键字段中的值。此最佳实践可确保 SOQL 查询 对象稍后将按预期工作。String.trim()

在 SOQL 查询 WHERE 子句中指定索引字段时,SOQL 会删除任何前导或 在将空格与实际字段值进行比较之前,先留出空格。即使您的过滤器 字符串与插入的值匹配,不比较前导和尾随空格, 因此,筛选器不会匹配任何行。

因此,前导和尾随空格无法与已 数据处理。即使筛选器字符串与插入的值匹配,也不会匹配任何行 通过过滤器。

如果在更新插入到自定义大对象时将值设置为 NULL,则字段不会 如果它们具有现有值,则更新。若要将这些值设置为 NULL,请删除字段和 重新创建它。

重新插入索引相同但数据不同的记录会导致类似于 更新插入操作。如果存在具有索引的记录,则插入将覆盖索引 值替换为新数据。插入是幂等的,因此插入不存在的数据 导致重复。在上传数百万条记录时,重新插入非常有用。如果错误 发生时,重新插入会重新上传失败的上传,而不会出现重复数据。在 重新插入,如果提供的索引不存在记录,则插入新记录。

如果记录插入失败,该方法不会引发异常。相反,它 返回一个对象,该对象具有返回对象列表的方法。每个对象都包含有关作为 记录插入失败的结果。请参阅 Apex 开发人员指南,了解有关 错误。Database.insertImmediate()SaveResultgetErrors()Database.ErrorDatabase.ErrorSaveResult下面是 Apex 中的插入操作示例,该操作假定一个表,其中索引 由 、 和 组成。

FirstName__cLastName__cAddress__c

// Define the record.
PhoneBook__b pb = new PhoneBook__b();
pb.FirstName__c = 'John';
pb.LastName__c = 'Smith';
pb.Address__c = '1 Market St';
pb.PhoneNumber__c = '555-1212';
database.insertImmediate(pb);
// A single record will be created in the big object.
// Define the record with the same index values but different phone number.
PhoneBook__b pb = new PhoneBook__b();
pb.FirstName__c = 'John';
pb.LastName__c = 'Smith';
pb.Address__c = '1 Market St';
pb.PhoneNumber__c = '415-555-1212';
database.insertImmediate(pb);
// The existing records will be "re-inserted". Only a single record will remain in the big object.
// Define the record with the different index values and different phone number
PhoneBook__b pb = new PhoneBook__b();
pb.FirstName__c = 'John';
pb.LastName__c = 'Smith';
pb.Address__c = 'Salesforce Tower';
pb.PhoneNumber__c = '415-555-1212';
database.insertImmediate(pb);
// A new record will be created leaving two records in the big object.

另见

删除自定义大对象中的数据

使用 Apex 或 SOAP 删除自定义大对象中的数据。

Apex 方法删除数据 在自定义大对象中。声明一个 sObject,其中包含 自定义大对象的索引。sObject 的作用类似于模板。与 sObject 的字段和值将被删除。您只能指定属于部分的字段 大对象的索引。您必须指定索引中的所有字段。你不能 包含部分指定的索引或非索引字段,并且不包含通配符 支持。deleteImmediate()

如果由于容量优化而删除所有记录,请插入一两条记录 删除后空白记录,并等待 24 小时以恢复新容量 认可。

重要

使用大型对象的批处理限制为 50,000 条记录 时间。deleteImmediate()

注意

这些示例假定,当您最初插入大对象值时,您使用了 要删除的 Apex 方法 索引字段中的前导和尾随空格。请参阅使用 Apex 填充自定义大对象。String.trim()

在此示例中,、 和 是自定义大对象索引的一部分。什么时候 在子句后指定特定值,字段必须按照它们在索引中的出现顺序列出,而不显示任何值 差距。Account__cGame_Platform__cPlay_Date__cWHERE

// Declare sObject using the index of the custom big object -->
List<Customer_Interaction__b> cBO = new List<Customer_Interaction__b>();
cBO.addAll([SELECT Account__c, Game_Platform__c, Play_Date__c FROM Customer_Interaction__b WHERE Account__c = '001d000000Ky3xIAB']);

Database.deleteImmediate(cBO);

要使用 SOAP 调用,请声明 一个 sObject,其中包含要删除的字段和值。sObject 的作用类似于 模板。与 sObject 的字段和值匹配的所有行都将被删除。您可以 仅指定属于大对象索引的字段。索引中的所有字段 必须指定。不能包含部分指定的索引或未编制索引的索引 字段和通配符不受支持。此示例删除 001d000000Ky3xIAB、iOS 和 2017-11-28T19:13:36.000z 的所有行。deleteByExample()Account__cGame_Platform__cPlay_Date__c

Java 示例代码:

public static void main(String[] args) {
  try{
       Customer_Interaction__b[] sObjectsToDelete = new Customer_Interaction__b[1];
       //Declare an sObject that has the values to delete
       Customer_Interaction__b customerBO = new Customer_Interaction__b();
       customerBO.setAccount__c (“001d000000Ky3xIAB”);
       customerBO.setGame_Platform__c (“iOS”);
       Calendar dt = new GregorianCalendar(2017, 11, 28, 19, 13, 36);
       customerBO.setPlay_Date__c(dt);
       sObjectsToDelete[0] = customerBO;
       DeleteByExampleResult[] result = connection.deleteByExample(sObjectsToDelete);
  }  catch (ConnectionException ce) {
	      ce.printStackTrace();  
  }
}

注意

重复成功的操作会产生成功的结果,即使这些行已被删除也是如此。deleteByExample()

大对象可排队示例

要使用 sObject 中的触发器、进程或流读取或写入大对象, 使用异步 Apex。此示例使用异步 Apex 接口来隔离 不同的 sObject 类型,以防止混合 DML 错误。

Queueable

插入案例记录时会发生此触发器。它调用一个方法来插入 一批大对象记录并演示了部分故障情况,其中某些 记录成功,有些失败。要在此示例中为对象创建元数据文件, 使用创建用于部署的元数据文件示例中的 XML 摘录。

Customer_Interaction__b

提示

将日志记录添加到自定义对象并将错误显示到 用户,请使用该方法。请参阅简介 异常处理。addError()

// CaseTrigger.apxt

trigger CaseTrigger on Case (before insert) {
    if (Trigger.operationType == TriggerOperation.BEFORE_INSERT){
        // Customer_Interaction__b has three required fields in its row key, in this order:
        // 1) Account__c - lookup to Account
        // 2) Game_Platform__c - Text(18)
        // 3) Play_Date__c - Date/Time
        List<Customer_Interaction__b> interactions = new List<Customer_Interaction__b>();
        
        // Assemble the list of big object records to be inserted
        for (Case c : Trigger.new) {
            Customer_Interaction__b ci = new Customer_Interaction__b(
                Account__c = c.AccountId,
                // In this example, the Case object has a custom field, also named Game_Platform__c
                Game_Platform__c = c.Game_Platform__c,
                Play_Date__c = Date.today()
            );
            interactions.add(ci);
        }
        
        // CustomerInteractionHandler is an asynchronous queuable Apex class
        CustomerInteractionHandler handler = new CustomerInteractionHandler(interactions);
        System.enqueueJob(handler);
    }
}

触发器使用 Apex 接口 异步调用要插入到大对象中的方法。Queueable

// CustomerInteractionHandler.apxc

public class CustomerInteractionHandler implements Queueable {
    
    private List<Customer_Interaction__b> interactions;
    
    public CustomerInteractionHandler(List<Customer_Interaction__b> interactions) {
        this.interactions = interactions;
    }
 
    /*
     * Here we insert the Customer Interaction big object records,
     * or log an error if insertion fails.
     */
    public void execute(QueueableContext context){
        
        List<ExceptionStorage__c> errors = new List<ExceptionStorage__c>();
        
        try {
            // We have to use insertImmediate() to insert big object records.
            List<Database.SaveResult> srList = Database.insertImmediate(interactions);
            
            // Check the save results from the bulk insert
            for (Database.SaveResult sr: srList) {
                if (sr.isSuccess()) {
                       System.debug('Successfully inserted Customer Interaction.');
                } else {
                       for (Database.Error err : sr.getErrors()) {
                        // Display an error message if the insert failed
                        System.debug(err.getStatusCode() + ': ' + err.getMessage() + '; ' +
                                    'Error fields: ' + err.getFields());
                        
                        // Write to a custom object, such as ExceptionStorage__c
                        // for a more durable record of the failure
                        ExceptionStorage__c es = new ExceptionStorage__c(
                               name = 'Error',
                               ExceptionMessage__c = (err.getMessage()).abbreviate(255),
                               ExceptionType__c = String.valueOf(err.getStatusCode()),
                            ExceptionFields__c = (String.valueOf(err.getFields())).abbreviate(255)
                        );
                        errors.add(es);
                    }
                }
            }
        }
        catch (Exception e) {
            // Exception occurred, output the exception message
            System.debug('Exception: ' + e.getTypeName() + ', ' + e.getMessage());
            
            // Write any errors to a custom object as well
            ExceptionStorage__c es = new ExceptionStorage__c(
                   name = 'Exception',
                   ExceptionMessage__c = e.getMessage(),
                   ExceptionType__c = e.getTypeName()
            );
            errors.add(es);
        }
        
        // If any errors occurred, save the ExceptionStorage records
        if (errors.size() > 0) {
               insert errors;
        }
    }
}

另见

大对象查询示例

了解一些常见的大对象查询用例。

客户 360 度和过滤

在此用例中,管理员从 外部源到Salesforce大对象中,然后处理数据以丰富 Salesforce 中的客户资料。目标是存储客户交易和 大范围内的互动,例如销售点数据、订单和订单项 对象,然后处理该数据并将其与核心 CRM 数据相关联。锚固 客户交易和与核心CRM数据的交互提供了更丰富的 360 度视图,可转化为增强的客户体验。

Batch Apex 是对大型对象或 ApiEvent 进行自动处理的最佳选择, ReportEvent 或 ListViewEvent。此示例演示如何添加处理 引用相关数据。对大对象运行批处理 Apex 查询,并关联联系人信息 与那个大 对象。

public class QueryBigObjectAndContact implements Database.Batchable<sObject> {
    private String key;
	public QueryBigObjectAndContact(String keyParam) {
        key = keyParam
    }
    
    public Iterable<SObject> start(Database.BatchableContext BC) {
		return [SELECT Big_Object_Field__c, Account__c FROM Big_Object__b WHERE Big_Object_Primary_Key > key LIMIT 50000]
    }

    public void execute(Database.BatchableContext bc, List<Big_Object__b> bos){
        // process the batch of big objects and associate them to Accounts
        Map<Id, Big_Object__b> accountIdToBigObjectMap = new Map<Id, Big_Object__b>();
        for (Big_Object__b bigObject : bos) {
            accountIdToBigObjectMap.put(bigObject.Account__c, bigObject);
            key = bigObject.Big_Object_Primariy_Key__c
        }
        Map<Id, Account> accountMap = new Map<Id, Account>(
            [SELECT Id, Name, ... FROM Account WHERE Id IN :accountIdToBigObjectMap.keySet()]
        );
        for (Id accountId : accountMap.keySet()) {
            Big_Object__b bigObject = accountIdToBigObjectMap.get(accountId);
            Account account = accountMap.get(accountId);
            // perform any actions that integrate the big object and Account
        }
    }
    public void finish(Database.BatchableContext bc){
        // You can daisy chain additional calls using the primary key of the big object to get around the 50k governor limit
        QueryBigObjectAndContact nextBatch = new QueryBigObjectAndContact(key);
        Database.executeBatch(nextBatch);
    }
}

现场审计跟踪

此示例演示如何在 CSV 中查询和分析大量结果 格式。FieldHistoryArchive

例 URI

/services/data/vXX.X/jobs/query

例 发布请求

{
    "operation": "query",
    "query": "SELECT ParentId, FieldHistoryType, Field, Id, NewValue, OldValueFROM FieldHistoryArchive WHERE FieldHistoryType = ‘Account’ AND CreatedDate > LAST_MONTH"
}

使用“获取查询作业的结果”资源。

示例 CURL 请求

curl --include --request GET \
--header "Authorization: Bearer token" \
--header "Accept: text/csv" \
https://instance.salesforce.com/services/data/vXX.X/jobs/query/750R0000000zxr8IAA/results ?maxRecords=50000

这 请求结果以 CSV 文件的形式提供,可用于检查以进行审核。

实时事件监控

通过实时事件监控,您可以跟踪谁在访问机密和 Salesforce 组织中的敏感数据。您可以查看有关个人的信息 事件或跟踪事件趋势,以快速识别异常行为并采取保护措施 贵公司的数据。这些功能对于遵守法规和 审计要求。

借助实时事件,您可以监控通过 API 调用访问的数据、报告 执行和列表视图。对应的事件对象称为 ApiEvent, ReportEvent 和 ListViewEvent。查询这些事件涵盖了许多常见方案 因为超过 50% 的 SOQL 查询是使用 SOAP、REST 或批量 API 进行的。钥匙 有关每个查询的信息,例如用户名、用户 ID、处理的行、 查询的实体和源 IP 地址存储在事件对象中。你 然后,可以对事件对象运行 SOQL 查询以发现用户活动详细信息。

有关详细信息,请参阅实时事件 监控。此示例演示如何使用字段的 内容。

public class EventMatchesObject implements Database.Batchable<sObject> {
    private String lastEventDate;

    public EventMatchesObject(String lastEventDateParam) {
        lastEventDate = lastEventDateParam;
    }

    public Iterable<SObject> start(Database.BatchableContext bc) {
        return [SELECT EventDate, EventIdentifier, QueriedEntities, SourceIp, Username, UserAgent FROM ApiEvent WHERE EventDate > lastEventDate LIMIT 50000]
    }

    public void execute(Database.BatchableContext bc, List<ApiEvent> events){
        // Process this list of entities if a certain attribute matches
        for (ApiEvent event: events) {
            String objectString = 'Patent__c';
            String eventIdentifier = event.EventIdentifier;
            if (eventIdentifier.contains(objectString) {
                // Perform actions on the event that contains 'Patent__c'
            }
            lastEventDate = format(event.EventDate);
        }
    }

    public void finish(Database.BatchableContext bc){         
        // You can daisy chain additional calls using EventDate or other filter fields to get around the 50k governor limit
        EventMatchesObject nextBatch = new EventMatchesObject(lastEventDate);
        Database.executeBatch(nextBatch);
    }
}

聚合查询

此示例显示了聚合的替代方法 查询与该方法类似。

COUNT()

public class CountBigObjects implements Database.Batchable<sObject> {
    private Integer recordsCounted;
    private String key;

	public CountBigObjects(Integer recordsCountedParam, String keyParam) {
        recordsCounted = recordsCountedParam
        key = keyParam
    } 

    public Iterable<SObject> start(Database.BatchableContext bc) {
        return [SELECT Custom_Field__c FROM Big_Object__b LIMIT 25000]
    }

    public void execute(Database.BatchableContext bc, List<Big_Object__b> bos){
        // process the batch of big objects and associate them to Accounts
        Map<Id, Big_Object__b> accountIdToBigObjectMap = new Map<Id, Big_Object__b>();
        for (Big_Object__b bigObject : bos) {
            accountIdToBigObjectMap.put(bigObject.Account__c, bigObject);
        }
        Map<Id, Account> accountMap = new Map<Id, Account>(
            [SELECT Id, Name, ... FROM Account WHERE Id IN :accountIdToBigObjectMap.keySet()]
        );
        for (Id accountId : accountMap.keySet()) {
            Big_Object__b bigObject = accountIdToBigObjectMap.get(accountId);
            Account account = accountMap.get(accountId);
            // perform any actions that integrate the big object and Account
        }
    }

    public void finish(Database.BatchableContext bc) {         
        // You can daisy chain additional calls using the primary key of the big object to get around the 50k governor limit
        CountBigObjects nextBatch = new CountBigObjects(recordsCounted, key);
        Database.executeBatch(nextBatch);
    }
}

在报告和仪表板中查看大对象数据

在处理大数据和数十亿条记录时,构建报告是不切实际的 或直接从该数据创建仪表板。请改用批量 API 编写一个查询,该查询提取 您感兴趣的较小、具有代表性的数据子集。您可以将其存储为 数据集,并在报告、仪表板或任何其他 Lightning Platform 中使用它 特征。

  1. 确定包含需要报告的数据的大对象。在这个 例如,Ride__b Big 对象包含完整的数据集。
  2. 创建自定义对象。此对象包含大对象数据的工作数据集,该数据集 你想报告。在此示例中,我们使用 Bike_Rental__c 自定义 对象。
    1. 在自定义对象的“可选功能”下,单击“允许” 报告
    2. 将自定义字段添加到对象中,使其与要从 大对象。
  3. 创建一个 SOQL 查询,该查询通过从大 对象添加到自定义对象中。提示确保您的工作数据集始终是最新的,以确保准确 报告时,将此作业设置为每晚运行。
  4. 使用您创建的工作数据集生成报表。
    1. 在“设置”中,在“快速查找”框中输入报告类型”,然后选择“报告类型”。
    2. 创建自定义报告类型。
    3. 对于主对象,从步骤 2 Bike_Rental__c中选择自定义对象。
    4. 将报表设置为“已部署”。
    5. 运行报表。

现在,您不仅可以在报表中使用工作数据集中的信息,还可以在报表中使用工作数据集中的信息。 也存在于仪表板或任何其他 Lightning Platform 功能中。

具有大对象的 SOQL

您可以通过以下方式查询大对象索引中的字段 使用标准 SOQL 命令的子集。

构建索引查询,从索引中定义的第一个字段开始,而不 查询中第一个字段和最后一个字段之间的间隙。您可以使用或在任何 字段,但只能使用一次。可以使用范围运算 、 、 或仅对查询的最后一个字段使用。=ININ<><=>=

提示

当您将子句与 只有一个参数,例如 ,它等价于 使用 ,例如 。 为清楚起见,我们建议您使用 这种情况。INFirstName IN(‘Charlie’)=FirstName=’Charlie’=不支持子查询。不要在你的 查询。例如,不支持此查询

Select CreatedById, CreatedDate, Created_Date__c, Id, Legacy_Record_ID__c, Parent_Case__c, SystemModstamp, Text_Body__c FROM Archived_Email_Message__b WHERE Parent_Case__c IN(select id from case where owner.id in ('00580000008BBVUAA4'))

您可以在查询中包含系统字段 、 和 。CreatedByIdCreatedDateSystemModstamp

若要保证查询结果的顺序,请使用子句。ORDER BY

这些查询假定您有一个表,其中的索引由 、 和 定义。LastName__cFirstName__cPhoneNumber__c

此查询指定索引中的所有三个字段。在这种情况下,筛选器可以使用范围 算子。PhoneNumber__c

SELECT LastName__c, FirstName__c, PhoneNumber__c
FROM Phone_Book__b
WHERE LastName__c='Kelly' AND FirstName__c='Charlie' AND PhoneNumber__c='2155555555'

此查询仅指定索引中的前两个字段。在本例中, 筛选器可以使用范围 算子。FirstName__c

SELECT LastName__c, FirstName__c, PhoneNumber__c
FROM Phone_Book__b
WHERE LastName__c='Kelly' AND FirstName__c='Charlie'

此查询仅指定索引中的第一个字段。筛选器可以使用范围运算符。LastName__c

SELECT LastName__c, FirstName__c, PhoneNumber__c
FROM Phone_Book__b
WHERE LastName__c='Kelly'

此查询使用第一个上的运算符 字段。IN

SELECT LastName__c, FirstName__c, PhoneNumber__c
FROM Phone_Book__b
WHERE LastName__c IN ('Kelly','Jones','Capulet','Montague') AND FirstName__c='Charlie'

此查询不起作用,因为查询中存在缺口。FirstName__c

SELECT LastName__c, FirstName__c, PhoneNumber__c
FROM Phone_Book__b
WHERE LastName__c='Kelly' AND PhoneNumber__c='2155555555'

此查询也不起作用,因为它使用运算符 两次。

IN

SELECT LastName__c, FirstName__c, PhoneNumber__c
FROM Phone_Book__b
WHERE LastName__c IN ('Kelly','Jones') AND FirstName__c IN ('Charlie','Lisa')

此查询有效,即使它在子句中似乎有两个运算符。 但因为第二个只有一个 参数,它等效于等于运算符,所以它是允许的。INWHEREIN

SELECT LastName__c, FirstName__c, PhoneNumber__c
FROM Phone_Book__b
WHERE LastName__c IN ('Kelly','Jones') AND FirstName__c IN ('Charlie')

为清楚起见,我们建议您重写前面的 SOQL 语句,如下所示。

SELECT LastName__c, FirstName__c, PhoneNumber__c
FROM Phone_Book__b
WHERE LastName__c IN ('Kelly','Jones') AND FirstName__c='Charlie'

不允许对大型对象执行 SOQL 操作

  • 生成索引查询时,不要在第一个和最后一个之间留出间隙 字段。
  • 运算符 、 、 和 在任何查询中都无效。!=LIKENOT INEXCLUDESINCLUDES
  • 聚合函数在任何查询中都无效。
  • 若要检索结果列表,请不要在查询中使用该字段。包含在查询中仅返回具有空 ID 的结果 (00000000000000000 或 00000000000000AAA)。IdId注意当您使用开发人员控制台执行以下操作时 从资源生成查询,该字段将自动包含在内。查询大对象 Developer Console,从 生成的查询。IdId

另见

API 生命周期终止政策

查看哪些 REST API 版本受支持、不受支持或不可用。

Salesforce 承诺支持每个 API 版本至少 3 个 自首次发布之日起的年。为了提高质量和性能 API,有时不再支持超过 3 年的版本。

Salesforce 通知使用计划的 API 版本的客户 为 折旧 至少 1 年后,对版本的支持将结束。

Salesforce API 版本版本支持状态版本停用信息
版本 31.0 至 59.0支持。
版本 21.0 至 30.0截至 22 年夏季,这些版本已被弃用,并且没有 Salesforce 支持的时间更长。从 25 年夏季开始,这些 版本将停用且不可用。Salesforce Platform API 版本 21.0 到 30.0 停用
版本 7.0 至 20.0自 22 年夏季起,这些版本已停用,并且 不能利用的。Salesforce Platform API 版本 7.0 到 20.0 停用

如果你 请求任何资源或使用已停用的 API 版本 REST API 中的操作 返回错误代码。410:GONE

识别 从旧的或不受支持的 API 版本发出的请求,请使用 API 总使用量事件类型。

具有大量数据的部署的最佳实践

谁应该阅读此文

本文适用于使用 Salesforce 部署的经验丰富的应用程序架构师,这些部署具有以下特点: 包含大量数据。

“大数据量”是一个不精确的弹性术语。如果您的部署有数十个 数千个用户、数千万条记录或数百 GB 的总记录 存储,您拥有大量数据。即使使用较小的部署,您仍然可以 从这些最佳实践中学习一些东西。

要了解本文中涉及 Salesforce 实施细节的部分, 阅读 https://developer.salesforce.com/page/Multi_Tenant_Architecture

概述

Salesforce 使客户能够轻松地将其应用程序从小批量扩展到大量 的数据。这种缩放通常是自动发生的,但随着数据集变大,时间 某些操作所需的增长。架构师设计和配置数据的方式 结构和操作可以将这些操作时间增加或减少几个数量级 大小。受不同体系结构和配置影响的主要进程包括:

  • 直接或集成加载或更新大量记录
  • 通过报告和查询或视图提取数据

优化这些主要流程的策略包括:

  • 遵循行业标准做法,以适应 启用数据库的应用程序
  • 延迟或绕过业务规则和共享处理
  • 选择最有效的操作来完成任务

本文内容

  • 提高具有大量数据的应用程序性能的技术
  • 影响绩效的 Salesforce 机制和实施不太明显 方式
  • Salesforce 机制,旨在支持具有大数据的系统的性能 卷

Salesforce 大对象

Salesforce 提供称为 Big Objects 的大数据技术。一个大对象存储和管理 Salesforce 平台上的大量数据。您可以存档来自其他对象的数据,或者 将来自外部系统的大量数据集整合到一个大对象中,以全面了解您的 客户。一个大对象提供一致的性能,无论您有 100 万条记录,还是 100 条记录 百万,甚至10亿。这种比例赋予了大物体力量并定义了它 特征。

本文重点介绍如何优化存储在标准和自定义对象中的大量数据,而不是 大物体。实现最佳性能和可持续的长期存储解决方案,甚至 较大的数据集,请使用 Bulk API 或 Batch Apex 将数据移动到大型对象中。

基本概念

本部分概述了两个关键概念:多租户和搜索 架构,以解释 Salesforce 如何:

  • 将其应用程序提供给客户的实例和组织
  • 保持受支持的自定义安全、独立和高 执行
  • 跟踪和存储应用程序数据
  • 为该数据编制索引以优化搜索
  • 多租户和元数据概述
  • 搜索体系结构

多租户和元数据概述

多租户是提供单个应用程序的一种方式 到多个组织,例如不同的公司或部门 在公司内部,来自单个软硬件堆栈。而不是 为每个提供一整套硬件和软件资源 组织,Salesforce 在单个实例和每个实例之间插入一层软件 组织的部署。这一层对组织是不可见的, 它们只能看到自己的数据和架构,而 Salesforce 会在后台重新组织数据以执行高效的操作。

多租户要求应用程序能够可靠地运行,即使在 架构师正在进行 Salesforce 支持的自定义,其中包括创建自定义数据对象、 更改接口,并定义业务规则。为确保 特定于租户的自定义不会破坏其他自定义项的安全性 租户或影响其性能,Salesforce 使用运行时引擎从 这些自定义。通过保持架构之间的边界 Salesforce 保护每个租户的数据和操作的完整性。

当组织创建自定义对象时,平台会跟踪元数据 关于对象及其字段、关系和其他对象 定义特征。Salesforce 将所有虚拟表的应用程序数据存储在几个大型表中 数据库表,按租户分区并用作堆 存储。然后,平台的引擎将虚拟表具体化 运行时的数据,通过考虑相应的元数据。

而不是试图管理一个庞大的、不断变化的实际 每个应用程序和租户、平台的数据库结构 存储模型使用一组元数据管理虚拟数据库结构, 数据和数据透视表。因此,如果应用传统的性能调优 基于组织的数据和架构的技术,您可以 可能无法看到您对实际基础数据的预期影响 结构。

注意

作为客户,您也无法优化 SQL 底层 许多应用程序操作,因为它是由系统生成的, 不是由每个租户编写的。

搜索体系结构

搜索是基于自由格式文本查询记录的功能。Salesforce 搜索架构是 基于其自己的数据存储,该数据存储针对搜索该文本进行了优化。Salesforce 提供搜索 在应用的许多领域具有功能,包括:

  • 侧边栏
  • 高级搜索和全局搜索
  • 查找框和查找字段
  • 建议的解决方案和知识库
  • Web-to-Lead 和 Web-to-Case
  • 重复的潜在客户处理
  • 适用于 Apex 和 API 的 Salesforce 对象搜索语言 (SOSL)

对于要搜索的数据,必须首先对其进行索引。索引是使用搜索创建的 索引服务器,这些服务器还会生成和异步处理新 创建或修改的数据。创建或更新可搜索对象的记录后,它会 更新后的文本可能需要大约 15 分钟或更长时间才能变得可搜索。

Salesforce 执行索引 首先在索引中搜索适当的记录,然后缩小范围 基于访问权限、搜索限制和其他过滤器的结果。此过程将创建 结果集,通常包含最相关的结果。结果出来后 集合达到预定大小,剩余的记录将被丢弃。结果集是 然后用于从数据库中查询记录以检索用户 看到。

提示

也可以使用 SOSL 访问搜索,而 SOSL 又可以 使用 API 或 Apex 调用。

适用于大型系统的基础架构 数据卷

本节概述:

  • 直接支持性能的 Salesforce 组件和功能 具有大量数据的系统
  • Salesforce 使用这些组件和功能的情况
  • 最大限度地利用 Salesforce 基础架构的优势的方法
  • Lightning Platform 查询优化器 Salesforce 多租户架构使用底层数据库的方式使得数据库系统的优化器
    无法有效优化搜索查询。Lightning Platform 查询优化器通过在 Salesforce 中提供高效的数据访问来帮助数据库的优化器生成有效的查询。
  • 数据库统计
  • 瘦表
  • 索引
  • 部门

Lightning Platform 查询优化器

Salesforce 多租户架构使用底层数据库的方式是: 数据库系统的优化器无法有效地优化搜索查询。

Lightning Platform 查询优化器帮助数据库的优化器 通过在 Salesforce 中提供高效的数据访问来生成有效的查询。

重要

在可能的情况下,我们更改了非包容性条款,以符合我们的 平等的公司价值观。我们保留了某些条款,以避免对 客户实施。

Lightning Platform 查询优化器适用于自动生成的查询,这些查询可处理 报表、列表视图和 SOQL 查询。优化器还处理依赖于 这些生成的查询。具体来说,优化器:

  • 如果可能,根据 查询
  • 确定从中驱动查询的最佳表(如果没有可用的良好索引)
  • 确定如何对剩余表进行排序以最大程度地降低成本
  • 注入创建高效联接所需的自定义外键值表 路径
  • 影响剩余联接(包括共享联接)的执行计划,以最大程度地减少 数据库输入和输出 (I/O)
  • 更新统计信息

创建高效查询

当您处理大量数据时,构建高效的 SOQL 非常重要 查询、报表和列表视图,它们都依赖于选择性和索引。闪电 平台查询优化器确定 SOQL 查询、报告或 列表视图。通过一些简单的 SOQL 查询,您可以轻松地获得必要的统计信息 确定特定筛选条件是否具有选择性。为选择性字段编制索引后, 具有相关筛选条件的查询可以更高效地执行,并且您的用户可以 更高效。

查看以下测量过滤器选择性的实际注意事项 条件。

确定过滤条件的选择性

为了更好地理解选择性,让我们举个例子。生成 SOQL 查询、报表或 Opportunity 对象的列表视图,该对象是组织中最大的对象之一。你有一个过滤器 条件,例如,仅获取 要从对象获取的行。您的过滤条件是否有足够的选择性,以便优化程序能够 使用可用的索引?WHERE

通过简单的 SOQL 查询,您可以快速获取统计信息,帮助您确定是否 给定字段中的值是选择性的。

使用 SOQL 确定筛选条件的选择性

考虑使用基本一元子句的查询 条件。WHERE

SELECT Id, Name FROM Opportunity
WHERE Stagename = 'Closed Won'

使用您选择的查询工具(例如开发人员控制台查询编辑器),执行 以下查询用于获取与筛选条件的选择性相关的一些统计信息。这 以下是 Stagename 字段的示例查询:

SELECT Stagename, COUNT(id) FROM Opportunity
GROUP BY ROLLUP (Stagename)

结果集显示 Stagename 选择列表字段的每个值的记录分布情况,包括 对象。现在,您拥有了确定过滤器选择性所需的统计数据 涉及 Stagename 字段的条件。

确定更复杂过滤条件的选择性

在类似于上一个查询的查询中使用 示例可以很容易地获得必要的统计数据来评估各种 条件。GROUP BY ROLLUP

下面是具有更复杂筛选条件的查询示例。此查询使用日期 字段 (CloseDate) 以及运算符:AND

SELECT Id, Name FROM Opportunity
WHERE Stagename = 'Closed Won'
AND CloseDate = THIS_WEEK

您已经知道上一个 Stagename 字段的统计信息 查询。获取 CloseDate 字段的相同统计信息(按周分组) 对于每一年,请使用以下查询。

SELECT WEEK_IN_YEAR(CloseDate), CALENDAR_YEAR(CloseDate), COUNT(id)
FROM Opportunity
GROUP BY ROLLUP(WEEK_IN_YEAR(CloseDate),CALENDAR_YEAR(CloseDate))
ORDER BY CALENDAR_YEAR(CloseDate), WEEK_IN_YEAR(CloseDate)

该查询返回有关每周 Opportunity 记录分布的统计信息 每年的 CloseDate。

对于组合了两个或多个条件的过滤条件 (using ),查询优化器在 筛选目标小于:AND

  • 每个过滤器的选择性阈值是两倍
  • 这些字段相交的选择性阈值

对于本主题中的第三个示例,这意味着:

  • Status = ‘Closed Won’是选择性的(49,899 < 150,000)
  • CloseDate = THIS_WEEK是选择性的(~3000 < 150,000)

总体而言,由于这两个原因,过滤条件是选择性的。

如果其中一个筛选条件是非选择性的,例如,对应于 250,000 条记录,则两种可能性可以使 整体过滤条件选择性。Status=’Closed Won’

  • 每个筛选条件对应于少于 300,000 条记录(选择性是 每个过滤器的阈值)
  • 的交集小于 150,000 条记录。Status=’Closed Won’ AND CloseDate = THIS_WEEK

示例中的筛选条件小于 300,000 条记录,因此总体条件为 选择性。

提示

与操作员一起,每个过滤器必须满足 阈值。OR

了解已删除记录对选择性的影响

收集选择性统计信息时,可以使用 布尔字段 IsDeleted。此字段在每个标准和 自定义对象。

使用该函数收集的上一个查询 所有 Opportunity 记录的数据。IsDeleted 是还是 .自 收集 Opportunity.StageName 的选择性统计信息,并显式收集 排除已删除的记录,请尝试以下查询。ROLLUPtruefalse

SELECT Stagename, COUNT(id) FROM Opportunity WHERE IsDeleted=false GROUP BY Stagename

确保字段具有索引

在将查询、报表或列表视图投入生产之前,请确认给定的筛选器 条件是选择性的。但是,使条件具有选择性的字段必须具有索引 要有效。如果没有必要的索引,查询优化器必须执行完全扫描以 获取目标行。该索引有助于提高查询的执行速度,并改进 组织用户的工作效率。

Database Query & Search Optimization 备忘单列出了默认具有索引的标准字段,包括 Id、Name、OwnerId、CreatedDate、SystemModstamp 和 RecordType,以及所有 主从和查找字段。

如果您的筛选条件涉及自定义字段,请与客户支持部门合作,创建一个 筛选器使用的字段的自定义索引。并非所有字段都可以有索引,例如 非确定性公式字段。

数据库统计

现代数据库收集有关存储在其中的数据的数量和类型的统计信息,以及 他们使用此信息来有效地执行查询。由于 Salesforce 的多租户 在软件架构上,平台必须保留自己的一套统计信息 帮助数据库了解访问数据的最佳方式。因此,当大量 使用 API 创建、更新或删除的数据时,数据库必须收集统计信息 在应用程序可以有效地访问数据之前。目前,此统计收集过程 每晚运行。

瘦表

Salesforce 可以创建瘦表来包含常用字段,并 避免联接。这可以提高某些只读操作的性能。瘦桌子 在修改源表时,与源表保持同步。

如果要使用瘦表,请联系 Salesforce 客户支持。启用后,瘦 在适当的情况下自动创建和使用表。您无法创建、访问或 自行修改瘦表。如果要优化报表、列表视图或查询 更改(例如,要添加新字段),您需要联系 Salesforce 以更新您的瘦身 表定义。

瘦表如何提高性能

对于您可见的每个对象表,Salesforce 会在 标准字段和自定义字段的数据库级别。这种分离,是看不见的 当查询包含这两种字段时,客户通常需要联接。一个瘦弱的 表包含这两种类型的字段,并且还省略了软删除的记录。此表显示 Account 视图、相应的数据库表和 可以加快帐户查询速度。

仅引用瘦表中的字段的只读操作不需要额外的 加入,因此可以表现得更好。瘦表对表最有用 包含数百万条记录,以提高只读操作的性能,例如 报告。

重要

瘦桌子不是挥舞性能的魔杖 问题。维护保存实时数据副本的单独表会产生开销。 在不适当的上下文中使用它们可能会导致性能下降,而不是 起色。

可以在自定义对象上创建瘦表,也可以在 Account、Contact、Opportunity、Lead、 和 Case 对象。它们可以增强报表、列表视图和 SOQL 的性能。瘦表可以包含以下类型的字段。

  • 复选框
  • 日期
  • 日期和时间
  • 电子邮件
  • 百分之
  • 电话
  • 选择列表(多选)
  • 发短信
  • 文本区域
  • 文本区域(长)
  • 网址

瘦表和瘦索引也可以包含加密数据。

下面是一个示例,说明瘦表如何加快查询速度。而不是使用日期范围 喜欢 – 这需要 创建年度或年初至今报告的昂贵重复计算 – 您可以 使用瘦表包含 Year 字段并筛选 。01/01/1112/31/11Year = '2011'

考虑

  • 瘦表最多可以包含 100 列。
  • 瘦表不能包含来自其他对象的字段。
  • 对于完整沙盒:瘦表将复制到完整沙盒组织。对于其他 沙盒类型:瘦表不会复制到您的沙盒组织。要有 为完整沙箱以外的沙盒类型激活的生产瘦表,请联系 Salesforce 客户支持。

索引

重要

在可能的情况下,我们更改了非包容性条款,以符合我们的 平等的公司价值观。我们保留了某些条款,以避免对 客户实施。Salesforce 支持自定义索引以加快查询速度,您可以通过以下方式创建自定义索引 联系 Salesforce 客户支持。

注意

Salesforce Customer 的自定义索引 在生产环境中创建的支持将复制到您创建的所有沙盒中 从该生产环境。对于大多数对象,平台在以下字段上维护索引。

  • RecordTypeId
  • 划分
  • 创建日期
  • Systemmodstamp (LastModifiedDate))
  • 名字
  • 电子邮件(用于联系人和潜在客户)
  • 外键关系(查找和大纲-细节)
  • 唯一的 Salesforce 记录 ID,它是每个对象的主键

Salesforce 还支持自定义字段的自定义索引,但多选选择列表、文本除外 区域(长)、文本区域(丰富)、非确定性公式字段和加密文本 领域。

外部 ID 会导致在该字段上创建索引。然后查询优化器 考虑这些字段。您只能在以下字段上创建外部 ID。

  • 自动编号
  • 电子邮件
  • 发短信

要为其他字段类型(包括标准字段)创建自定义索引,请联系 Salesforce 客户支持。

索引表

Salesforce 多租户架构为自定义字段制作基础数据表 不适合索引。为了克服此限制,平台创建了一个索引表 包含数据副本以及有关数据类型的信息。

平台在此索引表上构建标准数据库索引。索引表将上 对索引搜索可以有效返回的记录数的限制。

默认情况下,索引表不包括 null 记录(具有空值的记录)。你 可以与 Salesforce 客户支持合作,创建包含空行的自定义索引。 即使自定义字段上已有自定义索引,也必须显式启用 并重新生成它们以对空值行进行索引。

标准 和自定义索引字段

查询优化器维护一个表,其中包含有关 每个索引中的数据。它使用此表执行预查询,以确定是否使用 index 可以加快查询速度。

为 例如,假设 Account 对象有一个名为 Account_Type 的字段,该字段可以采用值 、 或 ,并且 字段具有自定义索引。LargeMediumSmall

例如,Salesforce 会生成如下查询:

SELECT *
FROM Account
WHERE Account_Type__c = 'Large'

查询优化器对其内部统计信息表执行预查询,以确定数字 在Account_Type字段中的记录。如果此数字超过对象的 10% 总记录数或 333,333 条记录,则查询不使用自定义索引。Large

查询优化器确定索引的用途。标准索引字段如果筛选器匹配的前 100 万条记录少于 30%,并且匹配的 附加记录,最多 100 万条记录。

例如,标准 在以下情况下使用索引:

  • 对包含 200 万条记录的表执行查询,并且筛选器匹配 450,000 条或更少的记录。
  • 对包含 500 万条记录的表执行查询,并且筛选器匹配 900,000 条或更少的记录。

自定义索引字段如果筛选器匹配的记录少于总数的 10%,则使用,最多 333,333 记录。例如,在以下情况下使用自定义索引:

  • 对包含 500,000 条记录的表执行查询,并且筛选器匹配 50,000 条或更少的记录。
  • 对包含 500 万条记录的表执行查询,筛选器 匹配 333,333 条或更少的记录。

如果不满足索引字段的条件,则只会从查询中排除该索引。如果 它们在子句中并满足以下阈值 记录,有时会使用其他索引。WHERE

查询优化器使用类似的注意事项来确定是否使用索引 当子句包含 、 或 .WHEREANDORLIKE

  • 对于 ,查询优化器使用索引 除非其中一个返回对象记录的 20% 以上或总共 666,666 个 记录。AND
  • 对于 ,查询优化器使用索引,除非 它们都返回超过 10% 的对象记录,即总共 333,333 条记录 记录。OR注意子句中的所有字段必须是 为要使用的任何索引编制索引。OR
  • 对于 ,查询优化器不使用其内部 统计表。相反,它会对多达 100,000 条实际数据记录进行采样来决定 是否使用自定义索引。LIKE

可以在确定性公式字段上创建自定义索引。因为有些值会随时间而变化 或者当交易更新相关实体时发生更改,平台无法索引 非确定性公式。

以下是示例 使公式字段具有不确定性的事物。非确定性公式字段可以:

  • 引用其他实体(如可通过查找字段访问的字段)
  • 包括跨其他实体的其他公式字段
  • 使用动态日期和时间函数(例如,和TODAYNOW)

这些公式字段也被视为非确定性字段

  • 所有者、自动编号、部门或审核字段(CreatedDate 和 CreatedByID 字段除外)
    • 对 Lightning Platform 无法索引的字段的引用
    • 多选选择列表
    • 多币种组织中的货币字段
    • 长文本区域字段
    • 二进制字段(blob、文件或加密文本)
  • 具有特殊功能的标准字段
    • 商机:Amount、TotalOpportunityQuantity、ExpectedRevenue、IsClosed、IsWon
    • 案例:ClosedDate、IsClosed
    • 产品:ProductFamily、IsActive、IsArchived
    • 解决方案:状态
    • 线索:状态
    • 活动:Subject、TaskStatus、TaskPriority

注意

如果在创建索引后修改了公式,则会重新生成索引。如果使用跨对象表示法指定,则通常使用跨对象索引,因为它们是 在下文中 例。

SELECT Id
FROM Score__c
WHERE CrossObject1__r.CrossObject2__r.IndexedField__c

您可以使用此方法替换无法自定义索引的公式字段,因为它们 引用其他对象。只要对引用的字段进行索引,跨对象 表示法可以有多个级别。

两列自定义索引

两列自定义索引是 Salesforce 平台的一项特殊功能。它们很有用 对于列表视图以及要使用一个字段选择要显示的记录的情况 和另一个字段对它们进行排序。例如,选择依据和排序依据的“帐户”列表视图可以 在第一列和第二列中使用两列索引。StateCityStateCity当两个字段的组合是查询字符串中的常见筛选器时,两列索引 通常可帮助您对记录进行排序和显示。例如,对于以下 SOQL,其中 出现在伪代码中,两列索引 on 比单索引 on 更有效。

f1__c,f2__cf1__c and f2__c

SELECT Name
FROM Account
WHERE f1__c = 'foo'
     AND f2__c = 'bar'

注意

两列索引与单列索引受到相同的限制,一个 例外。两列索引的第二列中可以有 null,而单列索引可以有 null 值 索引不能,除非 Salesforce 客户支持明确启用该选项以包含 null 值。

区域

划分是对大型数据进行分区的一种手段 部署以减少查询返回的记录数,以及 报告。例如,具有许多客户记录的部署可能 创建名为 、 的部门,并将客户分成更小的组,这些组可能 几乎没有相互关系。USEMEAAPAC

Salesforce 为按部门划分数据提供了特殊支持,这 您可以通过联系 Salesforce 客户来启用 支持。

优化性能的技术

本节概述:

  • 优化 Salesforce 性能的技术
  • 作为基础的安排、特点、机制和选项 这些技术
  • 您应该使用这些技术和定制的情况 他们满足您的需求
  • 使用 Mashup
  • 延迟共享计算
  • 使用 SOQL 和 SOSL
  • 删除数据
  • 搜索

使用 Mashup

减少 Salesforce 中数据量的一种方法是在 其他应用程序,然后根据需要将该应用程序提供给 Salesforce。Salesforce将这样的安排称为 Mashup,因为它提供了两个应用程序的快速、松散耦合的集成。 Mashup 使用 Salesforce 演示文稿来 显示 Salesforce 托管的数据和 外部托管的数据。Salesforce 支持以下功能 Mashup 设计。外部网站Salesforce UI 显示 外部网站,并向其传递信息和请求。通过这种设计,您可以制作 该网站看起来像 Salesforce UI 的一部分。标注Apex 代码允许 Salesforce 使用 用于与外部系统实时交换信息的 Web 服务。

由于其实时性限制,mashup 仅限于短交互和小 数据量。

请参阅 Apex 开发人员指南。

使用混搭的优点

  • 数据永远不会过时。
  • 无需开发专有方法来集成这两个系统。

使用混搭的缺点

  • 访问数据需要更多时间。
  • 功能减少。例如,报告和工作流在外部不起作用 数据。

延迟共享计算

在某些情况下,使用某项功能可能是合适的 称为延迟共享计算,允许用户延迟 在新用户、规则和 其他内容已加载。

组织的管理员可以使用延迟共享 暂停和恢复共享计算的计算权限, 并管理两个流程:组成员资格计算和共享 规则计算。管理员可以暂停这些计算 执行大量配置更改时,可能会 导致非常长的共享规则评估或超时,并恢复 组织维护期间的计算。这 延时可以帮助用户处理大量与共享相关的内容 配置在工作时间内快速更改,然后让 重新计算过程在工作日之间或更长时间内运行一夜之间 一个周末。

使用 SOQL 和 SOSL

SOQL 查询等同于 SQL 语句和 SOSL 查询 是执行基于文本的搜索的编程方式。SELECT

索克尔SOSL公司
执行方式数据库搜索索引
使用query()search()

在以下情况下使用 SOQL:

  • 您知道数据驻留在哪些对象或字段中。
  • 您希望:
    • 从单个对象或多个对象中检索数据 彼此相关
    • 计算符合指定条件的记录数
    • 在查询过程中对结果进行排序
    • 从数字、日期或复选框字段中检索数据

在以下情况下使用 SOSL:

  • 您不知道数据驻留在哪个对象或字段中, 您希望以最有效的方式找到它。
  • 您希望:
    • 高效检索多个对象和字段,以及这些对象 可能彼此相关,也可能不相关
    • 使用以下方法检索组织中特定部门的数据 部门功能,您希望在最有效的位置找到它 可能的方式

使用 SOQL 或 SOSL 时,请考虑以下事项。

  • SOQL 筛选器和 SOSL 搜索查询都可以指定 您应该寻找的文本。当给定的搜索可以使用任何一种语言时,如果搜索表达式 使用术语。WHERECONTAINS
  • SOSL公司 可以标记一个字段中的多个术语(例如,以 spaces),并在此基础上构建搜索索引。如果您正在搜索特定的非 您知道某个字段中存在的术语,您可能会发现 SOSL 在这些搜索中比 SOQL 更快。为 例如,如果出现以下情况,则可以使用 SOSL 您正在针对包含“Paul 和 John”等值的字段搜索“John” 公司”。
  • 在某些情况下,当 SOQL 中使用多个筛选器时,即使可以对子句中的字段进行索引,也无法使用索引。在这种情况下,将单个查询分解为多个查询,每个查询都应有一个筛选器,然后 合并结果。WHEREWHEREWHERE
  • 使用具有选择列表或外键字段的 null 值的筛选器执行查询不会使用索引,应避免使用索引。WHERE为 示例,以下客户查询执行 不好。
SELECT Contact__c, Max_Score__c, CategoryName__c, Category__Team_Name__c
FROM Interest__c
WHERE Contact__c != null
    AND Contact__c IN :contacts
    AND override__c != 0
    AND (
            (override__c != null AND override__c > 0)
            OR
            (score__c != null AND score__c > 0)
        )
    AND Category__c != null
    AND (
            (Category_Team_IsActive__c = true OR CategoryName__c IN :selectvalues)
            AND
            (
                Category_Team_Name__c != null
                AND
                Category_Team_Name__c IN :selectTeamValues
            )
        )

(项目 前面有冒号,例如 ,是 Apex 变量。请参阅使用 Apex 《Apex 开发人员指南》中的 SOQL 和 SOSL 查询中的变量。 在标准中阻止了索引的使用,并且一些 这些条件是多余的,导致执行时间增加。设计数据模型,使其不依赖于有效字段 值。

:contactsNullsnulls

可以重写查询 如:

SELECT Contact__c, Max_Score__c, CategoryName__c, Category_Team_Name__c
FROM Interest__c
WHERE Contact__c IN :contacts
    AND (override__c > 0 OR score__c > 0)
    AND Category__c != 'Default'
    AND (
            (Category_Team_IsActive__c = true OR CategoryName__c IN :selectvalues)
            AND
            Category_Team_Name__c IN :selectTeamValues
        )

为 字段 Category__c,该值被替换为 ,允许索引为 用于该字段。DefaultNULL

再举一个例子,如果动态值用于 WHERE 字段,并且可以传入 null 值,则不要让查询 运行以确定没有记录;相反,如果可能,请检查 null 值并避免查询。按帐户的外键帐号检索帐户的查询可能如下所示 this(在伪代码中)。

SELECT Name
   FROM Account
   WHERE Account_ID___c = :acctid;

if (rows found == 0) return "Not Found"

如果 acctid 为 ,则逐行扫描整个 Account 表,直到检查所有数据。null最好重写 代码 如:

if (acctid != null) {
   SELECT Name
      FROM Account
      WHERE Account_Id___c = :acctid
}
else {
    return "Not Found"
}
  • 在设计自定义查询搜索用户界面时,它是 重要的是:
    • 将要搜索或查询的字段数保持在最低限度。使用许多字段会导致许多排列,这可能很难调整。
    • 确定 SOQL、SOSL 或两者的组合是否适合搜索。

删除数据

Salesforce 数据删除机制可以对大型 数据量。Salesforce 使用回收站隐喻用户删除的数据。相反 删除数据时,Salesforce 会将数据标记为已删除,并通过 回收站。此过程称为软删除。当数据被软删除时,它 仍然会影响数据库性能,因为数据仍处于驻留状态,而已删除的记录具有 从任何查询中排除。

数据在回收站中保留 15 天,或直到回收站增长到特定的 大小。然后在 15 天后从数据库中硬删除数据;当大小限制 达到;或者当使用 UI、API 或 Apex 清空回收站时。

此外,Bulk API 和 Bulk API 2.0 支持硬删除选项,该选项允许 记录以绕过回收站并立即可供删除。我们建议 使用批量 API 2.0 的硬删除功能删除大量数据。

如果要立即删除沙盒组织的自定义对象中的记录, 您可以尝试截断这些自定义对象。您可以联系 Salesforce 客户支持 以获取有关此任务的帮助。

搜索

当添加或更改大量数据时,搜索系统 必须先对该信息编制索引,然后才能进行搜索 由所有用户提供,此过程可能需要很长时间。

请参阅搜索体系结构。

最佳实践

本部分列出了实现良好性能的最佳实践 在具有大量数据的部署中。

在大型 Salesforce 部署中进行性能调优的主要方法依赖于减少系统的记录数 必须处理。如果检索到的记录数足够少, 平台可能使用标准数据库结构,如索引或 非规范化以加快数据检索速度。减少记录数量的方法包括:

  • 通过编写狭窄或选择性的查询来缩小范围例如,如果 Account 对象包含已分发的帐户 均匀地跨所有州,然后按以下方式汇总帐户的报告 单个州的城市范围要广得多,并且需要更长的时间才能 执行 – 而不是按单个帐户汇总帐户的报表 城市在一个州。
  • 减少保持活动状态的数据量例如,如果您的 数据量不断增加,性能会随着时间的推移而下降 由。以相同的速率存档或丢弃数据的策略,其中 它进入系统可以防止这种影响。

这些表格列出了主要目标和要遵循的最佳实践 以实现这些目标。

  • 报告
  • 从 API 加载数据
  • 从 API 中提取数据
  • 搜索
  • SOQL 和 SOSL
  • 删除数据
  • 常规

报告

目标最佳实践
通过以下方式最大限度地提高报告性能:对数据进行分区以匹配其可能的用途最小化每个对象的记录数减少要查询的记录数 – 使用 要对查询进行分段的数据。例如,仅查询单个 状态而不是所有状态。(请参阅分部。
减少联接次数尽量减少以下数量:报告中查询的对象用于生成报表的关系在可行时对数据进行非规范化 — “过度非规范化” 数据会导致更多的开销。使用存储在 报表的父记录。这种做法比 让报表汇总子记录。
减少返回的数据量减少查询的字段数 – 仅添加字段 添加到报表、列表视图或 SOQL 查询 这是必需的。
减少记录数 查询通过存档未使用的记录来减少数据量 — 移动 未使用的记录到自定义对象表中,以减小 Report 对象。使用强调使用标准或自定义的报表筛选器 索引字段。尽可能在报表筛选器中使用索引字段。

从 API 加载数据

目标最佳实践
提高性能任何包含超过 2,000 条记录的数据操作都非常适合 批量 API 2.0,用于成功准备、执行和管理使用批量框架的异步工作流。记录少于 2,000 条的作业 应涉及 REST 中的“批量”同步调用(例如,Composite) 或 SOAP。
使用最高效的 操作使用尽可能快的操作 — 最快、是下一个,以及之后是下一个。如果可能,还分为两个操作:和 .insert()update()upsert()upsert()create()update()使用批量 API 2.0 时,请确保在加载之前数据是干净的。中的错误 批处理会触发该批处理的单行处理,并且该处理量很大 影响性能。
减少要传输和处理的数据更新时,仅发送已更改的字段(仅增量加载)。
缩短传输时间,并 中断对于自定义集成:每次加载一次身份验证,而不是对每条记录进行身份验证。使用 GZIP 压缩和 HTTP 保持活动状态来避免在长时间保存期间丢失 操作。
避免不必要的开销对于自定义集成,每次加载进行一次身份验证,而不是对每条记录进行身份验证。
避免计算在初始加载期间使用公共读/写安全性,以避免共享计算 开销
减少计算如果初始加载可能,请在填充共享规则之前填充角色。将用户加载到角色中。与所有者一起加载记录数据,在角色中触发计算 等级制度。配置公共组和队列,并让这些计算 传播。一次添加一个共享规则,让每个规则的计算完成 在添加下一个之前。如果可能,请在创建和分配组和队列之前添加人员和数据。加载新用户和新记录数据。(可选)加载新的公用组和队列。一次添加一个共享规则,让每个规则的计算完成 在添加下一个之前。
延迟计算并加快负载吞吐量在加载期间禁用 Apex 触发器、工作流规则和验证;探讨 加载完成后使用批处理 Apex 处理记录。
在高效的批量大小与潜在的超时之间取得平衡使用 SOAP API 时,请使用尽可能多的批处理,最多 200 – 在以下情况下仍可避免网络超时:记录很大。保存操作需要大量无法延迟的处理。
优化 Lightning 平台 Web 服务连接器 (WSC) 以使用 Salesforce的使用 WSC 而不是其他 Java API 客户端,如 Axis。
最大程度地减少父记录锁定冲突更改子记录时,按父记录对它们进行分组 – 按 字段 ParentId,以最大程度地减少锁定 冲突。
延迟共享计算使用延迟共享计算权限将共享计算推迟到以下日期 加载所有数据后。(请参阅延迟共享计算。
避免将数据加载到 Salesforce 中使用混搭创建应用程序的耦合集成。(请参阅使用 Mashup。

从 API 中提取数据

目标最佳实践
使用最高效的操作使用 和 SOAP API 每隔一段时间将外部系统与 Salesforce 同步 大于 5 分钟。使用出站消息传递功能进行更频繁的同步。getUpdated()getDeleted()使用可返回超过 100 万个结果的查询时,请考虑使用 批量 API 2.0 的查询功能,这可能更合适。

搜索

目标最佳实践
减少要返回的记录数保持搜索具体,并尽可能避免使用通配符。 例如,使用 而不是 搜索 。MichaelMi*
减少联接次数使用单对象搜索可提高速度和准确性。
提高效率使用设置区域进行搜索以启用语言优化, 并打开增强的查找和自动完成功能以获得更好的性能 在查找字段上。
提高搜索性能在某些情况下,使用除法对数据进行分区。(请参阅分部。
减少索引插入和更新所需的时间 大数据量请参阅搜索体系结构。

SOQL 和 SOSL

目标最佳实践
当具有多个筛选器的 SOQL 查询无法使用索引时,允许索引搜索WHERE分解查询。如果在子句中使用两个由 an 连接的索引字段,则搜索 结果可能超过索引阈值。将查询拆分为两个查询,并联接 结果。ORWHERE
避免对实时计算的公式字段进行查询如果必须查询公式字段,请使用公式。避免使用公式字段进行筛选 包含动态的、不确定的引用。见标准 和自定义索引字段。
对于给定的搜索,使用最合适的语言 SOQL 或 SOSL请参阅使用 SOQL 和 SOSL。
在筛选器中执行具有 null 值的查询 选择列表或外键字段WHERE使用 to 替换选项等值。(请参阅使用 SOQL 和 SOSL。NANULLS
设计高效的自定义查询和搜索用户界面在适当的情况下使用 SOQL 和 SOSL,保持查询的重点,并尽量减少数量 正在查询或搜索的数据。(请参阅使用 SOQL 和 SOSL。
构建高效的 SOQL 和 SOSL 查询在查询中使用筛选器和特定术语。对于 SOQL:使用选择性筛选器,以减少查询优化器的行数 进行扫描。例如,使用引用索引字段和 具有更广泛的可能值。如果筛选器没有选择性,则优化程序 不使用索引列。筛选 和 时,请改用该字段。例如FirstNameLastNameNameSelect id, Email from Lead where Name=’Sam Kennedy’避免使用负滤镜。例如,或status !=’failed’status != NULL使用而不是一大堆语句。例如。INORid in (‘001xxx’,‘001xxy’, ‘001xxz’)避免使用跨对象引用公式字段。不要筛选这些对象。他们 不可索引。对于 SOSL:对于 SOSL,选择性过滤器可减少不相关结果的数量。如果 过滤器不是选择性的,搜索词匹配超过 2,000 个 记录、结果可能会受到搜索拥挤的影响。不要为不想搜索的自定义对象编制索引。它增加了这个数字 可供搜索的记录,这可能导致搜索拥挤。过滤掉您不想搜索的对象。使用特定的搜索词。使用有针对性的搜索组。搜索组包括 NAME、EMAIL 和 PHONE 领域。例如 FIND ‘Avery Smith’ IN NAME FIELDS RETURNING Account(Id,Name), Lead(Id,Name)
避免大型 SOQL 查询超时优化 SOQL 查询,缩小查询范围,并使用选择性筛选器。考虑使用 批量 API 2.0 与批量 API 2.0 查询。如果您已经使用了前面的建议,并且仍然 get timeouts,考虑添加一个 LIMIT 子句(开始 有 100,000 条记录)添加到您的查询中。如果使用批处理 Apex 进行查询,请使用 链接以获取记录集(使用 LIMIT)或考虑将过滤器逻辑移动到 execute 方法。

删除数据

目标最佳实践
删除大量数据删除大量数据时,涉及删除 100 万或 更多记录,请使用 Bulk API 或 Bulk API 2.0 的硬删除选项。删除大 由于删除过程的复杂性,数据量可能需要大量时间。 (请参阅删除数据。
使数据删除过程更加高效删除具有多个子项的记录时,请先删除子项。

常规

目标最佳实践
避免共享计算避免任何用户拥有超过 10,000 条记录。
提高性能使用将数据分散到多个数据分层的策略 对象,并根据需要从另一个对象或外部引入数据 商店。
减少创建完整生产拷贝所需的时间 具有大量数据的沙箱创建生产沙箱的副本时,如果不需要,请排除字段历史记录,并且 在创建沙盒副本之前,不要更改大量数据。
提高部署效率分发子记录,使父级的子记录不超过 10,000 个。例如,在具有许多联系人但不使用 帐户,设置多个虚拟帐户并在它们之间分配联系人。

大数据量案例研究

本节包含:

  • 客户遇到的与大数据量相关的问题
  • 客户使用或可能使用的解决方案来解决这些问题

要识别和解决类似问题,请阅读以下案例研究:

  • 数据聚合
  • 自定义搜索功能
  • 使用 Null 值建立索引
  • 呈现具有大量数据的相关列表
  • API 性能
  • 查询的排序优化
  • 多联接报表性能

数据聚合

情况

客户需要使用标准报告汇总月度和年度指标。这 客户的月度和年度详细信息存储在自定义对象中,其中包含 400 万和 分别为 900 万条记录。这些报告汇总了数百万条记录 在这两个对象中,性能都不是最佳。

解决方案

解决方案是创建一个聚合自定义对象,该对象汇总了每月和每年的 值转换为所需报告所需的格式。然后执行报告 聚合的自定义对象。使用批处理 Apex 填充摘要对象。

自定义搜索功能

情况

客户需要搜索 使用特定值跨多个对象的大量数据量 和通配符。客户创建了一个自定义 Visualforce 页面 这将允许用户输入 1-20 个不同的字段,并且 然后使用 SOQL 进行搜索 这些字段的组合。搜索优化变得困难 因为:

  • 当输入许多值时,子句很大且难以调整。引入通配符时, 查询花费的时间更长。WHERE
  • 有时需要跨多个对象进行查询才能满足 整体搜索查询。这种做法导致了多个查询 发生,从而扩展了搜索范围。
  • SOQL 并不总是适用于所有查询类型。

解决 方案

解决方案是:

  • 仅使用必要的搜索字段来减少字段数量 可以搜索。限制同时字段的数量 可以在对常见用例进行单次搜索期间使用 允许 Salesforce 使用索引进行调整。
  • 将多个对象中的数据非规范化为单个对象 自定义对象,以避免进行多次查询调用。
  • 动态确定 SOQL 的使用 或 SOSL 执行基于 搜索的字段数和输入的值类型。例如,非常 特定值(即无通配符)使用 SOQL 进行查询,这允许索引 以提高性能。

使用 Null 值建立索引

情况

客户需要允许 null 值 并能够对它们进行查询。因为单列 选择列表和外键字段的索引排除了其中 索引列等于 null,则不能使用索引 对于 null 查询。

解决方法

最佳做法是 最初不使用 null 值。如果您发现自己处于类似的状态 情况下,请使用其他字符串,例如 代替 。如果不能这样做,可能是因为记录已经存在于 具有 NULL 值的对象,创建一个公式字段,该字段显示 null 值的文本,然后为该公式字段编制索引。N/ANULL

例如 假设 Status 字段已编制索引并包含 null 值。发出 SOQL 查询 与以下内容类似,可防止使用索引。

SELECT Name
FROM Object
WHERE Status__c = ''

相反,您可以创建公式 叫。

Status_Value

Status_Value__c = IF(ISBLANK(Status__c), "blank", Status__c)

查询时可以索引和使用此公式字段 为 null 值。

SELECT Name
FROM Object
WHERE Status_Value__c = 'blank'

这个概念可以 扩展为包含多个字段。

SELECT Name
FROM Object
WHERE Status_Value__c = '' OR Email = ''

呈现具有大量数据的相关列表

重要

在可能的情况下,我们更改了非包容性条款,以与我们公司保持一致 平等的价值。我们保留了某些条款,以避免对客户产生任何影响 实现。

情况

客户拥有数十万条帐户记录和 1500 万张发票,这些发票是 在自定义对象中,与客户保持主从关系。每个帐户记录 由于发票相关列表的渲染时间过长,因此需要很长时间才能显示 时间。

溶液

显示发票相关列表的延迟与数据倾斜有关。虽然大多数帐户 记录的发票记录很少,有些记录有数千条发票记录。

为了减少延迟,客户尝试减少这些发票记录的数量 父对象,并将子对象中的数据倾斜度保持在最低限度。使用启用分离 加载相关列表设置允许在 客户正在等待相关列表查询完成。

API 性能

情况

客户设计了一个自定义集成,用于将 Salesforce 数据与外部客户同步 应用。集成过程涉及:

  • 在 Salesforce 中查询 给定对象
  • 将此数据加载到外部系统中
  • 再次查询 Salesforce 以获取 所有数据的 ID,以便集成过程可以确定已删除哪些数据 来自Salesforce

这些对象包含数百万条记录。该集成还使用了特定的 API 用户 这是共享层次结构的一部分,用于限制检索到的记录。查询正在采取 分钟即可完成。

在Salesforce中,共享是一种非常 强大的机制,使某些记录对特定用户可见,并且效果很好 用于 UI 交互。但是,当在 SOQL 查询中用作大量数据筛选器时,性能可能会受到影响 由于使用共享作为筛选器时,数据访问更加复杂且难以处理, 特别是当您尝试在大量数据的情况下过滤掉记录时。

溶液

解决方案是授予查询对所有数据的访问权限,然后使用选择性筛选器 以获取适当的记录。例如,使用管理员作为 API 用户将具有 提供了对所有数据的访问,并阻止了在查询中考虑共享。

另一个解决方案是创建一个增量提取,降低 需要处理的数据。

您可以在共享体系结构指南中找到有关共享如何影响性能的详细信息。

查询的排序优化

情况

客户有以下几点 查询。

SELECT Id,Product_Code__c
FROM Customer_Product__c
WHERE CreatedDate = Last_N_Days:3

查询是 查找过去三天内创建的所有记录,但 对象中的数据量超出了标准索引的阈值: 记录总数的 30%,最多 100 万条记录。执行的查询 不好。

溶液

查询重写为:

SELECT Id,Product_Code__c
FROM Customer_Product__c
WHERE CreatedDate = Last_N_Days:3
ORDER BY CreatedDate LIMIT 99999

在此查询中, 未进行阈值检查,并使用索引来查找记录。这种 的查询最多返回 99,999 条记录,顺序如下 在过去三天内创建,假设 99,999 或更少 记录是在过去三天内创建的。CreatedDate

注意

通常 查询已通过 添加的数据时,如果指定对索引字段的查询 如果限制少于 100,000 条记录,则索引用于执行查询。Last_N_DaysORDER BYORDER BY

多联接报表性能

情况

客户创建了报表 使用四个相关对象:客户 (314,000)、销售订单 (769,000)、 销售详细信息(230 万)和帐户所有权(120 万)。 报表几乎没有过滤,需要优化。

溶液

为了优化报告,客户:

  • 添加了其他筛选器,使查询更具选择性和 确保尽可能多的过滤器可转位
  • 尽可能减少每个对象中的数据量
  • 使回收站保持清空。回收站中的数据会影响查询性能。
  • 确保四个相关的共享规则不存在复杂的共享规则 对象。复杂的共享规则可能会对性能产生明显影响。

总结

Salesforce平台是一个强大的环境,其中本机和自定义 应用程序可以非常快速地扩展到大量数据,而 继续保持良好表现。您可以通过以下方式最大限度地发挥这些功能的优势:

  • 使查询具有选择性 – 确保报表、列表视图、 和 SOQL 正在使用适当的过滤器。
  • 减少活动数据量 — 使用存档、混搭、 以及其他技术来减少存储在 Salesforce 中的数据量。

遵循这两个广泛的原则和最佳实践 支持它们可以减少大数据量对 Salesforce 应用程序性能的影响。

使用最近查看的信息

本节中的示例使用 REST API 查询和最近查看的资源以编程方式检索和更新最近查看的记录 信息。

  • 查看最近查看的记录
    使用“最近查看的项目”资源可获取最近查看的记录列表。
  • 将记录标记为最近查看
    若要使用 REST API 将记录标记为最近查看,请使用带有 or 子句的 Query 资源。使用 SOQL 将记录标记为最近查看,以确保正确设置了记录的日期和时间等信息。FOR VIEWFOR REFERENCE

查看最近查看的记录

使用“最近查看的项目”资源获取最近查看的记录列表。获取最近查看的两条记录的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/recent/?limit=2 -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

{ 
    "attributes" : 
    { 
        "type" : "Account", 
        "url" : "/services/data/v59.0/sobjects/Account/a06U000000CelH0IAJ" 
    }, 
    "Id" : "a06U000000CelH0IAJ", 
    "Name" : "Acme" 
}, 
{ 
    "attributes" : 
    { 
        "type" : "Opportunity", 
        "url" : "/services/data/v59.0/sobjects/Opportunity/a06U000000CelGvIAJ" 
    }, 
    "Id" : "a06U000000CelGvIAJ", 
    "Name" : "Acme - 600 Widgets" 
}

将记录标记为最近查看

若要使用 REST API 将记录标记为最近查看,请使用带有 or 子句的 Query 资源。使用 SOQL 将记录标记为最近查看,以确保 查看记录的日期和时间等信息正确无误 设置。

FOR VIEWFOR REFERENCE

用于在记录出现以下情况时通知 Salesforce: 从自定义界面(如移动应用程序)或自定义页面查看。在引用记录时使用 自定义界面。每次查看相关记录时,都会引用一条记录。为 有关详细信息,请参阅 SOQL 和 SOSL 参考中的“FOR VIEW”和“FOR REFERENCE”。FOR VIEWFOR REFERENCE执行将一个客户记录标记为 最近浏览

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/query/?q=SELECT+Name+FROM+Account+LIMIT+1+FOR+VIEW -H "Authorization: Bearer token"

用于执行查询的示例请求正文不需要用于执行查询的示例响应正文

{
    "done" : true,
    "totalSize" : 1,
    "records" : 
    [ 
        {  
            "attributes" : 
            {    
                "type" : "Account",    
                "url" : "/services/data/v59.0/sobjects/Account/001D000000IRFmaIAH"  
            },  
            "Name" : "Acme"
        }, 

    ]
}

管理用户密码

本节中的示例使用 REST API 资源来管理用户密码,例如 设置或重置密码。

  • 管理用户密码
    使用 sObject 用户密码资源可以设置、重置或获取有关用户密码的信息。使用 HTTP GET 方法获取密码过期状态,使用 HTTP POST 方法设置密码,使用 HTTP DELETE 方法重置密码。

管理用户密码

使用 sObject 用户密码资源设置、重置或获取有关 用户密码。使用 HTTP GET 方法获取密码过期状态,即 HTTP POST 方法设置密码,并使用 HTTP DELETE 方法重置 密码。

关联的会话必须有权访问给定的用户密码 信息。如果会话没有适当的权限,则 HTTP 错误 403 响应 从这些方法返回。

这些方法适用于用户和自助服务用户。用于管理 自助服务用户密码,而不是在 REST API URL 中使用。SelfServiceUserUser

下面是检索用户当前密码过期状态的示例:获取当前密码过期状态的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/User/005D0000001KyEIIA0/password -H "Authorization: Bearer token"

用于获取当前密码过期状态的示例请求正文不需要用于获取当前密码过期状态的 JSON 示例响应正文

{
    "isExpired" : false
}

用于获取当前密码过期状态的 XML 示例响应正文

<Password>
    <isExpired>false</isExpired>
</Password>

会话权限不足时的错误响应示例

{
    "message" : "You do not have permission to view this record.",
    "errorCode" : "INSUFFICIENT_ACCESS"
}

以下是更改给定用户密码的示例:更改用户密码的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/User/005D0000001KyEIIA0/password -H "Authorization: Bearer token" —H "Content-Type: application/json" —d @newpwd.json —X POST

文件 newpwd.json 的内容

{
    "NewPassword" : "myNewPassword1234"
}

更改用户密码的示例响应成功更改密码时没有响应正文,HTTP 状态代码 204 返回。新密码不符合组织密码时的错误响应示例 要求

{
    "message" : "Your password must have a mix of letters and numbers.",
    "errorCode" : "INVALID_NEW_PASSWORD"
}

最后,下面是重置用户密码的示例:重置用户密码的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/User/005D0000001KyEIIA0/password -H "Authorization: Bearer token" —X DELETE

重置用户密码的示例请求正文不需要用于重置用户密码的 JSON 示例响应正文

{
    "NewPassword" : "2sv0xHAuM"
}

用于重置用户密码的 XML 示例响应正文

<Result>
    <NewPassword>2sv0xHAuM</NewPassword>
</Result>

另见

  • sObject 用户密码

使用审批流程和流程规则

本节中的示例使用 REST API 资源来处理审批流程和 流程规则。

  • 获取所有审批流程的列表 使用“流程
    审批”资源获取有关审批的信息。
  • 提交记录以供审批 使用“流程审批”资源提交记录或记录集合以供审
    批。每个调用都接受一组请求。
  • 审批记录 使用“流程审批”资源可以审批记录或记录
    集合。每个调用都接受一组请求。当前用户必须是分配的审批者。
  • 拒绝记录 使用“流程审批”资源拒绝记录或记录
    集合。每个调用都接受一组请求。当前用户必须是分配的审批者。
  • 批量审批
    使用“流程审批”资源进行批量审批。您可以指定不同流程审批请求的集合,以将它们全部批量执行。
  • 获取流程规则列表 使用“流程规则”资源获取有关流程规则
    的信息。
  • 获取特定流程规则 使用“流程规则
    ”资源,并指定要获取其元数据的规则的 和。sObjectNameworkflowRuleId
  • 触发流程规则 使用“流程规则”资源触发流程规则
    。无论评估标准如何,都将评估与指定 ID 关联的所有规则。所有 ID 必须用于同一对象上的记录。

获取所有审批流程的列表

使用“流程审批”资源获取有关审批的信息。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/process/approvals/ -H "Authorization: Bearer token"

示例请求正文不需要示例 JSON 响应正文

{
  "approvals" : {
   "Account" : [ {
     "description" : null,
     "id" : "04aD00000008Py9",
     "name" : "Account Approval Process",
     "object" : "Account",
     "sortOrder" : 1
   } ]
  }
}

提交记录以供审批

使用“流程审批”资源提交记录或记录集合以供审批。每次通话 接受一系列请求。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/process/approvals/ -H "Authorization: Bearer token" -H "Content-Type: application/json" -d @submit.json"

示例请求正文 submit.json 文件

在以下示例中,提交记录“001D000000I8mIm”以供审批 通过代表提交者跳过其输入标准来处理“PTO_Request_Process” “005D00000015rZy。”

{
"requests" : [{
"actionType": "Submit",
"contextId": "001D000000I8mIm",
"nextApproverIds": ["005D00000015rY9"],
"comments":"this is a test",
"contextActorId": "005D00000015rZy",
"processDefinitionNameOrId" : "PTO_Request_Process",
"skipEntryCriteria": "true"}]
}

示例 JSON 响应正文

[ { 
  "actorIds" : [ "005D00000015rY9IAI" ],
   "entityId" : "001D000000I8mImIAJ",
   "errors" : null,
   "instanceId" : "04gD0000000Cvm5IAC",
   "instanceStatus" : "Pending",
   "newWorkitemIds" : [ "04iD0000000Cw6SIAS" ],
   "success" : true } ]

批准记录

使用“流程审批”资源可以审批记录或记录集合。每次调用都需要一个数组 的请求。当前用户必须是分配的审批者。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/process/approvals/ -H "Authorization: Bearer token" -H "Content-Type: application/json" -d @approve.json"

示例请求正文 approve.json 文件

{
  "requests" : [{
    "actionType" : "Approve",
    "contextId" : "04iD0000000Cw6SIAS",
    "nextApproverIds" : ["005D00000015rY9"],
    "comments" : "this record is approved"}]
}

示例 JSON 响应正文

[ { 
  "actorIds" : null,
  "entityId" : "001D000000I8mImIAJ",
  "errors" : null,
  "instanceId" : "04gD0000000CvmAIAS",
  "instanceStatus" : "Approved",
  "newWorkitemIds" : [ ],
  "success" : true 
} ]

拒绝记录

使用“流程审批”资源拒绝记录或记录集合。每次调用都需要一个数组 的请求。当前用户必须是分配的审批者。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/process/approvals/ -H "Authorization: Bearer token" -H "Content-Type: application/json" -d @reject.json"

示例请求正文 reject.json 文件

{
  "requests" : [{
    "actionType" : "Reject",
    "contextId" : "04iD0000000Cw6cIAC",
    "comments" : "This record is rejected."}]
}

示例 JSON 响应正文

[ { 
  "actorIds" : null,
  "entityId" : "001D000000I8mImIAJ",
  "errors" : null,
  "instanceId" : "04gD0000000CvmFIAS",
  "instanceStatus" : "Rejected",
  "newWorkitemIds" : [ ],
  "success" : true 
} ]

批量批准

使用“流程审批”资源执行批量审批。您可以指定不同进程的集合 批准请求将它们全部批量执行。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/process/approvals/ -H "Authorization: Bearer token" -H "Content-Type: application/json" -d @bulk.json"

示例请求正文 bulk.json 文件

{
  "requests" :
  [{
    "actionType" : "Approve",
    "contextId" : "04iD0000000Cw6r",
    "comments" : "approving an account"
    },{
    "actionType" : "Submit",
    "contextId" : "001D000000JRWBd",
    "nextApproverIds" : ["005D00000015rY9"],
    "comments" : "submitting an account"
    },{
    "actionType" : "Submit",
    "contextId" : "003D000000QBZ08",
    "comments" : "submitting a contact"
    }]
}

示例 JSON 响应正文

[ { 
  "actorIds" : null,
  "entityId" : "001D000000I8mImIAJ",
  "errors" : null,
  "instanceId" : "04gD0000000CvmZIAS",
  "instanceStatus" : "Approved",
  "newWorkitemIds" : [ ],
  "success" : true 
  }, {
  "actorIds" : null,
  "entityId" : "003D000000QBZ08IAH",
  "errors" : null,
  "instanceId" : "04gD0000000CvmeIAC",
  "instanceStatus" : "Approved",
  "newWorkitemIds" : [ ],
  "success" : true
  }, {
  "actorIds" : [ "005D00000015rY9IAI" ],
  "entityId" : "001D000000JRWBdIAP",
  "errors" : null,
  "instanceId" : "04gD0000000CvmfIAC",
  "instanceStatus" : "Pending",
  "newWorkitemIds" : [ "04iD0000000Cw6wIAC" ],
  "success" : true
} ]

获取流程规则列表

使用“流程规则”资源获取有关流程规则的信息。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/process/rules/ -H "Authorization: Bearer token"

示例请求正文不需要示例 JSON 响应正文

{
  "rules" : {
    "Account" : [ {
      "actions" : [ {
        "id" : "01VD0000000D2w7",
        "name" : "ApprovalProcessTask",
        "type" : "Task"
      } ],
      "description" : null,
      "id" : "01QD0000000APli",
      "name" : "My Rule",
      "namespacePrefix" : null,
      "object" : "Account"
    } ]
  }
}

获取特定进程规则

使用“流程规则”资源并指定 和 要获取其元数据的规则。sObjectNameworkflowRuleId示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/process/rules/Account/01QD0000000APli -H "Authorization: Bearer token"

示例请求正文不需要示例 JSON 响应正文

{
  "actions" : [ {
    "id" : "01VD0000000D2w7",
    "name" : "ApprovalProcessTask",
    "type" : "Task"
    } ],
    "description" : null,
    "id" : "01QD0000000APli",
    "name" : "My Rule",
    "namespacePrefix" : null,
    "object" : "Account"
}

触发流程规则

使用“流程规则”资源触发流程规则。与指定 ID 关联的所有规则都将 无论评估标准如何,都要进行评估。所有 ID 必须用于同一记录 对象。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/process/rules/ -H "Authorization: Bearer token" -H "Content-Type: application/json" -d @rules.json"

示例请求正文 rules.json 文件

{
  "contextIds" : [
    "001D000000JRWBd",
    "001D000000I8mIm",
    "001D000000I8aaf"]
}

示例 JSON 响应正文

{
  "errors" : null,
  "success" : true
}

使用事件监视

这些示例使用 REST API 事件监视数据,其中包含对 评估组织的使用趋势和用户行为。通过闪电网络访问事件监控 平台 SOAP API 和 REST API,通过 EventLogFile 对象。因此,您可以集成 使用您自己的后端存储和数据集市记录数据,以关联来自多个组织的数据,以及 跨不同的系统。

注意

有关可用于事件监控的受支持事件类型,请参阅 Salesforce 和 Lightning 的对象参考 平台:EventLogFile 对象。

  • 在极少数情况下,如果 24 小时内未生成日志文件, 请联系 Salesforce 客户支持。
  • 日志数据是只读的。您无法插入、更新或删除日志数据。
  • 要确定为您的组织生成了哪些文件,请使用 EventType 字段。
  • 事件实时生成日志数据。但是,每日日志文件会在 事件发生后第二天的非高峰时段。因此,每日日志文件数据为 活动结束后至少 1 天内不可用。对于每小时日志文件,具体取决于事件 交付和最终处理时间,预计事件将在 3-6 小时内发生 日志文件中可用的事件。但是,这可能需要更长的时间。
  • 仅当某一类型的事件(由 EventType 字段表示)在一天或一小时内发生时,才会生成日志文件。如果没有发生任何事件, 不会生成文件。
  • 日志文件在组织中的 CreatedDate后 30 天内可用 具有事件监控许可证,之后将自动删除。在所有开发人员中 版本组织、日志文件的有效期为 1 天。
  • 所有事件监控日志都通过 EventLogFile 对象向 API 公开。但是,除了通过事件之外,无法通过用户界面进行访问 监视 Analytics 应用。
  • 日志文件不计入组织的数据或文件存储分配。
  • 事件监视日志文件不是用户活动的记录系统。他们是一个来源 真相,但它们并不持久。在 Salesforce 站点切换、实例刷新或 可能会发生计划外的系统中断、数据丢失。例如,如果 Salesforce 将 生产组织实例,则事件日志文件中可能存在数据缺口。Salesforce 使 为保持事件日志文件数据完整性和避免数据而做出的商业合理努力 损失。当 Salesforce 执行站点切换或实例刷新时,它使用自动 复制事件日志的进程。
  • 提供每小时一次的事件日志文件,供您在 加速基础。但是,您可能无法每小时获取所有事件日志数据 事件日志文件,尤其是在站点切换、实例刷新或计划外系统期间 中断。要获得完整数据,请使用每日日志文件。
  • 如果事件传输失败需要很长时间才能从中恢复,则会重新传输日志文件 以确保它们至少交付一次。因此,潜在日志文件可以 有时包含重复的事件数据。当应用程序使用潜在日志文件时, 确保您的应用程序处理重复的事件传递。
  • 交付每日增量日志文件时,新文件会将原始文件替换为 该日期的完整可用日志集。为了确保您看到的最多 最近的日志文件,请选中 CreatedDate 字段。
  • 我们建议您始终查询 EventLogFile 对象以获取新的日志文件,以确保 你也包括潜在的。若要标识新创建的日志文件,请使用 EventLogFile CreatedDate 字段。每小时和每天的增量日志下发 不同。有关详细信息,请参阅每小时和 24 小时事件日志之间的差异。

本部分中的所有查询和示例都需要启用 View 事件日志文件和 API 用户权限。具有“查看所有数据”权限的用户还可以查看事件监控 数据。

  • 使用 REST
    描述事件监视 使用 sObject Describe 资源检索对象的所有元数据,包括有关字段、URL 和子关系的信息。
  • 使用 REST
    查询事件监视数据 使用 Query 资源从记录中检索字段值。在 fields 参数中指定要检索的字段,并使用资源的方法。GET
  • 从记录
    中获取事件监视内容 使用 sObject Blob Retrieve 资源检索给定记录的 BLOB 数据。
  • 将 cURL 与 REST
    结合使用下载大型事件日志文件 您可能有一些事件日志文件大于工具可以处理的范围。命令行工具(如 cURL)是使用 sObject Blob Get 对象下载大于 100 MB 的文件的一种方法
  • 删除事件监视数据 可以删除包含用户日志数据
    的事件日志文件。删除日志文件有助于您遵守数据保护和隐私法规,并控制其他人可以访问的信息。不能从事件日志中删除单个行。相反,您必须删除包含用户活动的整个日志文件。
  • 查询或查看每小时事件日志文件
    若要加速查看组织中的事件,请以每小时为增量获取最近活动的事件日志文件。每小时一次的事件日志文件可以让你更快地了解安全异常和自定义代码性能问题。

描述使用 REST 进行事件监视

使用 sObject Describe 资源检索对象的所有元数据,包括有关字段的信息。 URL 和子关系。例可以使用 REST API 来描述事件日志文件。使用 GET 请求,例如 这:

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/EventLogFile/describe -H "Authorization: Bearer token"

原始响应示例

{ 
   "actionOverrides" : [ ],
   "activateable" : false,
   "childRelationships" : [ ],
   "compactLayoutable" : false,
   "createable" : false,
   "custom" : false,
   "customSetting" : false,
   "deletable" : false,
   "deprecatedAndHidden" : false,
   "feedEnabled" : false,
   "fields" : [ {
     "autoNumber" : false,
     "byteLength" : 18,
     "calculated" : false,
     "calculatedFormula" : null,
     "cascadeDelete" : false,
     "caseSensitive" : false,
     "controllerName" : null,
     "createable" : false,
     ...
}

使用 REST 查询事件监控数据

使用查询资源 从记录中检索字段值。指定要在 fields 参数并使用 资源。

GET您可以使用 REST API 查询事件监控数据。检索事件监视记录 根据 LogDate 和 EventType,使用 GET 像这样请求:

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/query?q=SELECT+Id+,+EventType+,+LogFile+
,+LogDate+,+LogFileLength+FROM+EventLogFile+WHERE+
LogDate+>+Yesterday+AND+EventType+=+'API' -H "Authorization: Bearer token"

原始响应示例

{ 
   "totalSize" : 4,
   "done" : true,
   "records" : [ {
     "attributes" : {
       "type" : "EventLogFile",
       "url" : "/services/data/v59.0/sobjects/EventLogFile/0ATD000000001bROAQ"     }
     "Id" : "0ATD000000001bROAQ",
     "EventType" : "API",
     "LogFile" : "/services/data/v59.0/sobjects/EventLogFile/0ATD000000001bROAQ/LogFile",
     "LogDate" : "2014-03-14T00:00:00.000+0000",
     "LogFileLength" : 2692.0
    }, {
     "attributes" : {
       "type" : "EventLogFile",
       "url" : "/services/data/v59.0/sobjects/EventLogFile/0ATD000000001SdOAI"     },
       "Id" : "0ATD000000001SdOAI",
       "EventType" : "API",
       "LogFile" : "/services/data/v59.0/sobjects/EventLogFile/0ATD000000001SdOAI/LogFile",
       "LogDate" : "2014-03-13T00:00:00.000+0000",
       "LogFileLength" : 1345.0
   }, {
       "attributes" : {
        "type" : "EventLogFile",
        "url" : "/services/data/v59.0/sobjects/EventLogFile/0ATD000000003p1OAA"     },
        "Id" : "0ATD000000003p1OAA",
        "EventType" : "API",
        "LogFile" : "/services/data/v59.0/sobjects/EventLogFile/0ATD000000003p1OAA/LogFile",
        "LogDate" : "2014-06-21T00:00:00.000+0000",
        "LogFileLength" : 605.0   },
 {     "attributes" : {
       "type" : "EventLogFile",
       "url" : "/services/data/v59.0/sobjects/EventLogFile/0ATD0000000055eOAA"     },
       "Id" : "0ATD0000000055eOAA",
       "EventType" : "API",
       "LogFile" : "/services/data/v59.0/sobjects/EventLogFile/0ATD0000000055eOAA/LogFile",
       "LogDate" : "2014-07-03T00:00:00.000+0000",
       "LogFileLength" : 605.0
     } ]
}

从记录中获取事件监视内容

使用 sObject Blob 检索资源以检索给定记录的 BLOB 数据。例可以使用 REST API 检索 BLOB 数据以进行事件监视。使用 GET 与此类似的请求:

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/EventLogFile/0ATD000000000pyOAA/LogFile -H "Authorization: Bearer token"

示例响应正文事件监视内容以二进制形式返回。请注意,响应 内容类型不会是 JSON 或 XML,因为返回的数据是 二元的。

HTTP/1.1 200 OK
Date: Tue, 06 Aug 2013 16:46:10 GMT
Sforce-Limit-Info: api-usage=135/5000
Content-Type: application/octetstream
Transfer-Encoding: chunked
"EVENT_TYPE", "ORGANIZATION_ID", "TIMESTAMP","USER_ID", "CLIENT_IP",
"URI", "REFERRER_URI", "RUN_TIME"
"URI", "00DD0000000K5xD", "20130728185606.020", "005D0000001REDy",
"10.0.62.141", "/secur/contentDoor", "https-//login-salesforce-com/",
"11"
"URI", "00DD0000000K5xD", "20130728185556.930", "005D0000001REI0",
"10.0.62.141", "/secur/logout.jsp", "https-//MyDomainName-my-salesforce-com/00O/o",
"54"
"URI", "00DD0000000K5xD", "20130728185536.725", "005D0000001REI0",
"10.0.62.141", "/00OD0000001ckx3",
"https-//MyDomainName-my-salesforce-com/00OD0000001ckx3", "93"

使用带有 REST 的 cURL 下载大型事件日志文件

您可能有一些事件日志文件大于工具可以处理的范围。一个 命令行工具(如 cURL)是下载大于 100 MB 的文件的一种方法,使用 sObject Blob Get 对象示例:使用“X-PrettyPrint”标头和“-o”标志输出大文件 转换为.csv格式此命令将文件下载到计算机上的下载文件夹中。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/EventLogFile/0AT30000000000uGAA/LogFile
-H "Authorization: Bearer token" -H "X-PrettyPrint:1" -o ~/downloads/outputLogFile.csv

建议在下载大型事件日志文件时使用压缩。请参阅压缩标头。

删除事件监控数据

您可以删除包含用户日志数据的事件日志文件。删除日志文件 帮助您遵守数据保护和隐私法规并控制信息 其他人可以访问。不能从事件日志中删除单个行。相反,您必须 删除包含用户活动的整个日志文件。若要删除事件日志文件,请在安装程序中启用删除,并创建一个权限集 包括“删除事件监控记录”用户权限,并分配此权限 权限集。(或者,您可以将用户权限分配给 自定义配置文件。然后,这些用户可以通过以下方式查询和删除 EventLogFile 记录 在REST或SOAP中使用查询和删除资源。

delete()

注意

您无法从事件中删除单个行 原木。由于事件日志以 blob 格式存储在数据库中,因此必须 删除包含用户活动的整个日志文件。

  1. 在“设置”的“快速查找”框中,输入“事件”,然后 选择事件监控设置
  2. 启用删除事件监视数据。此操作记录在安装程序中 审计跟踪。“删除事件监控记录”用户权限现在可用于 分配给权限集。(或者,您可以分配用户权限 添加到自定义配置文件。
  3. 在“设置”的“快速查找”框中,输入“权限”,然后 ,然后选择“权限集”。
  4. 创建包含“删除事件监视记录”用户的权限集 权限,然后保存权限集。
  5. 在“设置”的“快速查找”框中,输入用户,然后 选择“用户”。
  6. 选择要授予删除事件监控权限的用户 数据。
  7. 在此用户的“权限集分配”部分中,分配权限 设置,然后单击保存。此操作记录在安装程序中 审计跟踪。分配了此权限集(或任何自定义配置文件,包括 删除事件监控记录用户权限)现在可以删除事件 监控数据。后续步骤将介绍如何使用 API 删除 数据。
  8. 若要查找包含要删除的用户活动的日志,请查询 EventLogFile 对象。有关详细信息,请参阅查询事件监控数据 休息。
  9. 记下返回日志的 ID。
  10. 使用 sObject Rows 资源删除记录。指定记录 ID,并使用 DELETE 方法。有关详细信息,请参阅删除 记录。

查询或查看每小时事件日志文件

若要加速查看组织中的事件,请每小时获取一次事件日志文件 最近活动的增量。每小时事件日志文件可让您更快地了解 安全异常和自定义代码性能问题。

用户权限 需要
要访问 API 和查询日志文件,请执行以下操作:启用 API 并查看事件日志文件
要查看事件日志文件,请执行以下操作:查看所有数据

例子

假设你是一名安全分析师,负责监视异常用户行为。通过拉动更多 频繁更新您的安全系统,您可以收到可疑事件的警报 在几个小时内发生,而不是一两天后。

在另一个示例中,假设您是一名开发人员。您已经确定了一系列 Apex 组织中的失败,并且您希望主动重构 Apex 代码以改进 性能。您可以查看每小时的日志文件,以查明问题并修复您的代码 数小时后,您的最终用户才开始抱怨性能不佳。

考虑

  • 每小时事件日志文件与事件监控分析应用程序的集成是 不能利用的。
  • 根据事件传递和最终处理时间,事件应 从事件发生开始需要三到六个小时才能在日志中显示 文件。但是,这可能需要更长的时间。
  • 当处理出现延迟且特定小时的事件日志到达时 稍后,将为事件/日期/小时创建一个新的日志文件,并仅列出 新事件。使用创建日期和增量序列号 标识新的日志文件。始终使用最近处理的事件日志 特定日期的文件。但是,如果事件日志文件已经 拉入第三方应用程序时,它们可能需要在 该应用程序。如果同时启用了每小时日志和每日日志,则每日日志始终具有序列 数字为 0,因为每个每日间隔只有一个文件。创建日期 指示文件的生成时间。如果 CreatedDate 在最后一个之后 事件日志文件下载时,有新事件需要处理。有关最佳做法,请在 WHERE 子句中使用 CreatedDate 来选择日志 在上次下载的事件日志文件之后创建。例如,如果最后一个 下载的文件是在 2018 年 2 月 1 日中午 12 点,要查找下一个日志文件,请使用 +CreatedDate+>+“2018-02-01T12:00:00Z”。
  • 在站点切换、实例刷新或 计划外系统中断。但是,在站点切换和实例刷新期间, Salesforce 通过以下方式做出商业上合理的努力来避免此类数据丢失 使用自动化过程复制事件日志。
  • 如果 24 小时内未生成日志文件,请联系 Salesforce 支持。
  • 查询每小时事件日志文件 查询每小时事件日志文件的方式与查询 24 小时日志文件
    的方式相同。
  • 每小时事件日志和 24 小时事件日志
    之间的差异 除了 24 小时日志文件外,您大约每小时都会收到一次事件日志文件。查看两个日志之间的差异,以便可以筛选文件以分析所需的事件数据。

查询每小时事件日志文件

查询每小时事件日志文件的方式与查询 24 小时日志的方式相同 文件。

假设您是管理员。您的首席安全官要求您确定谁 修改了过去两个小时内的特定客户和商机。您查询每小时 使用 EventLogFile 对象查看页面请求的 URI 事件日志文件,以及 请求状态。由于 EventLogFile 还返回 24 小时日志文件,因此请使用此 SOQL 语法来筛选出 24 小时日志文件。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/query?​q=SELECT+Id+,​+EventType+,​+Interval+,+LogDate+,​+LogFile+​FROM+EventLogFile+​WHERE+EventType+=+'URI'+​AND+Interval+=+'Hourly' -H "Authorization: Bearer token"

在查询中,确保仅 每小时返回一次事件日志文件数据。或者,可以使用 Sequence 筛选出 24 小时事件日志文件 ()。若要同时获取每小时和 24 小时文件,请使用 .Interval=HourlySequence!=0Sequence>=0

如果您的沙盒组织具有 URI 事件,您会在查询结果中看到日志文件记录。您可以 此外,下载事件日志文件以查看 CSV 文件中的数据。查看更多 信息,请参阅 Trailhead:下载和 可视化事件日志文件

每小时和 24 小时事件日志之间的差异

除了 24 小时日志文件外,您大约每小时都会收到一次事件日志文件。 查看两个日志之间的差异,以便可以筛选文件以分析事件 您想要的数据。

每小时日志文件24小时日志文件
为每小时的活动生成一个或多个文件。每 24 小时活动生成一个文件。
在 API 中可用。您可以手动将数据导入第三方可视化 应用程序。在 API 中可用,并与 Event Monitoring Analytics 应用程序集成,以及 第三方可视化应用程序。
EventLogFile 对象中的关键值为:间隔 – 每小时CreatedDate – 创建日志文件的时间戳。 使用此字段标识新文件。LogDate – 时间戳,用于标记以下时间间隔的开始时间 事件发生了。例如,对于上午 11:00 到中午 12:00 之间发生的事件 在 2016 年 3 月 7 日,此字段的值为 2016-03-07T11:00:00.000Z。序列 (Sequence) – 1+。当事件添加到 创建最新事件日志文件后的同一小时。该值在 随后的一小时。另请参阅有关每小时事件日志的这些注意事项。EventLogFile 对象中的关键值为:间隔 – 每天CreatedDate – 创建日志文件的时间戳。 使用此字段标识新文件。LogDate – 时间戳,用于标记以下时间间隔的开始时间 事件发生了。例如,对于 2016 年 3 月 7 日发生的事件,此字段的 值为 2016-03-07T00:00:00.000+0000。序列 (Sequence) – 0
当传送每小时增量日志文件时,包含该小时新日志的文件 已创建。对于每个新文件,“序列”字段都会递增。当交付每日增量日志文件时,一个新文件将替换原始文件 以及该日期的完整可用日志集。“CreatedDate”字段已更新。

注意

与 24 小时事件监控一样,过去 30 年的每小时事件日志数据可用 日。

使用复合资源

本节中的示例使用复合资源来改进应用程序的 通过最小化客户端和服务器之间的往返次数来提高性能。

  • 在单个 API 调用中执行依赖请求 以下示例使用 Composite 资源在单个调用
    中执行多个依赖请求。首先,它创建一个帐户并检索其信息。接下来,它使用客户数据和复合资源的引用 ID 功能来创建联系人,并根据客户数据填充其字段。然后,它使用请求字符串中的查询参数检索有关帐户所有者的特定信息。最后,如果元数据自特定日期以来已被修改,则检索帐户元数据。composite.json 文件包含复合请求和子请求数据。
  • 更新客户,创建联系人,并将其与联结对象
    链接 下面的示例使用 Composite 资源更新客户的某些字段,创建联系人,并将这两条记录与名为 .所有这些请求都在一次调用中执行。composite.json 文件包含复合请求和子请求数据。AccountContactJunction
  • 在单个请求中更新记录并获取其字段值 使用复合批处理资源在单个 API 调用中执行多个请求。
  • 更新插入帐户并创建联系人
    以下示例使用 Composite 资源更新插入客户并创建链接到该客户的联系人。所有这些请求都在一次调用中执行。composite.json 文件包含复合请求和子请求数据。
  • 创建嵌套记录
    使用 sObject Tree 资源创建共享根记录类型的嵌套记录。例如,在单个请求中,您可以创建一个帐户及其子联系人,并创建一个第二个帐户及其子帐户和联系人。处理请求后,将创建记录,并通过 ID 自动链接父子。在请求数据中,提供记录层次结构、必填字段值和可选字段值、每条记录的类型以及每条记录的引用 ID,然后使用资源的 POST 方法。如果请求成功,响应正文将包含所创建记录的 ID。否则,响应仅包含导致错误的记录的引用 ID 和错误信息。
  • 创建多条记录 虽然资源可用于创建嵌套记录,但您也可以创建多个相同类型的不相关记录
    。在单个请求中,您最多可以创建 200 条记录。在请求数据中,为每条记录提供必填字段值和可选字段值、每条记录的类型以及每条记录的引用 ID,然后使用资源的 POST 方法。如果请求成功,响应正文将包含所创建记录的 ID。否则,响应仅包含导致错误的记录的引用 ID 和错误信息。
  • 使用复合图 复合图
    提供了一种执行复合请求的增强方法,复合请求在单个调用中执行一系列 REST API 请求。
  • 使用复合图 此示例演示如何使用复合图
    。它还演示了一个请求如何使用多个复合图。
  • 复合请求和集合请求
    中的 allOrNone 参数 如果复合请求使用 sObject 集合,则有两个或多个参数可以交互,一个在复合请求上,一个在各个 sObject 集合子请求上。allOrNone

在单个 API 调用中执行依赖请求

以下示例使用 Composite 资源执行多个依赖 在一次调用中完成所有请求。首先,它创建一个帐户并检索其信息。 接下来,它使用帐户数据和复合资源的引用 ID 功能来 创建联系人并根据客户数据填充其字段。然后它检索 在请求中使用查询参数提供有关帐户所有者的特定信息 字符串。最后,如果元数据自特定日期以来被修改,它将检索 帐户元数据。composite.json 文件包含复合 请求和子请求数据。在单个 API 调用中执行依赖请求

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/composite/ -H "Authorization: Bearer token -H "Content-Type: application/json" -d "@composite.json"

请求正文 composite.json 文件

{
    "allOrNone" : true,
    "compositeRequest" : [{
        "method" : "POST",
        "url" : "/services/data/v59.0/sobjects/Account",
        "referenceId" : "NewAccount",
        "body" : {  
            "Name" : "Salesforce",
            "BillingStreet" : "Landmark @ 1 Market Street",
            "BillingCity" : "San Francisco",
            "BillingState" : "California",
             "Industry" : "Technology"
        }
    },{
        "method" : "GET",
        "referenceId" : "NewAccountInfo",
        "url" : "/services/data/v59.0/sobjects/Account/@{NewAccount.id}"
    },{
        "method" : "POST",
        "referenceId" : "NewContact",
        "url" : "/services/data/v59.0/sobjects/Contact",
        "body" : {  
            "lastname" : "John Doe",
            "Title" : "CTO of @{NewAccountInfo.Name}",
            "MailingStreet" : "@{NewAccountInfo.BillingStreet}",
            "MailingCity" : "@{NewAccountInfo.BillingAddress.city}",
            "MailingState" : "@{NewAccountInfo.BillingState}",
            "AccountId" : "@{NewAccountInfo.Id}",
            "Email" : "jdoe@salesforce.com",
            "Phone" : "1234567890"
        }
    },{
        "method" : "GET",
        "referenceId" : "NewAccountOwner",
        "url" : "/services/data/v59.0/sobjects/User/@{NewAccountInfo.OwnerId}?fields=Name,companyName,Title,City,State"
    },{
        "method" : "GET",
        "referenceId" : "AccountMetadata",
        "url" : "/services/data/v59.0/sobjects/Account/describe",
        "httpHeaders" : {
            "If-Modified-Since" : "Tue, 31 May 2016 18:13:37 GMT"
        }
    }]
}

成功执行复合请求后的响应正文

{
    "compositeResponse" : [{
        "body" : {
            "id" : "001R00000033JNuIAM",
            "success" : true,
            "errors" : [ ]
        },
        "httpHeaders" : {
          "Location" : "/services/data/v59.0/sobjects/Account/001R00000033JNuIAM"
        },
        "httpStatusCode" : 201,
        "referenceId" : "NewAccount"
    },{
        "body" : {
            all the account data
        },
        "httpHeaders" : {
            "ETag" : "\"Jbjuzw7dbhaEG3fd90kJbx6A0ow=\"",
            "Last-Modified" : "Fri, 22 Jul 2016 20:19:37 GMT"
        },
        "httpStatusCode" : 200,
        "referenceId" : "NewAccountInfo"
    },{
        "body" : {
            "id" : "003R00000025REHIA2",
            "success" : true,
            "errors" : [ ]
        },
        "httpHeaders" : {
            "Location" : "/services/data/v59.0/sobjects/Contact/003R00000025REHIA2"
        },
        "httpStatusCode" : 201,
        "referenceId" : "NewContact"
    },{
        "body" : {
            "attributes" : {
            "type" : "User",
            "url" : "/services/data/v59.0/sobjects/User/005R0000000I90CIAS"
            },
            "Name" : "Jane Doe",
            "CompanyName" : "Salesforce",
            "Title" : Director,
            "City" : "San Francisco",
            "State" : "CA",
            "Id" : "005R0000000I90CIAS"
        },
        "httpHeaders" : { },
        "httpStatusCode" : 200,
        "referenceId" : "NewAccountOwner"
    },{
        "body" : null,
        "httpHeaders" : {
            "ETag" : "\"f2293620\"",
            "Last-Modified" : "Fri, 22 Jul 2016 18:45:56 GMT"
         },
        "httpStatusCode" : 304,
        "referenceId" : "AccountMetadata"
    }]
}

更新帐户,创建联系人,并将其与联结链接 对象

以下示例使用 Composite 资源更新 帐户,创建联系人,并将这两条记录与名为 的联结对象链接。所有这些请求都在 一个电话。composite.json 文件包含复合请求 和子请求数据。

AccountContactJunction更新帐户,创建联系人,并将其与联结对象链接

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/composite/ -H "Authorization: Bearer token -H "Content-Type: application/json" -d "@composite.json"

请求正文 composite.json 文件

{
    "allOrNone" : true,
    "compositeRequest" : [{
        "method" : "PATCH",
        "url" : "/services/data/v59.0/sobjects/Account/001xx000003DIpcAAG",
        "referenceId" : "UpdatedAccount",
        "body" : {  
            "Name" : "Salesforce",
            "BillingStreet" : "Landmark @ 1 Market Street",
            "BillingCity" : "San Francisco",
            "BillingState" : "California",
            "Industry" : "Technology"
        }
    },{
        "method" : "POST",
        "referenceId" : "NewContact",
        "url" : "/services/data/v59.0/sobjects/Contact/",
        "body" : {  
            "lastname" : "John Doe",
            "Phone" : "1234567890"
        }
    },{
        "method" : "POST",
        "referenceId" : "JunctionRecord",
        "url" : "/services/data/v59.0/sobjects/AccountContactJunction__c",
        "body" : {  
            "accountId__c" : "001xx000003DIpcAAG",
            "contactId__c" : "@{NewContact.id}"
        }
    }]
}

成功执行复合请求后的响应正文

{
  "compositeResponse" : [{
    "body" : null,
    "httpHeaders" : { },
    "httpStatusCode" : 204,
    "referenceId" : "UpdatedAccount"
  }, {
    "body" : {
      "id" : "003R00000025R22IAE",
      "success" : true,
      "errors" : [ ]
    },
    "httpHeaders" : {
      "Location" : "/services/data/v59.0/sobjects/Contact/003R00000025R22IAE"
    },
    "httpStatusCode" : 201,
    "referenceId" : "NewContact"
  }, {
    "body" : {
      "id" : "a00R0000000iN4gIAE",
      "success" : true,
      "errors" : [ ]
    },
    "httpHeaders" : {
      "Location" : "/services/data/v59.0/sobjects/AccountContactJunction__c/a00R0000000iN4gIAE"
    },
    "httpStatusCode" : 201,
    "referenceId" : "JunctionRecord"
  }]
}

更新记录并在单个中获取其字段值 请求

使用复合批处理资源在单个 API 中执行多个请求 叫。

以下示例更新帐户的名称并获取该帐户的一些字段 单个请求中的值。batch.json 文件包含 子请求数据。更新记录并在单个中查询其名称和帐单邮政编码 请求

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/composite/batch/ -H "Authorization: Bearer token -H "Content-Type: application/json" -d "@batch.json"

请求正文 batch.json 文件

{
"batchRequests" : [
    {
    "method" : "PATCH",
    "url" : "v59.0/sobjects/account/001D000000K0fXOIAZ",
    "richInput" : {"Name" : "NewName"}
    },{
    "method" : "GET",
    "url" : "v59.0/sobjects/account/001D000000K0fXOIAZ?fields=Name,BillingPostalCode"
    }]
}

成功执行子请求后的响应正文

{
   "hasErrors" : false,
   "results" : [{
      "statusCode" : 204,
      "result" : null
      },{
      "statusCode" : 200,
      "result": {
         "attributes" : {
            "type" : "Account",
            "url" : "/services/data/v59.0/sobjects/Account/001D000000K0fXOIAZ"
         },
         "Name" : "NewName",
         "BillingPostalCode" : "94105",
         "Id" : "001D000000K0fXOIAZ"
      }
   }]
}

另见

  • 复合批次

更新插入帐户并创建联系人

以下示例使用 Composite 资源更新插入帐户并创建一个 链接到该帐户的联系人。所有这些请求都在一次调用中执行。composite.json 文件包含复合请求和子请求 数据。更新插入帐户并创建联系人

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/composite/ -H "Authorization: Bearer token -H "Content-Type: application/json" -d "@composite.json"

请求正文 composite.json 文件

{
    "allOrNone" : true,
    "compositeRequest": [{
        "method": "PATCH",
        "url": "/services/data/v59.0/sobjects/Account/ExternalAcctId__c/ID12345",
        "referenceId": "NewAccount",
        "body": {
            "Name": "Acme"
        }
    },{
        "method" : "POST",
        "url" : "/services/data/v59.0/sobjects/Contact",
        "referenceId" : "newContact",
        "body" : {
            "LastName" : "Harrison",
            "AccountId" : "@{NewAccount.id}"
        }
    }]
}

成功执行复合请求后的响应正文

{
    "compositeResponse" : [{
        "body" : {
            "id" : "0016g00000Wqu1EAAR",
            "success" : true,
            "errors" : [ ],
            "created" : true
        },
        "httpHeaders" : {
            "Location" : "/services/data/v59.0/sobjects/Account/0016g00000Wqu1EAAR"
        },
        "httpStatusCode" : 201,
        "referenceId" : "NewAccount"
    },{
        "body" : {
            "id" : "0036g00000WKnfLAAT",
            "success" : true,
            "errors" : [ ]
        },
        "httpHeaders" : {
            "Location" : "/services/data/v59.0/sobjects/Contact/0036g00000WKnfLAAT"
        },
        "httpStatusCode" : 201,
        "referenceId" : "newContact"
    }]
}

另见

  • 按外部 ID 划分的 sObject 行

创建嵌套记录

使用 sObject 树资源创建共享根记录类型的嵌套记录。 例如,在单个请求中,您可以创建一个帐户及其子联系人, 第二个帐户及其子帐户和联系人。一旦请求 处理后,将创建记录,并通过 ID 自动链接父子。 在请求数据中,您提供记录层次结构、必填字段和可选字段值, 每条记录的类型,以及每条记录的引用 ID,然后使用 资源。如果请求是 成功的。否则,响应仅包含导致 错误和错误信息。

下面的示例创建两组嵌套记录。第一组包括一个 帐户和两个子项联系记录。第二组包括一个帐户,一个子 客户记录和 1 个子联系人记录。记录数据在 newrecords.json 中提供。创建两个新帐户及其子记录的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/composite/tree/Account/ -H "Authorization: Bearer token -H "Content-Type: application/json" -d "@newrecords.json"

用于创建两个请求正文 newrecords.json 文件的示例 新帐户及其子记录

{
"records" :[{
    "attributes" : {"type" : "Account", "referenceId" : "ref1"},
    "name" : "SampleAccount1",
    "phone" : "1234567890",
    "website" : "www.salesforce.com",
    "numberOfEmployees" : "100",
    "industry" : "Banking",
    "Contacts" : {
      "records" : [{
         "attributes" : {"type" : "Contact", "referenceId" : "ref2"},
         "lastname" : "Smith",
         "Title" : "President",
         "email" : "sample@salesforce.com"
         },{
         "attributes" : {"type" : "Contact", "referenceId" : "ref3"},
         "lastname" : "Evans",
         "title" : "Vice President",
         "email" : "sample@salesforce.com"
         }]
      }
    },{
    "attributes" : {"type" : "Account", "referenceId" : "ref4"},
    "name" : "SampleAccount2",
    "phone" : "1234567890",
    "website" : "www.salesforce.com",
    "numberOfEmployees" : "52000",
    "industry" : "Banking",
    "childAccounts" : {
      "records" : [{
        "attributes" : {"type" : "Account", "referenceId" : "ref5"},
        "name" : "SampleChildAccount1",
        "phone" : "1234567890",
        "website" : "www.salesforce.com",
        "numberOfEmployees" : "100",
        "industry" : "Banking"
        }]
      },
    "Contacts" : {
      "records" : [{
        "attributes" : {"type" : "Contact", "referenceId" : "ref6"},
        "lastname" : "Jones",
        "title" : "President",
        "email" : "sample@salesforce.com"
        }]
      }
  }]
}

成功创建记录和关系后的示例响应正文

{
    "hasErrors" : false,
    "results" : [{
     "referenceId" : "ref1",
     "id" : "001D000000K0fXOIAZ"
     },{
     "referenceId" : "ref4",
     "id" : "001D000000K0fXPIAZ"
     },{
     "referenceId" : "ref2",
     "id" : "003D000000QV9n2IAD"
     },{
     "referenceId" : "ref3",
     "id" : "003D000000QV9n3IAD"
     },{
     "referenceId" : "ref5",
     "id" : "001D000000K0fXQIAZ"
     },{
     "referenceId" : "ref6",
     "id" : "003D000000QV9n4IAD"
     }]
}

处理请求后,将使用父子项创建所有六条记录 请求中指定的关系。

另见

  • sObject 树

创建多条记录

虽然该资源可用于创建嵌套记录,但您可以 此外,创建多个相同类型的不相关记录。在单个请求中,您可以 创建多达 200 条记录。在请求数据中,提供必需和可选 每条记录的字段值、每条记录的类型以及每条记录的引用 ID,以及 然后使用资源的 POST 方法。响应正文将包含 如果请求成功,则创建记录。否则,响应仅包含 导致错误的记录的引用 ID 和错误信息。

以下示例创建四个新帐户。记录数据在 newrecords.json 中提供。创建四个新帐户的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/composite/tree/Account/ -H "Authorization: Bearer token -H "Content-Type: application/json" -d "@newrecords.json"

用于创建四个的请求正文 newrecords.json 文件示例 新账户

{
"records" :[{
    "attributes" : {"type" : "Account", "referenceId" : "ref1"},
    "name" : "SampleAccount1",
    "phone" : "1111111111",
    "website" : "www.salesforce.com",
    "numberOfEmployees" : "100",
    "industry" : "Banking"   
    },{
    "attributes" : {"type" : "Account", "referenceId" : "ref2"},
    "name" : "SampleAccount2",
    "phone" : "2222222222",
    "website" : "www.salesforce2.com",
    "numberOfEmployees" : "250",
    "industry" : "Banking"
    },{
    "attributes" : {"type" : "Account", "referenceId" : "ref3"},
    "name" : "SampleAccount3",
    "phone" : "3333333333",
    "website" : "www.salesforce3.com",
    "numberOfEmployees" : "52000",
    "industry" : "Banking"
    },{
    "attributes" : {"type" : "Account", "referenceId" : "ref4"},
    "name" : "SampleAccount4",
    "phone" : "4444444444",
    "website" : "www.salesforce4.com",
    "numberOfEmployees" : "2500",
    "industry" : "Banking"
    }]
}

成功创建记录后的示例响应正文

{
    "hasErrors" : false,
    "results" : [{
     "referenceId" : "ref1",
     "id" : "001D000000K1YFjIAN"
     },{
     "referenceId" : "ref2",
     "id" : "001D000000K1YFkIAN"
     },{
     "referenceId" : "ref3",
     "id" : "001D000000K1YFlIAN"
     },{
     "referenceId" : "ref4",
     "id" : "001D000000K1YFmIAN"     
     }]
}

另见

  • sObject 树

使用复合图

复合图提供了一种增强的方法来执行复合请求,这些请求执行 单个调用中的一系列 REST API 请求。

  • 常规复合请求允许您执行一系列 REST API 单个调用中的请求。您可以将一个请求的输出用作 输入到后续请求中。
  • 复合图扩展了常规的复合请求,允许您将 复杂而完整的一系列相关对象和记录。
  • 复合图还使您能够确保一组给定请求中的步骤是 要么全部完成,要么全部未完成。如果使用此选项,则不会 必须检查哪些请求成功。
  • 常规复合请求的子请求限制为 25 个。复合图增加了这一点 限制为 500。

定义复合图

通常,图形是连接节点的集合。

在复合的背景下 图操作,节点是复合子请求。例如,节点可以是 像这样复合子请求:

{
    "url" : "/services/data/v59.0/sobjects/Account/",
    "body" : {
        "name" : "Cloudy Consulting"
    },
    "method" : "POST",
    "referenceId" : "reference_id_account_1"
}

每个节点都有一个端点,表示 记录。

复合图形请求仅支持这些 URL。

网址支持的 HTTP 方法
/services/data/vXX.X/sobjects/sObject发布请参阅 sObject Basic 信息。
/services/data/vXX.X/sobjects/sObject/id删除、获取、修补请参见sObject 行。
/services/data/vXX.X/sobjects/sObject/customFieldName/externalId删除、获取、修补、发布请参见按外部 ID 划分的 sObject 行。

复合图可以定向,这意味着某些节点使用 来自其他节点的信息。例如,创建联系人的节点可以使用 用于将联系人与客户链接的 Account 节点的 ID。

为 例:

{
   "graphs": [{
      "graphId": "graph1",
      "compositeRequest": [{
            "body": {
               "name": "Cloudy Consulting"
            },
            "method": "POST",
            "referenceId": "reference_id_account_1",
            "url": "/services/data/v59.0/sobjects/Account/"
         },
         {
            "body": {
               "FirstName": "Nellie",
               "LastName": "Cashman",
               "AccountId": "@{reference_id_account_1.id}"
            },
            "method": "POST",
            "referenceId": "reference_id_contact_1",
            "url": "/services/data/v59.0/sobjects/Contact/"
         }
      ]
   }]
}

在 JSON 中定义复合图

复合图定义在 JSON是这样的:

{
    "graphId" : "graphId",
    graph
}

换句话说,像这样,每个都是复合子请求:

compositeSubrequest

{
    "graphId" : "graphId",
    "compositeRequest" : [
        compositeSubrequest,
        compositeSubrequest,
        ...
    ]
}

这些参数使您能够在查看响应时识别图形。他们需要 不能是数字,但它们必须遵循以下限制:

graphId

  • 它们在每个复合图操作中必须是唯一的。
  • 它们必须以字母数字字符开头。
  • 它们的长度必须少于 40 个字符。
  • 它们不能包含句点 (’.’)。

单个复合图请求可以使用一个或多个复合图。 请参阅使用复合图。

示例:创建客户、联系人、市场活动、商机、潜在顾客和 具有复合图请求的 CampaignMembers

此示例显示了执行以下操作的复合图:

  1. 创建帐户 1.
  2. 创建账户 2 作为账户 1 的子项。
  3. 创造:
    1. 联系人 1,链接到帐户 2。
    2. 联系人 2,向联系人 1 报告。
    3. 向联系人 2 报告的联系人 3。
  4. 创建广告系列。
  5. 创建一个链接到客户 2 和营销活动的机会。
  6. 创建潜在客户。
  7. 创建链接到潜在客户和营销活动的 CampaignMember。

此图的 JSON 为:

{
   "graphId" : "1",
   "compositeRequest" : [
      {
         "url" : "/services/data/v59.0/sobjects/Account/",
         "body" : {
           "name" : "Cloudy Consulting",
           "description" : "Parent account"
         },
         "method" : "POST",
         "referenceId" : "reference_id_account_1"
      },
      {
         "url" : "/services/data/v59.0/sobjects/Account/",
         "body" : {
           "name" : "Easy Spaces",
           "description" : "Child account",
          ."ParentId" : "@{reference_id_account_1.id}"
         },
         "method" : "POST",
         "referenceId" : "reference_id_account_2"
      },
      {
         "url" : "/services/data/v59.0/sobjects/Contact/",
         "body" : {
           "FirstName" : "Sam",
           "LastName" : "Steele",
           "AccountId" : "@{reference_id_account_2.id}"
         },
         "method" : "POST",
         "referenceId" : "reference_id_contact_1"
      },
      {
         "url" : "/services/data/v59.0/sobjects/Contact/",
         "body" : {
           "FirstName" : "Charlie",
           "LastName" : "Dawson",
           "ReportsToId" : "@{reference_id_contact_1.id}"
         },
         "method" : "POST",
         "referenceId" : "reference_id_contact_2"
      },
      {
         "url" : "/services/data/v59.0/sobjects/Contact/",
         "body" : {
           "FirstName" : "Nellie",
           "LastName" : "Cashman",
           "ReportsToId" : "@{reference_id_contact_2.id}"
         },
         "method" : "POST",
         "referenceId" : "reference_id_contact_3"
      },
      {
         "url" : "/services/data/v59.0/sobjects/Campaign/",
         "body" : {
           "name" : "Spring Campaign"
         },
         "method" : "POST",
         "referenceId" : "reference_id_campaign"
      },
      {
         "url" : "/services/data/v59.0/sobjects/Opportunity/",
         "body" : {
           "name" : "Opportunity",
           "stageName" : "Value Proposition",
           "closeDate" : "2025-12-31",
           "CampaignId" : "@{reference_id_campaign.id}",
           "AccountId" : "@{reference_id_account_2.id}"
         },
         "method" : "POST",
         "referenceId" : "reference_id_opportunity"
      },
      {
         "url" : "/services/data/v59.0/sobjects/Lead/",
         "body" : {
           "FirstName" : "Belinda",
           "LastName" : "Mulroney",
           "Company" : "Klondike Quarry",
           "Email" : "bmulroney@example.com"
         },
         "method" : "POST",
         "referenceId" : "reference_id_lead"
      },
      {
         "url" : "/services/data/v59.0/sobjects/CampaignMember/",
         "body" : {
           "CampaignId" : "@{reference_id_campaign.id}",
           "LeadId" : "@{reference_id_lead.id}"
         },
         "method" : "POST",
         "referenceId" : "reference_id_campaignmember"
      }
    ]
}

示例:获取有关资源的详细信息,然后在复合图中使用它们 请求

此示例演示如何对资源使用 GET,然后使用该资源的属性 资源。

{
   "graphs" : [
      {
         "graphId" : "graph1",
         "compositeRequest" : [
            {
               "method" : "GET",
               "url" : "/services/data/v59.0/sobjects/Account/001R0000003fSRrIAM",
               "referenceId" : "refAccount"
            },
            {
               "body" : {
                  "name" : "Amazing opportunity for @{refAccount.Name}",
                  "StageName" : "Stage 1",
                  "CloseDate" : "2025-06-01T23:28:56.782Z",
                  "AccountId" : "@{refAccount.Id}"
               },
               "method" : "POST",
               "url" : "/services/data/v59.0/sobjects/Opportunity",
               "referenceId" : "newOpportunity"
            }
         ]
      }
   ]
}

图形深度

  • 没有父节点的节点被视为深度为 1。
  • 另一个节点的深度是图中最大边数 深度 1 到该节点。当一个节点之间出现边时,两个节点之间会出现边 使用来自另一个节点的属性(如 )。@{reference_account.id}

AllOrNone 参数

在标准复合材料中 操作,则对发生错误时发生的情况的唯一控制是参数。如果值为 ,则整个复合请求为 回滚。如果值为 ,则 执行不依赖于失败子请求的其余子请求。 不执行依赖子请求,这可能会导致已处理和 未处理的记录。allOrNonetruefalse

复合图的优点是,每个图都保证完成所有 子请求成功或完全回滚。换言之,该参数是隐式的 考虑用于每个图形。一个 复合图形请求从不会导致已处理和未处理的混合 记录。allOrNonetrue

为确保图形独立,请遵循以下规则。

  1. 一个图中的子请求不能引用另一个图中的子请求。
  2. 一个复合图操作中的每个图都必须是独立的。如果一个图形 无法成功处理,这不能阻止其他图形 操作。

最佳实践

一般做法是使图形尽可能小。例如,它更多 拥有 50 个具有 10 个节点的图形而不是具有 500 个节点的 1 个图形是有效的。 保持图形较小有两个优点:

  • 如果图形中的某个项目失败,则仅回滚该图形中的项目。这更容易 识别和处理较小图形中的错误。
  • 服务器可以更快、更多地处理多个更小的图形 有效。

示例:提交复合图作业

有关如何提交复合图作业的示例,请参阅使用复合图。

使用复合图

此示例演示如何使用复合图。它还演示了一个请求如何使用多个复合图。

  • 常规复合请求允许您执行一系列 REST API 单个调用中的请求。您可以将一个请求的输出用作 输入到后续请求中。
  • 复合图扩展了常规的复合请求,允许您将 复杂而完整的一系列相关对象和记录。
  • 复合图还使您能够确保一组给定请求中的步骤是 要么全部完成,要么全部未完成。如果使用此选项,则不会 必须检查哪些请求成功。
  • 常规复合请求的子请求限制为 25 个。复合图增加了这一点 限制为 500。

创建请求:

curl -X POST curl https://MyDomainName.my.salesforce.com/services/data/v59.0/composite/graph -H "Authorization: Bearer token" -H "Content-Type: application/json" --data @data.json

其中,该文件包含 图。请求正文的一般格式为:data.json

{
  "graphs": [
    {
      "graphId": "graphId",
      "compositeRequest": [
        compositeSubrequest,
        compositeSubrequest,
        ...
      ]
    },
    {
      "graphId": "graphId",
      "compositeRequest": [
        compositeSubrequest,
        compositeSubrequest,
        ...
      ]
    },
    ...
  ]
}

其中 是复合子请求 结果。compositeSubrequest

例如,两个复合图形请求分别创建一个帐户,然后创建相关记录:

{
    "graphs" : [
        {
            "graphId" : "1",
            "compositeRequest" : [
                {
                    "url" : "/services/data/v59.0/sobjects/Account/",
                    "body" : {
                        "name" : "Cloudy Consulting"
                    },
                    "method" : "POST",
                    "referenceId" : "reference_id_account_1"
                },
                {
                    "url" : "/services/data/v59.0/sobjects/Contact/",
                    "body" : {
                        "FirstName" : "Nellie",
                        "LastName" : "Cashman",
                        "AccountId" : "@{reference_id_account_1.id}"
                    },
                    "method" : "POST",
                    "referenceId" : "reference_id_contact_1"
                },
                {
                    "url" : "/services/data/v59.0/sobjects/Opportunity/",
                    "body" : {
                        "CloseDate" : "2024-05-22",
                        "StageName" : "Prospecting",
                        "Name" : "Opportunity 1",
                        "AccountId" : "@{reference_id_account_1.id}"
                    },
                    "method" : "POST",
                    "referenceId" : "reference_id_opportunity_1"
                }
            ]
        },
        {
            "graphId" : "2",
            "compositeRequest" : [
                {
                    "url" : "/services/data/v59.0/sobjects/Account/",
                    "body" : {
                        "name" : "Easy Spaces"
                    },
                    "method" : "POST",
                    "referenceId" : "reference_id_account_2"
                },
                {
                    "url" : "/services/data/v59.0/sobjects/Contact/",
                    "body" : {
                        "FirstName" : "Charlie",
                        "LastName" : "Dawson",
                        "AccountId" : "@{reference_id_account_2.id}"
                    },
                    "method" : "POST",
                    "referenceId" : "reference_id_contact_2"
                }
            ]
        }
    ]
}

响应是:

{
   "graphs" : [
      {
         "graphId" : "1",
         "graphResponse" : {
            "compositeResponse" : [
               {
                  "body" : {
                     "id" : "001R00000064wc7IAA",
                     "success" : true,
                     "errors" : [ ]
                  },
                  "httpHeaders" : {
                     "Location" : "/services/data/v59.0/sobjects/Account/001R00000064wc7IAA"
                  },
                  "httpStatusCode" : 201,
                  "referenceId" : "reference_id_account_1"
               },
               {
                  "body" : {
                     "id" : "003R000000DDMlTIAX",
                     "success" : true,
                     "errors" : [ ]
                  },
                  "httpHeaders" : {
                     "Location" : "/services/data/v59.0/sobjects/Contact/003R000000DDMlTIAX"
                  },
                  "httpStatusCode" : 201,
                  "referenceId" : "reference_id_contact_1"
               },
               {
                  "body" : {
                     "id" : "006R0000003FPYxIAO",
                     "success" : true,
                     "errors" : [ ]
                  },
                  "httpHeaders" : {
                     "Location" : "/services/data/v59.0/sobjects/Opportunity/006R0000003FPYxIAO"
                  },
                  "httpStatusCode" : 201,
                  "referenceId" : "reference_id_opportunity_1"
               }
            ]
         },
         "isSuccessful" : true
      },
      {
         "graphId" : "2",
         "graphResponse" : {
            "compositeResponse" : [
               {
                  "body" : {
                     "id" : "001R00000064wc8IAA",
                     "success" : true,
                     "errors" : [ ]
                  },
                  "httpHeaders" : {
                     "Location" : "/services/data/v59.0/sobjects/Account/001R00000064wc8IAA"
                  },
                  "httpStatusCode" : 201,
                  "referenceId" : "reference_id_account_2"
               },
               {
                  "body" : {
                     "id" : "003R000000DDMlUIAX",
                     "success" : true,
                     "errors" : [ ]
                  },
                  "httpHeaders" : {
                     "Location" : "/services/data/v59.0/sobjects/Contact/003R000000DDMlUIAX"
                  },
                  "httpStatusCode" : 201,
                  "referenceId" : "reference_id_contact_2"
               }
            ]
         },
         "isSuccessful" : true
      }
   ]
}

有关更多信息,请参阅使用复合图。

allOrNone(全部或无)复合请求和集合请求中的参数

如果 Composite 请求使用 sObject 集合,则有两个或多个参数可以交互,一个在 Composite 请求上,另一个在 每个 sObject 集合子请求。

allOrNone

  • 如果 Composite 请求已设置为 ,则 all-or-none 行为也适用于每个 sObject 集合子请求,覆盖子请求中的值。allOrNonetrueallOrNone
  • 如果 Composite 请求已设置为 ,则每个 sObject Collections 子请求的行为 根据其值 .allOrNonefalseallOrNone

例如,考虑此作业会发生什么情况,其中复合请求包含两个项:sObject 集合请求和创建联系人的请求。sObject 的 集合请求尝试创建两个帐户,其中一个失败,因为已经存在具有相同信息的现有帐户。

POST https://MyDomainName.my.salesforce.com/services/data/v59.0/composite -H "Authorization: Bearer token"

{
   "allOrNone" : outerFlag,
   "collateSubrequests" : false,
   "compositeRequest" : [
      {
         "method" : "POST",
         "url" : "/services/data/v59.0/composite/sobjects",
         "body" : {
            "allOrNone" : innerFlag,
            "records" : [
               {
                  "attributes" : { "type" : "Account" },
                  "Name" : "Northern Trail Outfitters",
                  "BillingCity" : "San Francisco"
               },
               {
                  "attributes" : { "type" : "Account" },
                  "Name" : "Easy Spaces",
                  "BillingCity" : "Calgary"
               }
            ]
         },
         "referenceId" : "newAccounts"
      },
      {
         "method" : "POST",
         "url" : "/services/data/v59.0/sObject/Contact",
         "body" : {
                "FirstName" : "John",
                "LastName" : "Smith"
         },
         "referenceId" : "newContact"
      }
   ]
}

和参数是 either 或 ,这会导致四种可能的情况。outerFlaginnerFlagtruefalse

案例 1:outerFlag = false,innerFlag = false

在本例中,两个请求均未设置为 ,因此两者都未设置为 。 请求已回滚。一个帐户已创建,另一个帐户失败。allOrNonetrue

案例 2:outerFlag = false,innerFlag = true

在本例中,内部 sObject 集合请求已设置为 ,因此会回滚。外部 Composite 请求不会回滚。allOrNonetrue

案例 3:outerFlag = true,innerFlag = true

在这种情况下,两者 requests 已设置为 ,因此它们都会回滚。allOrNonetrue

案例 4:outerFlag = true,innerFlag = false响应正文 这种情况是:

{
   "compositeResponse" : [
      {
         "body" : [
            {
               "id" : "001R00000066cndIAA",
               "success" : true,
               "errors" : [ ]
            },
            {
               "success" : false,
               "errors" : [
                  {
                     "statusCode" : "DUPLICATES_DETECTED",
                     "message" : "Use one of these records?",
                     "fields" : [ ]
                  }
               ]
            }
         ],
         "httpHeaders" : { },
         "httpStatusCode" : 200,
         "referenceId" : "collection1"
      },
      {
         "body" : [
            {
               "errorCode" : "PROCESSING_HALTED",
               "message" : "The transaction was rolled back since another operation in the same transaction failed."
            }
         ],
         "httpHeaders" : { },
         "httpStatusCode" : 400,
         "referenceId" : "newContact"
      }
   ]
}

在 在这种情况下,内部 sObject 集合请求已设置为 ,因此不会立即回滚。 但是,外部 Composite 请求已设置为 因此会回滚,这也会回滚 内部 sObject 集合请求。allOrNonefalseallOrNonetrue

注意

即使响应 sObject Collections 请求的正文显示了第一个 Account 的创建,即 Composite 请求被回滚的事实 表示帐户创建已回滚。最终结果是不会创建新帐户。“success” : true

为 sObjects REST API 生成 OpenAPI 3.0 文档 (测试版)

在此测试版中,您可以为 sObjects REST API 生成 OpenAPI 文档。

注意

此功能是一项测试版服务。客户可自行决定是否试用此类测试版服务。对测试版服务的任何使用均受协议和条款中提供的适用测试版服务条款的约束。

使用此测试版功能,您可以生成一个 OpenAPI 文档,该文档表示 六个 sObjects REST 反映您的自定义和配置的 API 资源。

支持的版本

此测试版功能适用于启用了 API 的 Developer Edition、Partner Developer Edition、沙盒和临时组织。

关于文档

OpenAPI 文档遵循 OpenAPI 规范的 3.0.1 版。有关详细信息,请参阅 https://www.openapis.org。

注意

此测试版 OpenAPI 文档可能会发生变化。请勿基于此 OpenAPI 文档构建生产集成。

OpenAPI 文档涵盖的内容

本 OpenAPI 文档介绍了这些 REST API 资源,您可以使用这些资源来检索、创建和更新对象数据。

  1. /services/data/v59.0/sobjects
    • 列出数据的可用对象及其元数据。提供组织编码和查询中允许的最大批大小。
    • 请参阅描述 全球。
  2. /services/data/v59.0/sobjects/sObject
    • 描述指定对象的单个元数据。可以创建对象记录。例如,使用 GET 方法检索 Account 对象的元数据,或者 使用 POST 方法创建一个 Account 对象。
    • 请参阅 sObject Basic 信息。
  3. /services/data/v59.0/sobjects/{sObject}/describe
    • 描述 sObject 的所有级别的单个元数据
    • 请参阅 sObject 描述。
  4. /services/data/v59.0/sobjects/sObject/{id}
    • 根据指定的对象 ID 访问记录。检索、更新或删除记录。可以检索字段值。使用 GET 方法检索记录或字段, DELETE 方法用于删除记录,PATCH 方法用于更新记录。
    • 请参阅 sObject 行。
  5. /services/data/v59.0/sobjects/{sObject}/deleted
    • 检索 sObject 的时间跨度内单个已删除记录的列表
    • 请参阅 sObject 被删除。
  6. /services/data/vXX.X/sobjects/{sObject}/{id}/{blobField}
    • 从单个记录中检索指定的 blob 字段,并将其作为二进制数据返回
    • 请参阅 sObject Blob Get。

启用 Beta 版

若要启用此测试版,请按照下列步骤操作。您必须具有“修改所有数据”或“自定义应用程序”权限。

  1. 在“设置”的“快速查找”框中,输入 ,然后选择“用户界面”。User Interface
  2. 在“用户界面”页面上,选择“启用 Salesforce Platform REST API、OpenAPI 3.0 规范生成(测试版)”。注意选择此项表示您接受 协议和条款中提供的测试版服务条款。

生成 OpenAPI 文档

开启 beta 功能后,按照以下步骤生成 OpenAPI 文档。

  1. 发送 POST 请求 自https://MyDomainName.my.salesforce.com/services/data/vXX.X/async/specifications/oas3注意这 API 版本 56.0 中的过程与早期 API 版本中的过程进行了更改。此步骤现在使用 POST 请求而不是 GET 请求。中的 API 版本 此 POST 请求 必须为 54.0 或更高。XX.X如果服务器在处理请求时遇到错误,它会报告“失败”状态并返回 4xx 或 5xx 状态。请求正文必须是{ "resources" : [ selectors ] }哪里可以selectors
    • “*”(获取所有资源)
    • 或者,以下一个或多个选择器(仅获取 OpenAPI 文档的特定部分)
      • “/services/data/v59.0/sobjects”
      • “/services/data/v59.0/sobjects/sObject其中可以是您在组织中有权访问的任何标准或自定义对象的名称sObject
      • “/services/data/v59.0/sobjects/sObject/{id}”
      • “/services/data/v59.0/sobjects/sObject/deleted”
      • “/services/data/v59.0/sobjects/{sObject}/deleted”
      • “/services/data/v59.0/sobjects/sObject/describe”
      • “/services/data/v59.0/sobjects/{sObject}/describe”
      • “/services/data/v59.0/sobjects/{sObject}/{id}/{blobField}”
      注意{blobField}、 和 必须输入 按照字面。它们不是变量。{id}{sObject}注意不要在选择器的末尾添加尾部斜杠,例如,检索 无。“/services/data/v59.0/sobjects/”注意对于 和 选择器,可以使用字面名称或对象名称。对于所有对象,这些请求的响应正文都是相同的。/describe/deleted{sObject}注意中的 API 版本 选择器必须是最新版本 v59.0。(这确实 不需要与步骤 1 中的 POST 请求或步骤 3 中的 GET 请求相同。例如{ "resources" : ["*"] }{ "resources" : [ "/services/data/v59.0/sobjects", "/services/data/v59.0/sobjects/Contact", "/services/data/v59.0/sobjects/Lead", "/services/data/v59.0/sobjects/Lead/{id}", "/services/data/v59.0/sobjects/{sObject}/deleted", "/services/data/v59.0/sobjects/Account/describe", "/services/data/v59.0/sobjects/{sObject}/{id}/{blobField}" ] }
  2. 假设可以无错误地解析请求,则服务器使用 HTTP 状态代码 202 (Accepted) 和包含 URI 的 JSON 响应正文进行响应,您可以在其中获取 OpenAPI 文档。例如:HTTP/1.1 202 Accepted { "href" : "/v59.0/async/specifications/oas3/NTByUjAwMDAwMDAwMDBh" }此 URI 的最后一部分(在此示例中)是 OpenAPI 的定位器 ID 公文。NTByUjAwMDAwMDAwMDBh
  3. 将 GET 请求发送到追加了定位器 ID 的同一 URI。为 例:https://MyDomainName.my.salesforce.com/services/data/vXX.X/​async/​specifications/​oas3/​NTByUjAwMDAwMDAwMDBh这 此 GET 请求中的 API 版本必须为 54.0 或更高版本。XX.X
    1. 如果服务器尚未完成 OpenAPI 文档的准备工作,它将使用 202(已接受)状态代码和状态消息“未启动”或“正在进行”进行响应。为 例:HTTP/1.1 202 Accepted { "status" : "In Progress" }
    2. 如果服务器已完成,它将以 200 (OK) 状态进行响应,并在响应正文中返回 OpenAPI 文档。例如:HTTP/1.1 200 OK{ "openapi": "3.0.1", "info": { "title": "Lightning Platform REST API", "description": "REST API provides you with programmatic access to your data in Salesforce. The flexibility and scalability of REST API make it an excellent choice for integrating Salesforce into your applications and for performing complex operations on a large scale. You can use REST API tools to create, manipulate, and search data in Salesforce by sending HTTP requests to endpoints in Salesforce. Depending on where you send requests, you access and operate on different pieces of information, called resources. Resources include records, query results, metadata, and more. ", "version": "59.0 }, "servers": [ ... ], "security": [ ... ], "paths": { "/sobjects": { ... }, "/sobjects/Contact": { ... }, "/sobjects/Lead": { ... }, "/sobjects/Lead/{id}": { ... }, "/sobjects/{sObject}/deleted": { ... }, "/sobjects/{sObject}/describe": { ... }, "/sobjects/{sObject}/{id}/{blobField}": { ... } }, "components": { ... } }

生成 OpenAPI 文档后,可以在 48 小时内使用相同的定位器 ID 再次检索 OpenAPI 文档。48 小时后,使用该定位器 ID 将生成 404 (未找到)错误。

每个用户只能每 6 小时生成一个新的 OpenAPI 文档。如果您在最后一次通话后 6 小时内再次致电 生成,即使使用不同的请求正文,API 也会返回相同的定位器 ID。/async/specifications/oas3

如果选择的资源与任何受支持的资源都不匹配,或者选择的资源无权访问,则请求不会失败,但 OpenAPI 文档将不包含该资源,其路径在 OpenAPI 文档中将不可见。

提供反馈

要向我们提供反馈,请登录 Trailhead,然后加入 OpenAPI 规范 Salesforce REST API 开拓者社区。

您的反馈很有价值,可以帮助我们发现存在的问题并激发未来的变革。我们正在寻找一般印象、改进建议、错误和反馈 好吧,这个 OpenAPI 文档与您的 OpenAPI 用例保持一致。

使用搜索和查询

本节中的示例使用 REST API 资源来搜索和查询记录 使用 Salesforce 对象搜索语言 (SOSL) 和 Salesforce 对象查询语言 (SOQL),以及 其他搜索 API。有关 SOSL 和 SOQL 的详细信息,请参阅 SOQL 和 SOSL 参考

  • 执行 SOQL 查询 使用 Query 资源执行 SOQL 查询,该查询
    在单个响应中返回所有结果,或者如果需要,返回部分结果和用于检索其余结果的定位器。
  • 执行包含已删除项目的
    SOQL 查询 使用 QueryAll 资源执行 SOQL 查询,该查询包含有关因合并或删除而删除的记录的信息。使用 QueryAll 而不是 Query,因为 Query 资源将自动筛选出已删除的项。
  • 获取有关查询性能的反馈(测试版)
    要获取有关 Salesforce 如何执行查询、报表或列表视图的反馈,请使用 Query 资源和 explain 参数。Salesforce 会分析每个查询,以找到获取查询结果的最佳方法。根据查询和查询筛选器,Salesforce 使用索引或内部优化。要返回有关 Salesforce 如何优化查询的详细信息,而无需实际运行查询,请使用 explain 参数。根据响应,决定是否微调查询的性能,例如添加筛选器以使查询更具选择性。
  • 搜索字符串
    使用 Search 资源执行 SOSL 搜索,或使用 Parameterized Search 资源执行不带 SOSL 的简单 RESTful 搜索。
  • 获取默认搜索范围和顺序 使用“搜索范围和顺序”资源检索登录用户的默认全局搜索范围和顺序
    ,包括用户搜索结果页中的任何固定对象。
  • 获取对象的搜索结果布局 使用“搜索结果布局”资源检索查询字符串中指定的每个对象
    的搜索结果布局配置。
  • 查看相关项目 使用“相关项目
    ”资源获取相关记录的列表。

执行 SOQL 查询

使用 Query 资源执行 SOQL 查询,该查询在单个响应中返回所有结果,或者 如果需要,返回部分结果和用于检索剩余结果的定位器 结果。

以下查询请求所有 name 字段中的值 帐户记录。执行查询的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/query/?q=SELECT+name+from+Account -H "Authorization: Bearer token"

用于执行查询的示例请求正文不需要用于执行查询的示例响应正文

{
    "done" : true,
    "totalSize" : 14,
    "records" : 
    [ 
        {  
            "attributes" : 
            {    
                "type" : "Account",    
                "url" : "/services/data/v59.0/sobjects/Account/001D000000IRFmaIAH"  
            },  
            "Name" : "Test 1"
        }, 
        {  
            "attributes" : 
            {    
                "type" : "Account",    
                "url" : "/services/data/v59.0/sobjects/Account/001D000000IomazIAB"  
            },  
            "Name" : "Test 2"
        }, 

        ...

    ]
}

检索剩余的 SOQL 查询 结果

如果初始查询仅返回部分结果,则响应结束 包含一个名为 :

nextRecordsUrl

"nextRecordsUrl" : "/services/data/v59.0/query/01gD0000002HU6KIAW-2000"

在这种情况下,请求下一批记录并重复,直到所有记录都 被检索到。这些请求使用 ,并且不包含任何参数。nextRecordsUrl检索剩余查询结果的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/query/01gD0000002HU6KIAW-2000 -H "Authorization: Bearer token"

用于检索剩余查询结果的示例请求正文不需要用于检索剩余查询结果的示例响应正文

{
    "done" : true,
    "totalSize" : 3214,
    "records" : [...]
}

执行包含以下内容的 SOQL 查询 已删除的项目

使用 QueryAll 资源执行 SOQL 查询,其中包括 有关因合并或删除而删除的记录的信息。用 QueryAll 而不是 Query,因为 Query 资源将自动筛选掉 已删除的项目。

以下查询请求所有 Name 字段中的值 已删除的Merchandise__c记录,在具有一个已删除Merchandise__c的组织中 记录。使用 Query 而不是 QueryAll 的同一查询不会返回任何记录,因为 查询会自动从结果集中筛选出任何已删除的记录。对已删除的Merchandise__c记录执行查询的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/queryAll/?q=SELECT+Name+from+Merchandise__c+WHERE+isDeleted+=+TRUE -H "Authorization: Bearer token"

用于执行查询的示例请求正文不需要用于执行查询的示例响应正文

{
    "done" : true,
    "totalSize" : 1,
    "records" : 
    [ 
        {  
            "attributes" : 
            {    
                "type" : "Merchandise__c",    
                "url" : "/services/data/v59.0/sobjects/Merchandise__c/a00D0000008pQRAIX2"  
            },  
            "Name" : "Merchandise 1"
        }, 
    ]
}

检索剩余的 SOQL 查询 结果

如果初始查询仅返回部分结果,则响应的末尾将 包含一个名为 的字段。为 例如,您可能会在 查询:

nextRecordsUrl

"nextRecordsUrl" : "/services/data/v59.0/query/01gD0000002HU6KIAW-2000"

在这种情况下,请求下一批记录并重复,直到所有记录都 被检索到。这些请求使用 ,并且不包含任何参数。nextRecordsUrl

虽然有 URL 时,它仍会提供初始 QueryAll 请求的剩余结果。 其余结果包括与初始匹配的已删除记录 查询。nextRecordsUrlquery检索剩余结果的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/query/01gD0000002HU6KIAW-2000 -H "Authorization: Bearer token"

用于检索其余结果的示例请求正文不需要用于检索剩余结果的示例响应正文

{
    "done" : true,
    "totalSize" : 3214,
    "records" : [...]
}

获取有关查询性能的反馈(测试版)

要获取有关 Salesforce 如何执行查询、报告或列表视图的反馈,请使用 Query 资源以及 explain 参数。Salesforce 会分析每个查询以找到最佳查询 方法获取查询结果。根据查询和查询筛选器,Salesforce 使用索引或内部优化。要返回有关 Salesforce 如何优化 query,而不实际运行查询,使用 explain 参数。 根据响应,决定是否微调查询的性能,例如添加 筛选器,使查询更具选择性。

注意

此功能是一项测试版服务。客户可以选择单独试用此类测试版服务 自由裁量权。对测试版服务的任何使用均受适用的测试版服务条款的约束 在协议和条款中提供。

响应包含一个或多个查询执行计划,按从最优到最少的顺序排序 最佳的。最佳计划是当查询、报表或列表视图为 执行。

有关使用 explain 时返回的字段的更多详细信息,请参阅查询选项标头中的 explain 参数。查看更多 有关使查询更具选择性的信息,请参阅使用超大型 SOQL 《Apex 开发人员指南》中的查询。

示例:对查询性能的反馈

以下性能反馈查询使用:Merchandise__c

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/query/?explain=
SELECT+Name+FROM+Merchandise__c+WHERE+CreatedDate+=+TODAY+AND+Price__c+>+10.0

性能反馈查询的响应正文如下所示:

{
  "plans" : [ {
    "cardinality" : 1,
    "fields" : [ "CreatedDate" ],
    "leadingOperationType" : "Index",
    "notes" :  [ {
      "description" : "Not considering filter for optimization because unindexed",
      "fields" : [ "IsDeleted" ],
      "tableEnumOrId" : "Merchandise__c"
    } ],
    "relativeCost" : 0.0,
    "sobjectCardinality" : 3,
    "sobjectType" : "Merchandise__c"
  }, {
    "cardinality" : 1,
    "fields" : [ ],
    "leadingOperationType" : "TableScan",
    "notes" :  [ {
      "description" : "Not considering filter for optimization because unindexed",
      "fields" : [ "IsDeleted" ],
      "tableEnumOrId" : "Merchandise__c"
    } ],
    "relativeCost" : 0.65,
    "sobjectCardinality" : 3,
    "sobjectType" : "Merchandise__c"
  } ]
}

此响应表明 Salesforce 为此查询找到了两个可能的执行计划。 第一个计划使用 CreatedDate 索引字段来提高此查询的性能。 第二个计划在不使用索引的情况下扫描所有记录。如果执行查询,则 使用第一个计划。这两个计划都指出,没有用于过滤的二次优化 标记为已删除的记录,因为 IsDeleted 字段未编制索引。

搜索字符串

使用搜索资源执行 SOSL 搜索或使用 参数化搜索资源,用于执行简单的 RESTful 搜索,而无需 SOSL的。

SOSL 示例 使用 GET 方法进行搜索

以下示例执行 SOSL 搜索。此示例中的搜索字符串必须经过 URL 编码。

Acme示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/search/?q=FIND+%7BAcme%7D -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

{
  "searchRecords" : [ {
    "attributes" : {
      "type" : "Account",
      "url" : "/services/data/v59.0/sobjects/Account/001D000000IqhSLIAZ"
    },
    "Id" : "001D000000IqhSLIAZ",
  }, {
    "attributes" : {
      "type" : "Account",
      "url" : "/services/data/v59.0/sobjects/Account/001D000000IomazIAB"
    },
    "Id" : "001D000000IomazIAB",
  } ]
}

使用 GET 方法的参数化搜索示例

以下示例 执行对 的参数化搜索。这 此示例中的搜索字符串必须经过 URL 编码。

Acme示例用法对包含 Acme 的所有结果进行全局搜索

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/parameterizedSearch/?q=Acme -H "Authorization: Bearer token"

帐户搜索包含 Acme 的结果,返回 id 和 名称字段

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/parameterizedSearch/?q=Acme&sobject=Account&Account.fields=id,name&Account.limit=10 -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

{
  "searchRecords" : [ {
    "attributes" : {
      "type" : "Account",
      "url" : "/services/data/v59.0/sobjects/Account/001D000000IqhSLIAZ"
    },
    "Id" : "001D000000IqhSLIAZ"
  }, {
    "attributes" : {
      "type" : "Account",
      "url" : "/services/data/v59.0/sobjects/Account/001D000000IomazIAB"
    },
    "Id" : "001D000000IomazIAB"
  } ]
}

具有元数据参数的示例响应正文

注意

仅当 请求指定 。metadata=LABELS

{
  "searchRecords" : [ {
    "attributes" : {
      "type" : "Account",
      "url" : "/services/data/v59.0/sobjects/Account/001D000000IqhSLIAZ"
    },
    "Id" : "001D000000IqhSLIAZ",
  }, {
    "attributes" : {
      "type" : "Account",
      "url" : "/services/data/v59.0/sobjects/Account/001D000000IomazIAB"
    },
    "Id" : "001D000000IomazIAB",
  } ],
  "metadata" : {
    "entityetadata" : [ {
      "entityName" : "Account",
      "fieldMetadata" : [ {

        "name" : "Name",
        "label" : "Account Name"
       } ]
    } ]
  }
}

使用 POST 方法的参数化搜索示例

执行一个 使用 POST 方法进行参数化搜索,以访问所有可用的搜索功能。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/parameterizedSearch "Authorization: Bearer token" -H "Content-Type: application/json” -d "@search.json”

示例请求正文不需要示例 JSON 文件

{
    "q":"Smith",
    "fields" : ["id", "firstName", "lastName"],
    "sobjects":[{"fields":["id", "NumberOfEmployees"],
	          "name": "Account", 
	          "limit":20},
	         {"name": "Contact"}],
    "in":"ALL",
    "overallLimit":100,
    "defaultLimit":10
}

示例响应正文

{
  "searchRecords" : [ {
    "attributes" : {
      "type" : "Contact",
      "url" : "/services/data/v59.0/sobjects/Contact/003xx000004TraiAAC"
    },
    "Id" : "003xx000004TraiAAC",
    "FirstName" : "Smith",
    "LastName" : "Johnson"
  }, {
    "attributes" : {
      "type" : "Account",
      "url" : "/services/data/v59.0/sobjects/Account/001xx000003DHXnAAO"
    },
    "Id" : "001xx000003DHXnAAO",
    "NumberOfEmployees" : 100
  } ]
}

另见

  • 搜索
  • 参数化搜索

获取默认搜索范围和顺序

使用“搜索范围和顺序”资源检索 已登录用户,包括用户搜索结果中的任何固定对象 页。

在以下示例中,登录用户的默认全局搜索范围包括 网站、想法、案例、商机、客户和用户对象,按以下顺序排列 它们在响应正文中返回。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/search/scopeOrder -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

[
  {
    "type":"Site",
    "url":"/services/data/v59.0/sobjects/Site/describe"
  },
  {
    "type":"Idea",
    "url":"/services/data/v59.0/sobjects/Idea/describe"
  },
  {
    "type":"Case",
    "url":"/services/data/v59.0/sobjects/Case/describe"
  },
  {
    "type":"Opportunity",
    "url":"/services/data/v59.0/sobjects/Opportunity/describe"
  },
  {
    "type":"Account",
    "url":"/services/data/v59.0/sobjects/Account/describe"
  },
  {
    "type":"User",
    "url":"/services/data/v59.0/sobjects/User/describe"
  }
]

获取对象的搜索结果布局

使用“搜索结果布局”资源检索每个对象的搜索结果布局配置 在查询字符串中指定。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/search/layout/?q=Account,Contact,Lead,Asset "Authorization: Bearer token"

示例请求正文不需要示例响应正文

[ { "label" : "Search Results",
    "limitRows" : 25,
    "searchColumns" : [ { "field" : "Account.Name",
          "format" : null,
          "label" : "Account Name",
          "name" : "Name"
        },
        { "field" : "Account.Site",
          "format" : null,
          "label" : "Account Site",
          "name" : "Site"
        },
        { "field" : "Account.Phone",
          "format" : null,
          "label" : "Phone",
          "name" : "Phone"
        },
        { "field" : "User.Alias",
          "format" : null,
          "label" : "Account Owner Alias",
          "name" : "Owner.Alias"
        }
      ]
  },
  { "label" : "Search Results",
    "limitRows" : 25,
    "searchColumns" : [ { "field" : "Contact.Name",
          "format" : null,
          "label" : "Name",
          "name" : "Name"
        },
        { "field" : "Account.Name",
          "format" : null,
          "label" : "Account Name",
          "name" : "Account.Name"
        },
        { "field" : "Account.Site",
          "format" : null,
          "label" : "Account Site",
          "name" : "Account.Site"
        },
        { "field" : "Contact.Phone",
          "format" : null,
          "label" : "Phone",
          "name" : "Phone"
        },
        { "field" : "Contact.Email",
          "format" : null,
          "label" : "Email",
          "name" : "Email"
        },
        { "field" : "User.Alias",
          "format" : null,
          "label" : "Contact Owner Alias",
          "name" : "Owner.Alias"
        }
      ]
  },
  { "label" : "Search Results",
    "limitRows" : 25,
    "searchColumns" : [ { "field" : "Lead.Name",
          "format" : null,
          "label" : "Name",
          "name" : "Name"
        },
        { "field" : "Lead.Title",
          "format" : null,
          "label" : "Title",
          "name" : "Title"
        },
        { "field" : "Lead.Phone",
          "format" : null,
          "label" : "Phone",
          "name" : "Phone"
        },
        { "field" : "Lead.Company",
          "format" : null,
          "label" : "Company",
          "name" : "Company"
        },
        { "field" : "Lead.Email",
          "format" : null,
          "label" : "Email",
          "name" : "Email"
        },
        { "field" : "Lead.Status",
          "format" : null,
          "label" : "Lead Status",
          "name" : "toLabel(Status)"
        },
        { "field" : "Name.Alias",
          "format" : null,
          "label" : "Owner Alias",
          "name" : "Owner.Alias"
        }
      ]
  },
]

查看相关项目

使用“相关项目”资源获取相关项目列表 记录。获取当前用户最相关列表的示例用法 记录

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/relevantItems -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

[ {
    "apiName" : "Contact",
    "key" : "003",
    "label" : "Contacts",
    "lastUpdatedId" : "135866748",
    "recordIds" : [ "003xx000004TxBA" ]
}, {   "apiName" : "Account",
    "key" : "001",
    "label" : "Accounts",
    "lastUpdatedId" : "193640553",
    "recordIds" : [ "001xx000003DWsT" ]
}, {
    "apiName" : "User",
    "key" : "005",
    "label" : "Users",
    "lastUpdatedId" : "-199920321",
    "recordIds" : [ "005xx000001Svqw", "005xx000001SvwK", "005xx000001SvwA" ]
}, {  "apiName" : "Case",
    "key" : "069",
    "label" : "Cases",
    "lastUpdatedId" : "1033471693",
    "recordIds" : [ "069xx0000000006", "069xx0000000001", "069xx0000000002" ]
} ]

筛选对特定对象的响应的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/relevantItems?sobjects=Account,User -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

[ {
    "apiName" : "Account",
    "key" : "001",
    "label" : "Accounts",
    "lastUpdatedId" : "193640553",
    "recordIds" : [ "001xx000003DWsT" ]
}, {
  "apiName" : "User",
    "key" : "005",
    "label" : "Users",
    "lastUpdatedId" : "102959935",
    "recordIds" : [ "005xx000001Svqw", "005xx000001SvwK", "005xx000001SvwA" ]
} ]

将用户的当前相关记录列表与 以前的版本

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/relevantItems?lastUpdatedId=102959935 -H "Authorization: Bearer token"

示例请求正文不需要示例响应标头

lastUpdatedId: 102959935
newResultSetSinceLastQuery: true

示例响应正文

[ {
    "apiName" : "User",
    "key" : "003",
    "label" : "Users",
    "lastUpdatedId" : "102959935",
    "recordIds" : [ "003xx000004TxBA" ]
}, {
    "apiName" : "Account",
    "key" : "001",
    "label" : "Accounts",
    "lastUpdatedId" : "193640553",
    "recordIds" : [ "001xx000003DWsT" ]
}, {
    "apiName" : "Case",
    "key" : "005",
    "label" : "Cases",
  "lastUpdatedId" : "1740766611",
    "recordIds" : [ "005xx000001Svqw", "005xx000001SvwA" ]
} ]

将用户的当前相关记录列表与 特定对象的先前版本

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/relevantItems?mode=MRU&sobjects=Account,Contact&Account.lastUpdatedId=102959935 -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

[ {
    "apiName" : "Account",
    "key" : "001",
    "label" : "Accounts",
    "lastUpdatedId" : "193640553",
    "recordIds" : [ "001xx000003DWsT" ]
} ]

另见

  • sObject 相关项目

删除 Lightning Experience 事件系列

使用 HTTP DELETE 方法删除序列中的一个或多个 IsRecurrence2 事件。你 可以删除单个事件、特定事件之后的所有事件(包括特定事件)或整个事件 系列。

删除序列中的单个事件

使用 sObject Rows 资源删除事件记录。删除 系列中,指定事件 ID 并使用资源来删除记录。

从系列中删除多个事件或所有事件

若要删除序列中特定事件及以后的所有事件,请指定事件 ID 并使用资源的 DELETE 方法删除记录。调用此方法时, IsRecurrence2 必须为 true,IsRecurrence2Exclusion 必须为 false。

若要删除整个事件系列,请指定该系列中第一个事件的事件 ID 并使用资源的 DELETE 方法删除记录。从系列中删除多个事件或所有事件的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Event/00Uxx0000000000/fromThisEventOnwards -H "Authorization: Bearer token" -X DELETE

示例请求正文

None needed

成功删除事件后的示例响应正文

{
success: We’re deleting the selected events from the series. Wait for all events to be removed. 
}

考虑

从事件中删除不支持来自以下事件的调用:

  • 发生在 Recurrence2PatternStartDate 的原始值之前。
  • 定义为子事件。

如果事件系列源自 Salesforce 外部,并且事件 ID 为第一次 不可用,则无法删除系列中的所有事件。相反,请从特定 发生。

从富文本区域字段获取图像

使用 sObject 富文本图像获取资源从富文本区域字段中检索图像。在这个例子中,我们 从名为 的潜在客户记录的自定义富文本字段中检索图像。我们假设图像已经 上传到此字段。

LeadPhotoRichText__c

获取镜像引用 ID

在通过请求检索图像之前,必须先从富文本字段中获取图像。使用 sObject Rows 资源检索 潜在顾客记录的字段信息。refid

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Lead/00Q112222233333 -H "Authorization: Bearer token"

下面是请求的精简输出示例。

{
    "attributes": {
        "type": "Lead",
        "url": "/services/data/v51.0/sobjects/Lead/00Q112222233333"
    },
    "Id": "00Q112222233333",
    "IsDeleted": false,
    "MasterRecordId": null,
    "LastName": "Smith",
    "FirstName": "John",

    ...

    "LeadPhotoRichText__c": "<img alt=\"johnSmithPhoto\" src=\"https://MyDomainName.documentforce.com/servlet/rtaImage?eid=a005e000007Dksm&amp;feoid=00N5e00000djU6Y&amp;refid=0EM5e000000B9LQ\"></img>"
}

从LeadPhotoRichText__c字段中可以看出,图像的 是 。使用这个 值以检索图像。refid0EM5e000000B9LQ

检索图像

使用潜在顾客记录 ID、富文本字段名称和图像检索图像。响应将图像作为编码数据返回,并使用 与上传时使用的文件类型相同。将返回的数据另存为图像文件,并使用 使用参数的适当文件类型。refid–output filename

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Lead/00Q112222233333/richTextImageFields/LeadPhotoRichText__c/0EMR00000000A8V -H "Authorization: Bearer token" --output "LeadPhoto.jpeg"

插入或更新 Blob 数据

您可以使用 sObject 基本信息、sObject 行或 sObject 要在其中插入或更新二进制大型对象 (blob) 的集合资源 Salesforce,例如图像或 PDF。您可以将任何类型的文件或二进制数据上传到 包含 blob 字段的任何标准对象。

若要插入和更新 blob 数据,请创建多部分请求正文。第一部分 请求正文包含非二进制字段数据,例如新字段的描述或名称 记录。第二部分包含您要上传的文件的二进制数据。这 请求正文必须符合 MIME 多部分内容类型标准。查看更多 信息,请参阅多部分内容类型的 W3C 标准。

如果使用 sObject 基本信息或 sObject 行资源,则 ContentVersion 对象和 对于所有其他符合条件的标准对象,为 500 MB。如果使用 sObject 集合 资源,则单个请求中所有文件的最大总大小为 500 MB。

注意

可以使用非多部分消息插入或更新 blob 数据,但受到限制 到 50 MB 的文本数据或 37.5 MB 的 base64 编码数据。

这些部分提供了如何使用多部分插入或更新 blob 数据的示例 content-type 请求。这些示例的请求正文使用 JSON 格式。

插入包含 Blob 数据的文档

此示例请求和请求正文创建一个 Document 记录,其中包含 PDF 文件的二进制数据。除了文件本身的二进制数据外, request body 还指定其他字段数据,包括 Document 对象所需的 FolderId。

如果您在 Salesforce 中没有新文档记录的文件夹记录,则必须 使用 sObject 基本信息资源创建一个,然后才能遵循此操作 例。确保“文件夹”记录的“类型”字段为 公文。

提示

成功发送请求后,您可以查看新文档 在 Salesforce Classic 中。Salesforce Lightning 不会在用户中显示文档 接口。创建文档的示例请求

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Document/ -H "Authorization: Bearer token" -H "Content-Type: multipart/form-data; boundary=\"boundary_string\"" --data-binary @NewDocument.json

用于创建文档的示例请求正文此请求正文表示 NewDocument.json 的内容。PDF 的二进制数据 为简洁起见,省略了内容,并替换为“二进制数据” 去这里。实际请求包含完整的二进制文件 内容。

--boundary_string
Content-Disposition: form-data; name="entity_document";
Content-Type: application/json

{  
    "Description" : "Marketing brochure for Q1 2011",
    "Keywords" : "marketing,sales,update",
    "FolderId" : "005D0000001GiU7",
    "Name" : "Marketing Brochure Q1",
    "Type" : "pdf"
}

--boundary_string
Content-Type: application/pdf
Content-Disposition: form-data; name="Body"; filename="2011Q1MktgBrochure.pdf"

Binary data goes here.

--boundary_string--

示例响应正文成功后,新文档的 ID 为 返回。

{
    "id" : "015D0000000N3ZZIA0",
    "errors" : [ ],
    "success" : true
}

错误响应示例

{
    "fields" : [ "FolderId" ],
    "message" : "Folder ID: id value of incorrect type: 005D0000001GiU7",
    "errorCode" : "MALFORMED_ID"
}

使用 Blob 数据更新文档

本示例更新现有 Document 记录。根据 请求正文,可以更新记录的字段,关联二进制数据 有了它,或两者兼而有之。

如果只想更新记录字段,则请求正文不需要 多部分内容类型。更新 Document 对象中的二进制数据的示例请求

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/Document/015D0000000N3ZZIA0 -H "Authorization: Bearer token" -H "Content-Type: multipart/form-data; boundary=\"boundary_string\"" --data-binary @UpdateDocument.json -X PATCH

用于更新 Document 对象中的二进制数据的示例请求正文

此请求正文表示 UpdateDocument.json 的内容。此示例更新 记录的二进制数据,以及“名称”和“关键字”字段。如果您只想更新 二进制数据,您可以删除带有 Name 和 Keywords 字段的代码行。

为简洁起见,省略了 PDF 内容的二进制数据,并且 替换为“更新的文档二进制文件转到此处”。一 实际请求包含完整的二进制内容。

--boundary_string
Content-Disposition: form-data; name="entity_content";
Content-Type: application/json

{  
    "Name" : "Marketing Brochure Q1 - Sales",
    "Keywords" : "sales, marketing, first quarter"
}

--boundary_string
Content-Type: application/pdf
Content-Disposition: form-data; name="Body"; filename="2011Q1MktgBrochure.pdf"

Updated document binary data goes here.

--boundary_string--

用于更新 Document 对象中的字段的示例响应正文无返回错误响应请参阅状态代码和错误响应。

插入 ContentVersion

此示例插入一个新的 ContentVersion。除了文件的二进制数据 本身,此代码还为其他字段(如 ReasonForChange 和 PathOnClient)提供值。这 message 包含 ContentDocumentId,因为 ContentVersion 始终与 ContentDocument 相关联。

提示

ContentVersion 对象不支持更新。因此,你不能 更新 ContentVersion。您只能插入新的 ContentVersion。您可以看到 内容选项卡上的更改结果。插入 ContentVersion 的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/ContentVersion -H "Authorization: Bearer token" -H "Content-Type: multipart/form-data; boundary=\"boundary_string\"" --data-binary @NewContentVersion.json

用于插入 ContentVersion 的示例请求正文

此请求正文表示文件 NewContentVersion.json 的内容。二进制数据 为简洁起见,省略了 PDF 内容,并替换为 “二进制数据在这里。”实际请求包含 完整的二进制内容。

--boundary_string
Content-Disposition: form-data; name="entity_content";
Content-Type: application/json

{
    "ContentDocumentId" : "069D00000000so2",
    "ReasonForChange" : "Marketing materials updated",
    "PathOnClient" : "Q1 Sales Brochure.pdf"
}

--boundary_string
Content-Type: application/octet-stream
Content-Disposition: form-data; name="VersionData"; filename="Q1 Sales Brochure.pdf"

Binary data goes here.

--boundary_string--

插入 ContentVersion 的示例响应正文

{
    "id" : "068D00000000pgOIAQ",
    "errors" : [ ],
    "success" : true
}

插入 ContentVersion 的错误响应请参阅状态代码和错误响应。

使用 sObject 集合插入 Blob 记录的集合

本示例插入新文档的集合。除了二进制数据 文件本身,此代码还指定其他字段数据,例如每条记录的 Description 和 Name 在集合中。

提示

成功发送请求后,您可以查看新文档 在 Salesforce Classic 中。Salesforce Lightning 不会在用户中显示文档 接口。属性如果将 sObject 集合用于 blob 数据,则必须指定某些 除 in 之外的属性值 请求正文的属性映射。type

参数描述
binaryPartName对于 blob 数据是必需的。的唯一标识符 二进制部分。
binaryPartName别名对于 blob 数据是必需的。中字段的名称 插入或更新二进制数据。

创建文档的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/composite/sobjects/ -H "Authorization: Bearer token" -H "Content-Type: multipart/form-data; boundary=\"boundary_string\"" --data-binary @newdocuments.json

用于创建文档的示例请求正文此代码是 newdocuments.json 的内容。这 为简洁起见,省略了 PDF 内容的二进制数据并进行了替换 替换为“二进制数据在这里”。实际请求包含 完整二进制 内容。

--boundary_string
Content-Disposition: form-data; name="collection"
Content-Type: application/json

{
    "allOrNone" : false,
    "records" :
    [
        {
            "attributes" :
            {
                "type" : "Document",
                "binaryPartName": "binaryPart1",
                "binaryPartNameAlias": "Body"
            },
            "Description" : "Marketing Brochure",
            "FolderId" : "005xx000001Svs4AAC",
            "Name" : "Brochure",
            "Type" : "pdf"
        },
        {
            "attributes" :
            {
                "type" : "Document",
                "binaryPartName": "binaryPart2",
                "binaryPartNameAlias": "Body"
            },
            "Description" : "Pricing Overview",
            "FolderId" : "005xx000001Svs4AAC",
            "Name" : "Pricing",
            "Type" : "pdf"
        }
    ]
}

--boundary_string
Content-Disposition: form-data; name="binaryPart1"; filename="Brochure.pdf"
Content-Type: application/pdf

Binary data goes here.

--boundary_string
Content-Disposition: form-data; name="binaryPart2"; filename="Pricing.pdf"
Content-Type: application/pdf

Binary data goes here.

--boundary_string--

用于创建文档的示例响应正文成功后,新文档的 ID 为 返回。

[
    {
        "id": "015xx00000013QjAAI",
        "errors": [],
        "success": true
    },
    {
        "id": "015xx00000013QkAAI",
        "errors": [],
        "success": true
    }
]

有关更多信息,请参见 sObject 集合。

多部分消息注意事项

以下是多部分消息格式的一些注意事项,当您 插入或更新 blob 数据。边界字符串

  • 分隔多部分请求正文的各个部分。
  • 必须在分段请求的标头中指定。Content-Type
  • 最多可包含 70 个字符。
  • 不能是出现在 请求正文。
  • 包括第一个边界的两个连字符 (–) 前缀 字符串。
  • 包括最后一个边界字符串的两个连字符 (–) 后缀。

Content-Disposition 标头

  • 在请求正文的每个部分中是必需的。
  • 必须作为值 和属性。form-dataname
    • 在请求正文的非二进制部分,使用任何值 对于属性。name
    • 对于单个文档,在请求的二进制部分 body,请使用该属性指定 对象。例如,blob 数据字段的名称 Document 对象是 Body。name
    • 对于使用 sObject 集合插入或更新的文档, 使用属性 在请求正文的每个二进制部分指定一个唯一的 该部件的标识符。引用这些标识符 由请求正文的非二进制部分。name
  • 必须包含二进制部分的属性,该属性表示本地 文件。filename

Content-Type 标头

  • 在多部分请求正文的每个部分中是必需的。
  • 支持 和 内容 多部分请求正文的非二进制部分的类型。application/jsonapplication/xml
  • 支持多部分的二进制部分的任何内容类型 请求正文。

新行必须在标题和数据之间添加一个新行,用于 多部分请求正文。正如您在示例中看到的,一个新行 将 和 标头与 JSON 分开 或二进制数据。Content-TypeContent-Disposition

另见

  • sObject基本信息
  • sObject 行
  • sObject 集合
  • 获取 Blob 数据

获取 Blob 数据

使用 sObject Blob Get 资源获取 给定记录。若要获取 blob 数据,必须存在包含 blob 数据的记录 Salesforce的。

只有某些标准对象具有 blob 字段,例如 Attachment、ContentNote、 ContentVersion、Document、Folder 和 Note。

注意

sObject Blob Get 资源与复合 API 请求不兼容,因为它 返回二进制数据,而不是 JSON 或 XML 格式的数据。相反,请创建单个 sObject Blob 获取检索 blob 数据的请求。

以下示例获取在“插入或更新 Blob 数据”中创建的文档记录的 blob 数据。

从文档记录中检索 blob 数据的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Document/015D0000000N3ZZIA0/body -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文文档正文内容以二进制形式返回。响应内容类型不是 JSON 或 XML,因为返回的数据是二进制的。您可以将返回的二进制数据保存到一个文件中 存储和访问它。

REST例子

本部分提供了使用 REST API 资源执行各种不同任务的示例。 包括使用对象、组织信息和查询。

有关 REST API 资源的完整参考信息,请参阅参考。

  1. 获取有关我的组织
    的信息 本节中的示例使用 REST API 资源来检索组织级别的信息,例如组织中所有可用对象的列表。
  2. 使用对象元数据
    本节中的示例使用 REST API 资源来检索对象元数据信息。有关修改或创建对象元数据信息的信息,请参阅《元数据 API 开发人员指南》。
  3. 使用记录
    本节中的示例使用 REST API 资源创建、检索、更新和删除记录,以及其他与记录相关的操作。
  4. 删除 Lightning Experience 事件系列 使用 HTTP DELETE 方法删除系列
    中的一个或多个 IsRecurrence2 事件。您可以删除单个事件、特定事件之后的所有事件(包括特定事件)或整个事件系列。
  5. 使用搜索和查询
    本节中的示例使用 REST API 资源通过 Salesforce 对象搜索语言 (SOSL) 和 Salesforce 对象查询语言 (SOQL) 以及其他搜索 API 来搜索和查询记录。有关 SOSL 和 SOQL 的详细信息,请参阅 SOQL 和 SOSL 参考。
  6. 从富文本区域字段中
    获取图像 使用 sObject 富文本图像获取资源从富文本区域字段中检索图像。在此示例中,我们从名为 的潜在客户记录的自定义富文本字段中检索图像。我们假设图像已经上传到此字段。LeadPhotoRichText__c
  7. 插入或更新 Blob 数据
    您可以使用 sObject 基本信息、sObject 行或 sObject 集合资源在 Salesforce 中插入或更新二进制大型对象 (Blob),例如图像或 PDF。可以将任何类型的文件或二进制数据上载到包含 blob 字段的任何标准对象。
  8. 获取 Blob 数据 使用 sObject Blob Get 资源获取给定记录的 Blob 数据
    。若要获取 blob 数据,Salesforce 中必须存在包含 blob 数据的记录。
  9. 使用最近查看的信息
    本节中的示例使用 REST API 查询和最近查看的资源以编程方式检索和更新最近查看的记录信息。
  10. 管理用户密码
    本节中的示例使用 REST API 资源来管理用户密码,例如设置或重置密码。
  11. 使用审批流程和流程规则
    本节中的示例使用 REST API 资源来处理审批流程和流程规则。
  12. 使用事件监视
    这些示例使用 REST API 事件监视数据,其中包含可用于评估组织使用趋势和用户行为的信息。事件监控可通过 Lightning 平台 SOAP API 和 REST API 通过 EventLogFile 对象进行访问。因此,您可以将日志数据与自己的后端存储和数据集市集成,以关联来自多个组织和不同系统的数据。
  13. 使用复合资源 本节中的示例使用复合资源
    通过最大程度地减少客户端和服务器之间的往返次数来提高应用程序的性能。

获取有关我的组织的信息

本节中的示例使用 REST API 资源来检索组织级别 信息,例如组织中所有可用对象的列表。

  • 列出可用的 REST API 版本 使用“版本”资源列出有关当前可用的每个 REST API 版本的摘要信息,包括版本、标签和指向每个版本
    根目录的链接。无需身份验证即可检索版本列表。
  • 列出组织限制 使用“限制”资源列出组织限制
  • 列出可用的 REST 资源 使用 *** 资源列出可用于指定 API 版本的资源
    。这将提供每个附加资源的名称和 URI。
  • 获取对象列表 使用“描述全局”资源列出组织中可用且可供登录用户使用的对象
    。此资源还返回组织编码,以及查询中允许的最大批大小。
  • 获取元数据已更改
    时的对象列表 使用 Describe Global 资源和 HTTP 标头确定对象的元数据是否已更改。If-Modified-Since

列出可用的 REST API 版本

使用“版本”资源列出摘要信息 关于当前可用的每个 REST API 版本,包括版本、标签和 链接到每个版本的根目录。您不需要身份验证即可检索 版本。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/ -H "Authorization: Bearer token"

示例请求正文不需要示例 JSON 响应正文

[
    {
        "label" : "Spring '11",
        "url" : "/services/data/v21.0",
        "version" : "21.0"
    },
    {
        "label" : "Summer '11",
        "url" : "/services/data/v22.0",
        "version" : "22.0"
    },
    {
        "label" : "Winter '12",
        "url" : "/services/data/v23.0",
        "version" : "23.0"
    }
    ...
]

示例 XML 响应正文

<?xml version="1.0" encoding="UTF-8"?>
<Versions>
    <Version>
        <label>Spring &apos;11</label>
        <url>/services/data/v21.0</url>
        <version>21.0</version>
    </Version>
    <Version>
        <label>Summer &apos;11</label>
        <url>/services/data/v22.0</url>
        <version>22.0</version>
    </Version><Version>
        <label>Winter &apos;12</label>
        <url>/services/data/v23.0</url>
        <version>23.0</version>
    </Version>
    ...
</Versions>

列出组织限制

使用“限制”资源列出组织限制。

  • Max是组织的限制。
  • Remaining是调用或事件的数量 留给组织。

示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/limits/ -H "Authorization: Bearer token" -H "X-PrettyPrint:1"

示例请求正文不需要示例响应正文

{
    "ActiveScratchOrgs": {
        "Max": 3,
        "Remaining": 3
    },
    "AnalyticsExternalDataSizeMB": {
        "Max": 40960,
        "Remaining": 40960
    },
    "ConcurrentAsyncGetReportInstances": {
        "Max": 200,
        "Remaining": 200
    },
    "ConcurrentEinsteinDataInsightsStoryCreation": {
        "Max": 5,
        "Remaining": 5
    },
    "ConcurrentEinsteinDiscoveryStoryCreation": {
        "Max": 2,
        "Remaining": 2
    },
    "ConcurrentSyncReportRuns": {
        "Max": 20,
        "Remaining": 20
    },
    "DailyAnalyticsDataflowJobExecutions": {
        "Max": 60,
        "Remaining": 60
    },
    "DailyAnalyticsUploadedFilesSizeMB": {
        "Max": 51200,
        "Remaining": 51200
    },
    "DailyFunctionsApiCallLimit" : {
      "Max" : 235000,
      "Remaining" : 235000
    },
    "DailyApiRequests": {
        "Max": 5000,
        "Remaining": 4937
    },
    "DailyAsyncApexExecutions": {
        "Max": 250000,
        "Remaining": 250000
    },
    "DailyAsyncApexTests": {
        "Max": 500,
        "Remaining": 500
    },
    "DailyBulkApiBatches": {
        "Max": 15000,
        "Remaining": 15000
    },
    "DailyBulkV2QueryFileStorageMB": {
        "Max": 976562,
        "Remaining": 976562
    },
    "DailyBulkV2QueryJobs": {
        "Max": 10000,
        "Remaining": 10000
    },
    "DailyDeliveredPlatformEvents" : {
      "Max" : 10000,
      "Remaining" : 10000
    },
    "DailyDurableGenericStreamingApiEvents": {
        "Max": 10000,
        "Remaining": 10000
    },
    "DailyDurableStreamingApiEvents": {
        "Max": 10000,
        "Remaining": 10000
    },
    "DailyEinsteinDataInsightsStoryCreation": {
        "Max": 1000,
        "Remaining": 1000
    },
    "DailyEinsteinDiscoveryPredictAPICalls": {
        "Max": 50000,
        "Remaining": 50000
    },
    "DailyEinsteinDiscoveryPredictionsByCDC": {
        "Max": 5000000,
        "Remaining": 5000000
    },
    "DailyEinsteinDiscoveryStoryCreation": {
        "Max": 100,
        "Remaining": 100
    },
    "DailyGenericStreamingApiEvents": {
        "Max": 10000,
        "Remaining": 10000
    },
    "DailyScratchOrgs": {
        "Max": 6,
        "Remaining": 6
    },
    "DailyStandardVolumePlatformEvents": {
        "Max": 10000,
        "Remaining": 10000
    },
    "DailyStreamingApiEvents": {
        "Max": 10000,
        "Remaining": 10000
    },
    "DailyWorkflowEmails": {
        "Max": 100000,
        "Remaining": 100000
    },
    "DataStorageMB": {
        "Max": 1024,
        "Remaining": 1024
    },
    "DurableStreamingApiConcurrentClients": {
        "Max": 20,
        "Remaining": 20
    },
    "FileStorageMB": {
        "Max": 1024,
        "Remaining": 1024
    },
    "HourlyAsyncReportRuns": {
        "Max": 1200,
        "Remaining": 1200
    },
    "HourlyDashboardRefreshes": {
        "Max": 200,
        "Remaining": 200
    },
    "HourlyDashboardResults": {
        "Max": 5000,
        "Remaining": 5000
    },
    "HourlyDashboardStatuses": {
        "Max": 999999999,
        "Remaining": 999999999
    },
    "HourlyLongTermIdMapping": {
        "Max": 100000,
        "Remaining": 100000
    },
    "HourlyManagedContentPublicRequests": {
        "Max": 50000,
        "Remaining": 50000
    },
    "HourlyODataCallout": {
        "Max": 20000,
        "Remaining": 20000
    },
    "HourlyPublishedPlatformEvents": {
        "Max": 50000,
        "Remaining": 50000
    },
    "HourlyPublishedStandardVolumePlatformEvents": {
        "Max": 1000,
        "Remaining": 1000
    },
    "HourlyShortTermIdMapping": {
        "Max": 100000,
        "Remaining": 100000
    },
    "HourlySyncReportRuns": {
        "Max": 500,
        "Remaining": 500
    },
    "HourlyTimeBasedWorkflow": {
        "Max": 1000,
        "Remaining": 1000
    },
    "MassEmail": {
        "Max": 5000,
        "Remaining": 5000
    },
    "MonthlyEinsteinDiscoveryStoryCreation": {
        "Max": 500,
        "Remaining": 500
    },
    "Package2VersionCreates": {
        "Max": 6,
        "Remaining": 6
    },
    "Package2VersionCreatesWithoutValidation": {
        "Max": 500,
        "Remaining": 500
    },
    "PermissionSets": {
        "Max": 1500,
        "Remaining": 1499,
        "CreateCustom": {
            "Max": 1000,
            "Remaining": 999
        }
    },
    "PrivateConnectOutboundCalloutHourlyLimitMB": {
        "Max": 0,
        "Remaining": 0
    },
    "SingleEmail": {
        "Max": 5000,
        "Remaining": 5000
    },
    "StreamingApiConcurrentClients": {
        "Max": 20,
        "Remaining": 20
    }
}

列出可用的 REST 资源

使用“按版本划分的资源”资源列出可用于 指定的 API 版本。这将提供每个附加资源的名称和 URI。例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/ -H "Authorization: Bearer token"

示例请求正文不需要示例 JSON 响应正文

{
   "tooling" : "/services/data/v59.0/tooling",
   "metadata" : "/services/data/v59.0/metadata",
   "eclair" : "/services/data/v59.0/eclair",
   "folders" : "/services/data/v59.0/folders",
   "prechatForms" : "/services/data/v59.0/prechatForms",
   "contact-tracing" : "/services/data/v59.0/contact-tracing",
   "jsonxform" : "/services/data/v59.0/jsonxform",
   "chatter" : "/services/data/v59.0/chatter",
   "payments" : "/services/data/v59.0/payments",
   "tabs" : "/services/data/v59.0/tabs",
   "appMenu" : "/services/data/v59.0/appMenu",
   "quickActions" : "/services/data/v59.0/quickActions",
   "queryAll" : "/services/data/v59.0/queryAll",
   "commerce" : "/services/data/v59.0/commerce",
   "wave" : "/services/data/v59.0/wave",
   "iot" : "/services/data/v59.0/iot",
   "analytics" : "/services/data/v59.0/analytics",
   "search" : "/services/data/v59.0/search",
   "smartdatadiscovery" : "/services/data/v59.0/smartdatadiscovery",
   "identity" : "https://MyDomainName.my.salesforce.com/id/
      00DRO0000008aXd2AI/005RO000000HfnkYAC",
   "composite" : "/services/data/v59.0/composite",
   "parameterizedSearch" : "/services/data/v59.0/parameterizedSearch",
   "fingerprint" : "/services/data/v59.0/fingerprint",
   "theme" : "/services/data/v59.0/theme",
   "nouns" : "/services/data/v59.0/nouns",
   "domino" : "/services/data/v59.0/domino",
   "event" : "/services/data/v59.0/event",
   "serviceTemplates" : "/services/data/v59.0/serviceTemplates",
   "recent" : "/services/data/v59.0/recent",
   "connect" : "/services/data/v59.0/connect",
   "licensing" : "/services/data/v59.0/licensing",
   "limits" : "/services/data/v59.0/limits",
   "process" : "/services/data/v59.0/process",
   "dedupe" : "/services/data/v59.0/dedupe",
   "async-queries" : "/services/data/v59.0/async-queries",
   "query" : "/services/data/v59.0/query",
   "jobs" : "/services/data/v59.0/jobs",
   "localizedvalue" : "/services/data/v59.0/localizedvalue",
   "mobile" : "/services/data/v59.0/mobile",
   "emailConnect" : "/services/data/v59.0/emailConnect",
   "consent" : "/services/data/v59.0/consent",
   "tokenizer" : "/services/data/v59.0/tokenizer",
   "compactLayouts" : "/services/data/v59.0/compactLayouts",
   "sobjects" : "/services/data/v59.0/sobjects",
   "actions" : "/services/data/v59.0/actions",
   "support" : "/services/data/v59.0/support"
}

示例 XML 响应正文

<?xml version="1.0" encoding="UTF-8"?> 
<urls>
   <tooling>/services/data/v59.0/tooling</tooling>
   <metadata>/services/data/v59.0/metadata</metadata>
   <eclair>/services/data/v59.0/eclair</eclair>
   <folders>/services/data/v59.0/folders</folders>
   <prechatForms>/services/data/v59.0/prechatForms</prechatForms>
   <contact-tracing>/services/data/v59.0/contact-tracing</contact-tracing>
   <jsonxform>/services/data/v59.0/jsonxform</jsonxform>
   <chatter>/services/data/v59.0/chatter</chatter>
   <payments>/services/data/v59.0/payments</payments>
   <tabs>/services/data/v59.0/tabs</tabs>
   <appMenu>/services/data/v59.0/appMenu</appMenu>
   <quickActions>/services/data/v59.0/quickActions</quickActions>
   <queryAll>/services/data/v59.0/queryAll</queryAll>
   <commerce>/services/data/v59.0/commerce</commerce>
   <wave>/services/data/v59.0/wave</wave>
   <iot>/services/data/v59.0/iot</iot>
   <analytics>/services/data/v59.0/analytics</analytics>
   <search>/services/data/v59.0/search</search>
   <smartdatadiscovery>/services/data/v59.0/smartdatadiscovery</smartdatadiscovery>
   <identity>https://MyDomainName.my.salesforce.com/id/
      ​​​00DRO0000008aXd2BI/​005RO000000HfnkYAB</identity>
   <composite>/services/data/v59.0/composite</composite>
   <parameterizedSearch>/services/data/v59.0/parameterizedSearch</parameterizedSearch>
   <fingerprint>/services/data/v59.0/fingerprint</fingerprint>
   <theme>/services/data/v59.0/theme</theme>
   <nouns>/services/data/v59.0/nouns</nouns>
   <domino>/services/data/v59.0/domino</domino>
   <event>/services/data/v59.0/event</event>
   <serviceTemplates>/services/data/v59.0/serviceTemplates</serviceTemplates>
   <recent>/services/data/v59.0/recent</recent>
   <connect>/services/data/v59.0/connect</connect>
   <licensing>/services/data/v59.0/licensing</licensing>
   <limits>/services/data/v59.0/limits</limits>
   <process>/services/data/v59.0/process</process>
   <dedupe>/services/data/v59.0/dedupe</dedupe>
   <async-queries>/services/data/v59.0/async-queries</async-queries>
   <query>/services/data/v59.0/query</query>
   <jobs>/services/data/v59.0/jobs</jobs>
   <localizedvalue>/services/data/v59.0/localizedvalue</localizedvalue>
   <mobile>/services/data/v59.0/mobile</mobile>
   <emailConnect>/services/data/v59.0/emailConnect</emailConnect>
   <consent>/services/data/v59.0/consent</consent>
   <tokenizer>/services/data/v59.0/tokenizer</tokenizer>
   <compactLayouts>/services/data/v59.0/compactLayouts</compactLayouts>
   <sobjects>/services/data/v59.0/sobjects</sobjects>
   <actions>/services/data/v59.0/actions</actions>
   <support>/services/data/v59.0/support</support>
</urls>

更多信息

有关身份资源的信息,请参阅身份 URL。

有关其他资源,请参阅参考。

获取对象列表

使用“描述全局”资源列出组织中可用的对象以及可供登录用户使用的对象 用户。此资源还返回组织编码,以及 查询。示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/ -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

{ 
  "encoding" : "UTF-8", 
  "maxBatchSize" : 200, 
  "sobjects" : [ { 
    "activateable" : false, 
    "custom" : false,
    "customSetting" : false, 
    "createable" : true, 
    "deletable" : true, 
    "deprecatedAndHidden" : false, 
    "feedEnabled" : true, 
    "keyPrefix" : "001", 
    "label" : "Account", 
    "labelPlural" : "Accounts", 
    "layoutable" : true, 
    "mergeable" : true, 
    "mruEnabled" : true, 
    "name" : "Account", 
    "queryable" : true, 
    "replicateable" : true, 
    "retrieveable" : true, 
    "searchable" : true, 
    "triggerable" : true, 
    "undeletable" : true,
    "updateable" : true, 
    "urls" : { 
      "sobject" : "/services/data/v59.0/sobjects/Account", 
      "describe" : "/services/data/v59.0/sobjects/Account/describe", 
      "rowTemplate" : "/services/data/v59.0/sobjects/Account/{ID}" 
    },
  }, 
  ...
  ]
}

如果元数据已更改,则获取对象列表

使用 Describe Global 资源和 HTTP 标头确定对象的元数据是否具有 改变。

If-Modified-Since

使用“描述全局”资源时,可以包含带有日期格式的标题。如果你这样做了, 仅当可用对象的元数据自 提供日期。如果自提供的日期以来未修改任何元数据,则返回状态代码,但无响应 身体。If-Modified-SinceEEE, dd MMM yyyy HH:mm:ss z304 Not Modified

以下示例假定在 3 月 23 日之后未对对象进行任何更改。 2015.示例:描述全局请求/services/data/v59.0/sobjects与请求一起使用的示例标头If-Modified-SinceIf-Modified-Since: Tue, 23 Mar 2015 00:00:00 GMT示例响应正文未返回响应正文示例响应状态代码

HTTP/1.1 304 Not Modified
Date: Wed, 25 Jul 2015 00:05:46 GMT

如果在 2015 年 3 月 23 日之后对对象进行了更改,则响应正文将包含 所有可用对象。有关示例,请参阅获取对象列表。

使用对象元数据

本节中的示例使用 REST API 资源来检索对象元数据 信息。有关修改或创建对象元数据信息的信息,请参阅元数据 API 开发人员 指南

  • 获取对象
    的元数据 使用 sObject 基本信息资源获取对象的元数据。
  • 获取对象
    的字段和其他元数据 使用 sObject Describe 资源检索对象的所有元数据,包括有关每个字段、URL 和子关系的信息。
  • 获取对象元数据更改
    使用 sObject Describe 资源和 HTTP 标头确定对象元数据是否已更改。If-Modified-Since

获取对象的元数据

使用 sObject 基本信息资源获取元数据 对于对象。获取帐户元数据的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/ -H "Authorization: Bearer token"

用于获取帐户元数据的示例请求正文不需要用于获取帐户元数据的示例响应正文

{
  "objectDescribe" :
  {
    "name" : "Account",
    "updateable" : true,
    "label" : "Account",
    "keyPrefix" : "001",

    ...

    "replicateable" : true,
    "retrieveable" : true,
    "undeletable" : true,
    "triggerable" : true
  },
  "recentItems" :
  [
    {
      "attributes" :
      {
        "type" : "Account",
        "url" : "/services/data/v59.0/sobjects/Account/001D000000INjVeIAL"
      },
      "Id" : "001D000000INjVeIAL",
      "Name" : "asdasdasd"
    },

    ...

  ]
}

若要获取对象的完整描述(包括字段名称及其元数据),请参阅获取对象列表。

获取对象的字段和其他元数据

使用 sObject Describe 资源检索对象的所有元数据,包括有关每个对象的信息 字段、URL 和子关系。例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/describe/ -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

{
  "name" : "Account",
  "fields" :
  [
    {
      "length" : 18,
      "name" : "Id",
      "type" : "id",
      "defaultValue" : {    "value" : null  },
      "updateable" : false,
      "label" : "Account ID",
      ...
    },

    ...

  ],


  "updateable" : true,
  "label" : "Account",
  "keyPrefix" : "001",
  "custom" : false,

  ...

  "urls" :
  {
    "uiEditTemplate" : "https://MyDomainName.my.salesforce.com/{ID}/e",
    "sobject" : "/services/data/v59.0/sobjects/Account",
    "uiDetailTemplate" : "https://MyDomainName.my.salesforce.com/{ID}",
    ...
  },

  "childRelationships" :
  [
    {
      "field" : "ParentId",
      "deprecatedAndHidden" : false,
      ...
    }, 

    ....

  ],

  "createable" : true,
  "customSetting" : false,
  ...
}

有关请求正文中的项目的更多信息,请参阅《SOAP API 开发人员指南》中的 DescribesObjectResult。

获取对象元数据更改

使用 sObject Describe 资源和 HTTP 标头确定对象元数据是否已更改。

If-Modified-Since

使用 sObject Describe 资源时,可以包含带有日期格式的标题。如果这样做,则仅当对象元数据出现时,才会返回响应元数据 自提供的日期以来已更改。如果元数据自 提供的日期,状态代码 返回,不带响应正文。If-Modified-SinceEEE, dd MMM yyyy HH:mm:ss z304 Not Modified

以下示例假定没有更改,例如 new custom 字段,已在 7 月 3 日之后对Merchandise__c对象进行, 2013.示例 sObject Describe 请求

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Merchandise__c/describe -H "Authorization: Bearer token" -H "If-Modified-Since: Wed, 3 Jul 2013 19:43:31 GMT"

示例响应正文未返回响应正文示例响应状态代码

HTTP/1.1 304 Not Modified
Date: Fri, 12 Jul 2013 05:03:24 GMT

如果在 2013 年 7 月 3 日之后对Merchandise__c进行了更改, 响应正文将包含Merchandise__c的元数据。有关示例,请参阅获取对象的字段和其他元数据。

使用记录

本节中的示例使用 REST API 资源来创建、检索、更新和 删除记录以及其他与记录相关的操作。

  • 创建记录
    使用 sObject 基本信息资源创建新记录。您可以在请求数据中提供所需的字段值,并使用 POST HTTP 方法发送请求。如果调用成功,响应正文将包含新记录的 ID。
  • 更新记录
    使用 sObject Rows 资源更新记录。在请求数据中提供更新的记录信息,并使用具有特定记录 ID 的资源的 PATCH 方法来更新该记录。单个文件中的记录必须具有相同的对象类型。
  • 删除记录
    使用 sObject Rows 资源删除记录。指定记录 ID,并使用资源的 DELETE 方法删除记录。
  • 从标准对象记录
    中获取字段值 使用 sObject Rows 资源的 GET 方法从记录中检索字段值。
  • 使用 Salesforce ID
    从外部对象记录中获取字段值 您可以使用 sObject Rows 资源从记录中检索字段值。在参数中指定要检索的字段,并使用资源的 GET 方法。fields
  • 使用外部 ID 标准字段从外部对象记录中获取字段值 使用 sObject Rows 资源从记录中检索字段
    值。在参数中指定要检索的字段,并使用资源的 GET 方法。fields
  • 使用外部 ID 获取记录 可以使用“sObject Rows by External ID”资源的 GET 方法获取具有特定外部 ID
    的记录。
  • 使用外部 ID 插入或更新(更新插入)记录 可以使用“按外部 ID 列出的 sObject 行”资源根据指定的外部 ID
    字段的值创建记录或更新现有记录(更新插入)。
  • 使用友好 URL 遍历关系 通过使用 sObject 关系资源构造友好 URL
    ,可以遍历标准对象和自定义对象中的关系字段。此方法允许您直接访问由关系关联的记录。使用友好 URL 是访问记录的更简单方法,方法是从关系字段获取对象 ID,然后检查关联的对象 ID 记录。
  • 获取给定时间范围内
    已删除记录的列表 使用 sObject Get Deleted 资源获取指定对象的已删除记录列表。指定删除给定对象的记录的日期和时间范围。已删除的记录将写入删除日志(定期清除),并将从大多数操作(如 sObject 行或查询)中筛选出来(尽管 QueryAll 将在结果中包含已删除的记录)。
  • 获取给定时间范围内
    更新的记录列表 使用 sObject Get Updated 资源获取指定对象的更新(修改或添加)记录的列表。指定更新给定对象的记录的日期和时间范围。

创建记录

使用 sObject 基本信息资源创建新记录。在 请求数据,并使用 POST HTTP 方法发送请求。响应正文 如果调用成功,则包含新记录的 ID。

以下示例请求创建一个新的客户记录,其中包含 newaccount.json 中提供的新记录。只有 name 字段是 在此示例中指定,但您也可以为其他帐户提供值 领域。创建新帐户的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/ -H "Authorization: Bearer token" -H "Content-Type: application/json" -d "@newaccount.json"

示例请求正文 newaccount.json 文件,用于创建 新账户

{
  "Name" : "Express Logistics and Transport"
}

成功创建新帐户后的示例响应正文

{
  "id" : "001D000000IqhSLIAZ",
  "errors" : [ ],
  "success" : true
}

更新记录

使用 sObject Rows 资源更新记录。提供更新的记录 请求数据中的信息,并将资源的 PATCH 方法与 用于更新该记录的特定记录 ID。单个文件中的记录必须相同 对象类型。

在以下示例中,将更新帐户中的计费城市。更新后的 记录信息在 patchaccount.json 中提供。更新 Account 对象的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/001D000000INjVe -H "Authorization: Bearer token" -H "Content-Type: application/json" -d @patchaccount.json -X PATCH

用于更新的示例请求正文 patchaccount.json 文件 Account 对象中的字段

{
    "BillingCity" : "San Francisco"
}

用于更新 Account 对象中的字段的示例响应正文未返回错误响应请参阅状态代码和错误响应。以下示例使用 Java 和 HttpClient 通过 REST API 更新记录。注意 HttpClient 中没有 PatchMethod,因此 PostMethod 被重写以返回 “PATCH”作为其方法名称。此示例假定资源 URL 已 传入并包含对象名称和记录 同上。

public static void patch(String url, String sid) throws IOException {
  PostMethod m = new PostMethod(url) {
    @Override public String getName() { return "PATCH"; }
  };

  m.setRequestHeader("Authorization", "OAuth " + sid);

  Map<String, Object> accUpdate = new HashMap<String, Object>();
  accUpdate.put("Name", "Patch test");
  ObjectMapper mapper = new ObjectMapper();
  m.setRequestEntity(new StringRequestEntity(mapper.writeValueAsString(accUpdate), "application/json", "UTF-8"));

  HttpClient c = new HttpClient();
  int sc = c.executeMethod(m);
  System.out.println("PATCH call returned a status code of " + sc);
  if (sc > 299) {
    // deserialize the returned error message
    List<ApiError> errors = mapper.readValue(m.getResponseBodyAsStream(), new TypeReference<List<ApiError>>() {} );
    for (ApiError e : errors)
      System.out.println(e.errorCode + " " + e.message);
  }
}

private static class ApiError {
  public String errorCode;
  public String message;
  public String [] fields;
}

如果 您使用的 HTTP 库不允许覆盖或设置任意 HTTP 方法名称,您可以发送 POST 请求并通过以下方式提供对 HTTP 方法的覆盖 查询字符串参数。在 PATCH 示例中,您可以将 PostMethod 行替换为不使用 覆盖:

_HttpMethod

PostMethod m = new PostMethod(url + "?_HttpMethod=PATCH");

删除记录

使用 sObject Rows 资源删除记录。指定记录 ID 并使用 资源来删除记录。删除客户记录的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/001D000000INjVe -H "Authorization: Bearer token" -X DELETE

示例请求正文不需要示例响应正文无返回

从标准对象记录中获取字段值

使用 sObject Rows 资源的 GET 方法从记录中检索字段值。

您可以使用可选参数指定要检索的字段。如果您指定的字段不存在或您无法通过 字段级安全性,则返回 400 错误响应。fields

如果不使用该参数,请求将从记录中检索所有标准字段和自定义字段。这些检索到的字段与 对象的 sObject Describe 请求返回的字段。字段级安全性无法访问的字段不会在响应正文中返回。fields

在以下示例中,从帐户中检索帐号和帐单邮政编码。从 Account 对象上的字段中检索值的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/001D000000INjVe​?fields=AccountNumber,BillingPostalCode -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

{
    "AccountNumber" : "CD656092",
    "BillingPostalCode" : "27215",
}

使用 Salesforce ID 从外部对象记录中获取字段值

使用 sObject Rows 资源从记录中检索字段值。指定字段 想要在参数中检索并使用 资源的 GET 方法。

fields

在以下示例中,自定义 字段是从与非高数据卷关联的外部对象中检索的 外部数据源。Country__c从 Customer 外部对象的字段中检索值的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Customer__x/x01D0000000002RIAQ?fields=Country__c -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

{
  "attributes" : {
    "type" : "Customer__x",
    "url" : "/services/data/v59.0/sobjects/Customer__x/x01D0000000002RIAQ"
  },
  "Country__c" : "Argentina",
  "Id" : "x01D0000000002RIAQ"
}

使用 外部 ID 标准字段

使用 sObject Rows 资源从记录中检索字段值。 在参数中指定要检索的字段,并使用资源的 GET 方法。

fields

在以下示例中,自定义 字段是从外部对象中检索的。请注意,(CACTU) 不是 Salesforce ID。相反,它是 外部对象。Country__cid从 Customer 外部对象的字段中检索值的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Customer__x/CACTU?fields=Country__c -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

{
  "attributes" : {
    "type" : "Customer__x",
    "url" : "/services/data/v59.0/sobjects/Customer__x/CACTU"
  },
  "Country__c" : "Argentina",
  "ExternalId" : "CACTU"
}

使用外部 ID 获取记录

可以使用 sObject Rows by External ID 资源的 GET 方法获取具有特定外部 ID 的记录。

以下示例假定存在一个Merchandise__c自定义对象,该对象具有 MerchandiseExtID__c外部 ID 字段。使用外部 ID 检索Merchandise__c记录的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Merchandise__c/MerchandiseExtID__c/123 -H "Authorization: Bearer token"

示例请求正文不需要示例响应正文

{ 
    "attributes" : {
        "type" : "Merchandise__c",
        "url" : "/services/data/v59.0/sobjects/Merchandise__c/a00D0000008oWP8IAM"
     },
    "Id" : "a00D0000008oWP8IAM",
    "OwnerId" : "005D0000001KyEIIA0",
    "IsDeleted" : false,
    "Name" : "Example Merchandise",
    "CreatedDate" : "2012-07-12T17:49:01.000+0000",
    "CreatedById" : "005D0000001KyEIIA0",
    "LastModifiedDate" : "2012-07-12T17:49:01.000+0000",
    "LastModifiedById" : "005D0000001KyEIIA0",
    "SystemModstamp" : "2012-07-12T17:49:01.000+0000",
    "Description__c" : "Merch with external ID",
    "Price__c" : 10.0,
    "Total_Inventory__c" : 100.0,
    "Distributor__c" : null,
    "MerchandiseExtID__c" : 123.0
}

使用外部 ID 插入或更新(更新插入)记录

可以使用“按外部 ID 列出的 sObject 行”资源执行以下操作: 根据指定值创建记录或更新现有记录 (upsert) 外部 ID 字段。

重要

在可能的情况下,我们更改了非包容性条款,以符合我们的 平等的公司价值观。我们保留了某些条款,以避免对 客户实施。

  • 如果外部 ID 不匹配,则根据 请求正文。
  • 如果外部 ID 匹配一次,则记录将根据 请求正文。
  • 如果外部 ID 多次匹配,则会报告 300 错误,并且 未创建或更新记录。

以下各节介绍如何使用外部 ID 资源进行检索 按外部 ID 和更新插入记录进行记录。

注意

在 REST API 中,更新插入使用外部 ID,而不是记录 ID。然而,在 Apex 中,upsert 可以是 与外部 ID 和记录 ID 一起使用。请注意两者的区别 REST API 和 Apex。

更新插入新记录

此示例使用 PATCH 方法插入新记录。它假设 外部 ID 字段“customExtIdField__c”已添加到帐户中。 它还假定 customExtIdField 值为 11999 的客户记录 尚不存在。更新插入尚不存在的记录的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/customExtIdField__c/11999 -H "Authorization: Bearer token" -H "Content-Type: application/json" -d @newrecord.json -X PATCH

示例 JSON 请求正文 newrecord.json 文件

{
    "Name" : "California Wheat Corporation",
    "Type" : "New Customer"
}

示例 JSON 响应成功的响应 是:

{
    "id" : "00190000001pPvHAAU",
    "errors" : [ ],
    "success" : true,
    "created": true
}

这 HTTP 状态代码为 201(已创建)。

注意

参数存在 在 API 版本 46.0 及更高版本的响应中。它不会出现在 早期版本。created错误响应外部 ID 不正确 田:

{
    "message" : "The requested resource does not exist",
    "errorCode" : "NOT_FOUND"
}

有关详细信息,请参阅状态代码和错误响应。

使用 id 作为外部插入新记录 编号

此示例使用 POST 方法作为特殊情况插入一条记录,其中 Id 字段被视为外部 ID。因为价值 的 Id 是 ,它是 从请求中省略。在编写要更新插入的代码时,此模式非常有用 使用不同外部 ID 的多个记录,并且您不想请求单独的 ID 资源。使用 Id 的 POST 在 API 版本 37.0 中可用,并且 后。null插入尚不存在的记录的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/Id -H "Authorization: Bearer token" -H "Content-Type: application/json" -d @newrecord.json -X POST

示例 JSON 请求正文 newrecord.json 文件

{
    "Name" : "California Wheat Corporation",
    "Type" : "New Customer"
}

示例 JSON 响应成功的响应 是:

{
    "id" : "001D000000Kv3g5IAB",
    "success" : true,
    "errors" : [ ],
    "created": true
}

这 HTTP 状态代码为 201(已创建)。

注意

参数存在 在 API 版本 46.0 及更高版本的响应中。它不会出现在 早期版本。created

更新插入现有记录

此示例使用 PATCH 方法更新现有记录。它假设 外部 ID 字段“customExtIdField__c”已添加到帐户中 并且存在 customExtIdField 值为 11999 的客户记录。请求 使用 updates.json 指定更新的字段值。更新插入现有记录的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/customExtIdField__c/11999 -H "Authorization: Bearer token" -H "Content-Type: application/json" -d @updates.json -X PATCH

示例 JSON 请求正文 updates.json 文件

{
    "BillingCity" : "San Francisco"
}

示例 JSON 响应在 API 版本 46.0 及更高版本中,HTTP 状态代码为 200 (OK) 和 成功响应 是:

{
    "id" : "001D000000Kv3g5IAB",
    "success" : true,
    "errors" : [ ],
    "created": false
}

在 API 版本 45.0 及更早版本,HTTP 状态代码为 204(无内容) 并且没有响应机构。错误响应如果外部 ID 值不唯一,则返回 HTTP 状态代码 300。 加上与查询匹配的记录列表。更多信息 有关错误,请参阅状态代码和错误响应。如果外部 ID 字段不存在,则会显示错误消息和代码 返回:

{
    "message" : "The requested resource does not exist",
    "errorCode" : "NOT_FOUND"
}

更新插入记录并与外部 ID 关联

如果某个对象使用关系引用另一个对象,则可以 使用 REST API 插入或更新记录,并使用 外部 ID。以下示例创建一条记录,并通过以下方式将其与父记录关联 外部 ID。它假设以下几点:

  • Merchandise__c具有名为 MerchandiseExtID__c。
  • Line_Item__c具有名为 LineItemExtID__c,以及与Merchandise__c的关系。
  • Merchandise__c存在MerchandiseExtID__c值为 123.
  • LineItemExtID__c值为 456 的Line_Item__c记录不存在。这是创建并关联到 Merchandise__c记录。

更新插入记录和引用相关对象的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Line_Item__c/LineItemExtID__c/456 -H "Authorization: Bearer token" -H "Content-Type: application/json" -d @new.json -X PATCH

示例 JSON 请求正文 new.json 文件请注意,相关的Merchandise__c记录是使用 Merchandise__c的外部 ID 田。

{
   "Name" : "LineItemCreatedViaExtID",
   "Merchandise__r" :
   {
       "MerchandiseExtID__c" : 123
   }
}

示例 JSON 响应成功的响应 是:

{
    "id" : "a02D0000006YUHrIAO",
    "errors" : [ ],
    "success" : true,
    "created": true
}

HTTP 状态代码为 201(已创建)。

注意

参数存在 在 API 版本 46.0 及更高版本的响应中。它不会出现在 早期版本。created错误响应如果外部 ID 值不唯一,则返回 HTTP 状态代码 300。 加上与查询匹配的记录列表。更多信息 有关错误,请参阅状态代码和错误响应。如果外部 ID 字段不存在,则会显示错误消息和代码 返回:

{
    "message" : "The requested resource does not exist",
    "errorCode" : "NOT_FOUND"
}

您还可以使用此方法更新现有记录。例如,如果你 创建了上面示例中所示的Line_Item__c,您可以尝试更新 相关Merchandise__c使用另一个请求。更新记录的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Line_Item__c/LineItemExtID__c/456 -H "Authorization: Bearer token" -H "Content-Type: application/json" -d @updates.json -X PATCH

示例 JSON 请求正文 updates.json 文件这假设存在另一个Merchandise__c记录,并且 MerchandiseExtID__c值 333.

{
   "Merchandise__r" :
   {
       "MerchandiseExtID__c" : 333
   }
}

示例 JSON 响应在 API 版本 46.0 及更高版本中,HTTP 状态代码为 200 (OK) 和 成功响应 是:

{
    "id" : "001D000000Kv3g5IAB",
    "success" : true,
    "errors" : [ ],
    "created": false
}

在 API 版本 45.0 及更早版本,HTTP 状态代码为 204(否 内容),并且没有响应正文。如果关系类型为主从,并且关系设置为不 允许重新设置父级,并且您尝试更新父级外部 ID,您将收到一个 HTTP 状态代码 400 错误,错误代码为 INVALID_FIELD_FOR_INSERT_UPDATE。

另见

  • 按外部 ID 划分的 sObject 行

使用友好 URL 遍历关系

您可以通过构造 使用 sObject 关系资源的友好 URL。这种方法允许您直接 访问由关系关联的记录。使用友好 URL 是 通过从关系字段获取对象 ID,然后检查 关联的对象 ID 记录。

重要

在可能的情况下,我们更改了非包容性条款,以符合我们的 平等的公司价值观。我们保留了某些条款,以避免对客户产生任何影响 实现。

关系名称遵循某些约定,这些约定取决于方向 (parent to 子项,或子项到父项)的关系和相关对象的名称。这 约定在了解关系名称中进行了介绍。 SOQL 和 SOSL 参考。在单个 REST 中可以进行的关系遍历次数是有限制的 API 调用。这些限制与 SOQL 的限制相同,如了解关系查询中所述 SOQL 和 SOSL 参考中的限制。保留以下内容 遍历关系时要牢记局限性。

  • 指定子级与父级关系时,不能超过五个级别 走过。以下内容遍历了两个子项到父项 关系。https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/ChildOfChild__c/record id/Child__r/ParentOfChild__r
  • 指定父子关系时,不能超过一个级别 走过。以下内容遍历一个父到子 关系。https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/ParentOfChild__c/record id/Child__r

遍历标准对象

标准对象“联系人”包含“客户”标准的关系字段 对象。以下示例检索与联系人相关的客户记录 记录。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Contact/0035e00000PiemmAAB/Account -H "Authorization: Bearer token"

用于遍历标准对象关系的示例请求正文不需要用于遍历标准对象的示例响应正文 simple 关系

{
    "attributes": {
        "type": "Account",
        "url": "/services/data/v59.0/sobjects/Account/0015e00000TwULCAA3"
    },
    "Id": "0015e00000TwULCAA3",
    "IsDeleted": false,
    "Name": "relationshipAccountName",
    "PhotoUrl": "/services/images/photo/0015e00000TwULCAA3",
    "OwnerId": "0055e000003E8ooAAC",
    "CreatedDate": "2021-11-06T17:38:40.000+0000",
    "CreatedById": "0055e000003E8ooAAC",
    "LastModifiedDate": "2021-11-06T17:38:40.000+0000",
    "LastModifiedById": "0055e000003E8ooAAC",
    "SystemModstamp": "2021-11-06T17:38:40.000+0000",
    "LastActivityDate": null,
    "LastViewedDate": "2021-11-06T17:40:50.000+0000",
    "LastReferencedDate": "2021-11-06T17:40:50.000+0000"
}

遍历简单关系的示例此名为 Merchandise__c 的自定义对象包含一个查找关系字段,用于 自定义对象Distributor__c子对象。以下示例检索 Distributor__c与Merchandise__c记录相关的记录。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Merchandise__c/a01D000000INjVe/Distributor__r -H "Authorization: Bearer token"

用于遍历简单关系的示例请求正文不需要用于遍历简单关系的示例响应正文

{
    "attributes" : 
    { 
        "type" : "Distributor__c",
        "url" : "/services/data/v59.0/sobjects/Distributor__c/a03D0000003DUhcIAG"
    },
    "Id" : "a03D0000003DUhcIAG",
    "OwnerId" : "005D0000001KyEIIA0",
    "IsDeleted" : false,
    "Name" : "Distributor1",
    "CreatedDate" : "2011-12-16T17:43:01.000+0000",
    "CreatedById" : "005D0000001KyEIIA0",
    "LastModifiedDate" : "2011-12-16T17:43:01.000+0000",
    "LastModifiedById" : "005D0000001KyEIIA0",
    "SystemModstamp" : "2011-12-16T17:43:01.000+0000",
    "Location__c" : "San Francisco"
}

如果没有相关记录与关系名称关联,则 REST API 调用将失败。 因为关系是无法遍历的。使用前面的示例,如果 Distributor__c Merchandise__c 记录中的字段设置为 ,则 GET 调用将返回 404 错误响应。null您可以在 单个 REST API 调用,只要不超过关系查询限制即可。如果 自定义对象Line_Item__c是与Merchandise__c自定义项关系中的子对象 对象,并且Merchandise__c还有一个子对象Distributor__c自定义对象,您可以访问 Distributor__c记录从Line_Item__c记录开始,使用类似 以后。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Line_Item__c/a02D0000006YL7XIAW/Merchandise__r/Distributor__r -H "Authorization: Bearer token"

关系遍历还支持以下关系的 PATCH 和 DELETE 方法: 解析为单个记录。使用 PATCH 方法,您可以更新相关的 记录。使用 PATCH 更新关系记录的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Merchandise__c/a01D000000INjVe/Distributor__r -H "Authorization: Bearer token"  -d @update_info.json -X PATCH

用于更新 update_info.json 中包含的关系记录的示例 JSON 请求正文

{
    "Location__c" : "New York"
}

用于更新关系记录的示例响应正文未返回

最后,使用 DELETE 方法可以删除相关记录。使用 DELETE 删除关系记录的示例

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Merchandise__c/a01D000000INjVe/Distributor__r -H "Authorization: Bearer token" -X DELETE

删除关系记录的请求正文示例不需要更新关系记录的示例响应正文未返回

遍历具有多个记录的关系

您可以遍历与多个记录的关系,并获得以下响应: 包含记录集。对于解析为多个记录的关系, 仅支持 GET 方法。遍历具有多条记录的关系的示例如果我们有一个名为 Merchandise__c 的自定义对象,其中包含 master – Line_Item__c自定义对象的详细信息关系字段, 以下示例Line_Item__c检索与 Merchandise__c记录。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Merchandise__c/a01D000000INjVe/Line_Items__r -H "Authorization: Bearer token"

用于遍历具有多个关系的示例请求正文 记录不需要用于遍历具有多个关系的示例响应正文 记录在此示例中,有两条Line_Item__c记录是 检索。

{
    "done" : true,
    "totalSize" : 2,
    "records" :
    [
        {
            "attributes" :
            {
                "type" : "Line_Item__c",
                "url" : "/services/data/v59.0/sobjects/Line_Item__c/a02D0000006YL7XIAW"
            },
            "Id" : "a02D0000006YL7XIAW",
            "IsDeleted" : false,
            "Name" : "LineItem1",
            "CreatedDate" : "2011-12-16T17:44:07.000+0000",
            "CreatedById" : "005D0000001KyEIIA0",
            "LastModifiedDate" : "2011-12-16T17:44:07.000+0000",
            "LastModifiedById" : "005D0000001KyEIIA0",
            "SystemModstamp" : "2011-12-16T17:44:07.000+0000",
            "Unit_Price__c" : 9.75,
            "Units_Sold__c" : 10.0,
            "Merchandise__c" : "a00D0000008oLnXIAU",
            "Invoice_Statement__c" : "a01D000000D85hkIAB"
        },
        {
            "attributes" :
            {
                "type" : "Line_Item__c",
                "url" : "/services/data/v59.0/sobjects/Line_Item__c/a02D0000006YL7YIAW"
            },
            "Id" : "a02D0000006YL7YIAW",
            "IsDeleted" : false,
            "Name" : "LineItem2",
            "CreatedDate" : "2011-12-16T18:53:59.000+0000",
            "CreatedById" : "005D0000001KyEIIA0",
            "LastModifiedDate" : "2011-12-16T18:53:59.000+0000",
            "LastModifiedById" : "005D0000001KyEIIA0",
            "SystemModstamp" : "2011-12-16T18:54:00.000+0000",
            "Unit_Price__c" : 8.5,
            "Units_Sold__c" : 8.0,
            "Merchandise__c" : "a00D0000008oLnXIAU",
            "Invoice_Statement__c" : "a01D000000D85hkIAB"
        }
    ]
}

这 结果数据的序列化结构与结果数据的格式相同 通过 REST API 执行 SOQL 查询。有关通过以下方式执行 SOQL 查询的更多详细信息,请参阅查询 REST API

如果没有相关记录与关系名称关联,则 REST API 调用 返回 200 响应,响应正文中没有记录数据。这个结果是 与遍历到单个记录的空关系时的结果形成对比, 返回 404 错误响应。此行为是因为单个记录大小写 解析为可与 PATCH 或 DELETE 方法一起使用的 REST 资源。在 相比之下,只能查询多记录大小写。如果对具有多个记录的关系的初始 GET 请求仅返回部分 的结果中,响应的末尾包含字段 。例如,您可以获取一个字段 就像下面这样在你的末尾 响应。

nextRecordsUrl

"nextRecordsUrl" : "/services/data/v59.0/query/01gD0000002HU6KIAW-2000"

您可以使用实例提供的 URL 请求下一批记录 和会话信息,然后重复,直到检索到所有记录。这些 请求使用和不使用 包括任何参数。最后一批记录没有字段。nextRecordsUrlnextRecordsUrl检索剩余结果的示例用法

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/query/01gD0000002HU6KIAW-2000 -H "Authorization: Bearer token"

用于检索其余结果的示例请求正文不需要用于检索剩余结果的示例响应正文

{
    "done" : true,
    "totalSize" : 3200,
    "records" : [...]
}

筛选结果字段

通过关系遍历检索记录时,可以选择仅指定 使用参数返回记录字段的子集。多个字段用逗号分隔。这 以下示例仅从Distributor__c中检索 Location__c 字段 与Merchandise__c关联的记录 记录:

fields

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Merchandise__c/a01D000000INjVe/Distributor__r?fields=Location__c -H "Authorization: Bearer token"

这 JSON 响应数据类似于 以后:

{
    "attributes" :
    {
        "type" : "Distributor__c",
        "url" : "/services/data/v59.0/sobjects/Distributor__c/a03D0000003DUhhIAG"
    },
    "Location__c" : "Chicago",
}

同样,对于产生多条记录的请求,您可以使用字段列表 指定记录集中返回的字段。例如,假设您有一个 与两个Line_Item__c记录关联的关系。你只想要 这些记录中的名称和Units_Sold__c字段。您可以使用以下命令 叫。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Merchandise__c/a01D000000INjVe/Line_Items__r?fields=Name,Units_Sold__c -H "Authorization: Bearer token"

这 响应数据将类似于 以后。

{
    "done" : true,
    "totalSize" : 2,
    "records" : 
    [
        {
            "attributes" :
            {
                "type" : "Line_Item__c",
                "url" : "/services/data/v59.0/sobjects/Line_Item__c/a02D0000006YL7XIAW"
            },
            "Name" : "LineItem1",
            "Units_Sold__c" : 10.0
        },
        {
            "attributes" :
            {
                "type" : "Line_Item__c",
                "url" : "/services/data/v59.0/sobjects/Line_Item__c/a02D0000006YL7YIAW"
            },
            "Name" : "LineItem2",
            "Units_Sold__c" : 8.0
        }
    ]
}

如果字段参数集中列出的任何字段对活动对象不可见 用户,则 REST API 调用失败。在前面的示例中,如果 Units_Sold_c 字段 被字段级安全性对活动用户隐藏,则调用将返回 400 错误响应。

获取给定时间范围内已删除记录的列表

使用 sObject Get Deleted 资源获取指定对象的已删除记录列表。指定日期和时间范围 其中删除了给定对象的记录。已删除的记录将写入删除日志(定期清除),并将从大多数操作中筛选出,例如 sObject 行或查询(尽管 QueryAll 将在结果中包含已删除的记录)。获取已删除的Merchandise__c记录列表的示例用法 2013年5月5日至2013年5月10日

curl https://MyDomainName.my/services/data/v59.0/sobjects/Merchandise__c/deleted/​​​?start=2013-05-05T00%3A00%3A00%2B00%3A00&end=2013-05-10T00%3A00%3A00%2B00%3A00 -H "Authorization: Bearer token"

示例请求正文不需要JSON 示例响应正文

{ 
    "deletedRecords" : 
    [ 
        { 
            "id" : "a00D0000008pQRAIA2", 
            "deletedDate" : "2013-05-07T22:07:19.000+0000"
        }
    ],
    "earliestDateAvailable" : "2013-05-03T15:57:00.000+0000",
    "latestDateCovered" : "2013-05-08T21:20:00.000+0000"
}

XML 示例响应正文

<?xml version="1.0" encoding="UTF-8"?> 
<Merchandise__c> 
    <deletedRecords> 
        <deletedDate>2013-05-07T22:07:19.000Z</deletedDate> 
        <id>a00D0000008pQRAIA2</id> 
    </deletedRecords>
    <earliestDateAvailable>2013-05-03T15:57:00.000Z</earliestDateAvailable>
    <latestDateCovered>2013-05-08T21:20:00.000Z</latestDateCovered>
</Merchandise__c>

获取给定时间范围内更新的记录列表

使用 sObject Get Updated 资源获取 指定的对象。指定给定记录的日期和时间范围 对象已更新。获取已更新的Merchandise__c记录列表的示例用法 2013年5月6日至2013年5月10日

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Merchandise__c/updated/​​​?start=2013-05-06T00%3A00%3A00%2B00%3A00&end=2013-05-10T00%3A00%3A00%2B00%3A00 -H "Authorization: Bearer token"

示例请求正文不需要JSON 示例响应正文

{ 
    "ids" : 
    [ 
        "a00D0000008pQR5IAM", 
        "a00D0000008pQRGIA2", 
        "a00D0000008pQRFIA2"
    ],
    "latestDateCovered" : "2013-05-08T21:20:00.000+0000" 
}

XML 示例响应正文

<?xml version="1.0" encoding="UTF-8"?> 
<Merchandise__c> 
    <ids>a00D0000008pQR5IAM</ids>
    <ids>a00D0000008pQRGIA2</ids>
    <ids>a00D0000008pQRFIA2</ids>
    <latestDateCovered>2013-05-08T21:20:00.000Z</latestDateCovered>
</Merchandise__c>

REST快开始

若要设置和运行 REST API,请将一些基本请求发送到 Salesforce的。本快速入门介绍了如何设置基本环境和更新记录 使用 REST API。您可以通过多种方式设置和使用 REST API,示例演示了如何使用 免费的 Developer Edition 和 cURL。

  1. 使用 cURL 了解可与 cURL
    一起使用以向 Salesforce 发出请求的格式。此 Quick Start 使用 cURL 示例,但您可以使用任何可以发出 REST 请求的工具或开发环境。
  2. 第一步:注册 Salesforce Developer Edition Developer Edition
    提供了一个免费且简单的解决方案,以便您可以使用 Salesforce 进行测试和开发。
  3. 第二步:设置身份验证
    若要成功发送请求,REST API 需要通过身份验证获取的访问令牌。虽然您可以针对自己的连接应用程序创建和进行身份验证,但为了方便起见,这些快速入门示例使用 Salesforce CLI。Salesforce CLI 是一个可以进行身份验证的连接应用程序,无需进行任何配置。
  4. 第三步:演练示例代码
    要访问 Salesforce 中不同类型的资源,请发出一系列 REST 请求。在尝试这些示例之前,请确保完成先决条件并获取本快速入门的步骤 1 中的访问令牌。
  5. 使用其他工具 其他工具
    可用于从 Salesforce 组织获取数据。

使用 cURL

了解可用于 cURL 向 Salesforce 发出请求的格式。 此 Quick Start 使用 cURL 示例,但您可以使用任何工具或开发环境 可以发出 REST 请求。

充分熟悉 cURL,以便能够理解本指南中的示例 并将它们翻译成您正在使用的工具。附加包含 请求中,您必须正确设置访问令牌的格式。使用这些提示来帮助您使用 cURL 在完成快速入门时。有关 cURL 的详细信息,请参阅 curl.se。

附加请求正文

许多示例包括请求正文,即包含请求数据的 JSON 或 XML 文件。 使用 cURL 时,请将这些文件保存到本地系统,并使用 或选项。—data-binary-d此示例附加文件。

new-account.json

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/ -H 'Authorization Bearer 00DE0X0A0M0PeLE!AQcAQH0dMHEXAMPLEzmpkb58urFRkgeBGsxL_QJWwYMfAbUeeG7c1EXAMPLEDUkWe6H34r1AAwOR8B8fLEz6nEXAMPLE' -H "Content-Type: application/json" —d @new-account.json -X POST

处理访问令牌中的感叹号运行 cURL 示例时,您可能会在 macOS 和 Linux 系统上出现错误,因为 OAuth 访问令牌中存在感叹号 (!)。为避免出现此错误, 对感叹号进行转义或使用单引号。转义感叹号 访问令牌,当访问令牌用双括起来时,在其前面插入反斜杠 引号。

\!

例如,访问令牌字符串 此 cURL 命令的感叹号 (!) 已转义。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/ -H "Authorization: Bearer 00DE0X0A0M0PeLE\!AQcAQH0dMHEXAMPLEzmpkb58urFRkgeBGsxL_QJWwYMfAbUeeG7c1EXAMPLEDUkWe6H34r1AAwOR8B8fLEz6nEXAMPLE"

或 您可以将访问令牌括在单引号内,以免对感叹号进行转义。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/ -H 'Authorization: Bearer 00DE0X0A0M0PeLE!AQcAQH0dMHEXAMPLEzmpkb58urFRkgeBGsxL_QJWwYMfAbUeeG7c1EXAMPLEDUkWe6H34r1AAwOR8B8fLEz6nEXAMPLE'

重要

所有引号,无论是单引号还是双引号,都必须是直引号,而不是 卷曲引号。

步 一:注册 Salesforce Developer Edition

Developer Edition 提供了一个免费且简单的解决方案,以便您可以将 Salesforce 用于 测试和开发。要注册 Developer Edition 帐户,请转到 developer.salesforce.com/signup。

注意

开发商 版本数据存储最大为 5 MB。此限制不会阻止您使用这些 例子。

如果您有开发沙盒,则可以将其与这些示例一起使用。

在开始之前,请按照以下方式验证您的用户配置文件是否具有 API 已启用权限 Salesforce 帮助中的用户权限中的说明。

第二步:设置身份验证

若要成功发送请求,REST API 需要由 认证。尽管您可以针对自己的连接应用创建和进行身份验证, 为方便起见,这些快速入门示例使用 Salesforce CLI。Salesforce CLI 是连接的 可以进行身份验证的应用程序,并且无需进行任何操作即可进行配置。

使用 Salesforce CLI 获取访问令牌

使用您从 Salesforce CLI 获取的访问令牌(也称为“持有者令牌”) 对 cURL 请求进行身份验证。

  1. 安装或更新 Salesforce CLI。.
    1. 如果您已安装 Salesforce CLI,请按照更新 Salesforce CLI 中的说明进行更新。
    2. 如果您需要安装 Salesforce CLI, 为您的操作系统安装最新版本。
    3. 验证您的安装。
  2. 使用 Salesforce CLI 登录您的开发人员组织。sf org login web浏览器打开 https://login.salesforce.com。
  3. 在浏览器中,使用用户的凭据登录到开发人员组织。
  4. 在浏览器中,单击允许”以允许访问。在命令下 行中,您会看到类似的确认 消息。Successfully authorized juliet.capulet@empathetic-wolf-g5qddtr.com with org ID 00D5fORGIDEXAMPLE
  5. 在命令行中,通过查看有关以下内容的身份验证信息来获取访问令牌 您的组织。sf org display --target-org <username>为 例:sf org display --target-org juliet.capulet@empathetic-wolf-g5qddtr.com例 命令输出:=== Org Description KEY VALUE ─────────────── ──────────────────────────────────────────────────────────────────────────────────────────────────────────────── Access Token 00DE0X0A0M0PeLE!AQcAQH0dMHEXAMPLEzmpkb58urFRkgeBGsxL_QJWwYMfAbUeeG7c1EXAMPLEDUkWe6H34r1AAwOR8B8fLEz6nEXAMPLE Api Version 59.0 Client Id PlatformCLI Created By jules@sf.com Created Date 2023-11-16T20:35:21.000+0000 Dev Hub Id jules@sf.com Edition Developer Expiration Date 2023-11-23 Id 00D5fORGIDEXAMPLE Instance Url https://MyDomainName.my.salesforce.com Org Name Dreamhouse Signup Username juliet.capulet@empathetic-wolf-g5qddtr.com Status Active Username juliet.capulet@empathetic-wolf-g5qddtr.com在 ,记下长访问令牌字符串和实例 URL 字符串。您需要两者才能发出 cURL 请求。注意在访问后获取新令牌 令牌过期时,请重复此步骤以查看您的身份验证信息。

可选的 Salesforce CLI 快捷方式

成功进行身份验证后,请在 cURL 中尝试这些可选快捷方式 工作流,以简化未来使用 Salesforce CLI 进行身份验证的流程。

列出我的组织

sf org list

列出您创建的所有组织 或经过身份验证。

打开我的组织

sf org open --target-org <username>

打开 浏览器中的指定组织(由用户名或别名标识)。因为你已经成功了 以前使用 Salesforce CLI 命令向此组织进行身份验证,不需要提供您的凭据 再。

org login web

显示“我的组织”的访问令牌

sf org display --target-org <username>

输出 包括您的访问令牌、客户端 ID、连接状态、组织 ID、实例 URL、用户名和 别名(如果适用)。

为我的用户名设置别名为方便起见,请为您的用户名创建一个别名,这样您就不必输入 整个 Salesforce 字符串。例如,代替

juliet.capulet@empathetic-wolf-g5qddtr.com

创造 像

dev

要在此示例中设置别名, 跑

sf alias set dev juliet.capulet@empathetic-wolf-g5qddtr.com

在脚本中使用这些命令

通过调用标志来使用 CLI 的 JSON 输出。 请求 JSON 输出提供一致的输出格式,非常适合运行 脚本。如果没有该标志,CLI 可以更改 输出格式。–json–json

第三步:演练示例代码

要访问 Salesforce 中不同类型的资源,请发出一系列 REST 请求。 在尝试这些示例之前,请确保完成先决条件并获取访问权限 令牌。

您可以复制并粘贴这些示例,以使用 cURL 发送它们。但首先将基本 URI 替换为您的 Salesforce 域。为 有关 REST 请求剖析的信息,请参阅 REST 资源和请求。MyDomainName

获取 Salesforce 版本

要检索有关每个可用 Salesforce 版本的信息,请提交版本请求。在这种情况下,请求不需要身份验证。

curl https://MyDomainName.my.salesforce.com/services/data/

此请求的输出(包括响应标头)指定所有有效的 版本。结果可以包含多个值。

Content-Length: 88 
Content-Type: application/json; 
charset=UTF-8 Server:
[
    {
        "label":"Spring '11",
        "url":"/services/data/v21.0",
        "version":"21.0"
    }
    ...
]

获取资源列表

检索可用于 Salesforce 的资源列表,在此示例中,用于 版本 59.0,请提交“按版本划分的资源”请求。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/ -H "Authorization: Bearer access_token"

此请求的输出显示这是 Salesforce 版本 59.0 中的可用资源之一。sobjects

{
    "sobjects" : "/services/data/v59.0/sobjects",
    "search" : "/services/data/v59.0/search",
    "query" : "/services/data/v59.0/query",
    "recent" : "/services/data/v59.0/recent"
}

获取可用列表 对象

要请求可用对象的列表,请提交“描述全局”请求。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/ -H "Authorization: Bearer access_token"

此请求的输出显示 Account 对象可用。

Transfer-Encoding: chunked 
Content-Type: application/json; 
charset=UTF-8 Server:
{
 "encoding" : "UTF-8",
 "maxBatchSize" : 200,
 "sobjects" : [ {
    "name" : "Account",
    "label" : "Account",
    "custom" : false,
    "keyPrefix" : "001",
    "updateable" : true,
    "searchable" : true,
    "labelPlural" : "Accounts",
    "layoutable" : true,
    "activateable" : false,
    "urls" : { "sobject" : "/services/data/v59.0/sobjects/Account",
    "describe" : "/services/data/v59.0/sobjects/Account/describe",
    "rowTemplate" : "/services/data/v59.0/sobjects/Account/{ID}" },
    "createable" : true,
    "customSetting" : false,
    "deletable" : true,
    "deprecatedAndHidden" : false,
    "feedEnabled" : false,
    "mergeable" : true,
    "queryable" : true,
    "replicateable" : true,
    "retrieveable" : true,
    "undeletable" : true,
    "triggerable" : true },
   },
...

获取对象基本信息

若要检索有关可用 Account 对象元数据的基本信息,请提交 sObject 基本信息请求。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/ -H "Authorization: Bearer access_token"

此请求的输出显示 Account 对象的基本属性,例如其 名称和标签,并列出最近使用的帐户。

{
    "objectDescribe" : 
    {  
        "name" : "Account",  
        "updateable" : true,  
        "label" : "Account",  
        "keyPrefix" : "001",  
        
        ...
        
        "replicateable" : true,  
        "retrieveable" : true,  
        "undeletable" : true,  
        "triggerable" : true
    },
    "recentItems" : 
    [ 
        {  
            "attributes" : 
            {    
                "type" : "Account",    
                "url" : "/services/data/v59.0/sobjects/Account/001D000000INjVeIAL"  
            },  
            "Id" : "001D000000INjVeIAL",  
            "Name" : "asdasdasd"
        }, 

        ...

    ]
}

获取字段列表

若要检索更详细的信息,请提交 sObject Describe 请求。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/describe/ -H "Authorization: Bearer access_token"

此请求的输出显示有关帐户的更多详细信息 对象,例如其字段属性和子关系。

{
    "name" : "Account",
    "fields" : 
    [
        {
            "length" : 18,
            "name" : "Id",
            "type" : "id",
            "defaultValue" : { "value" : null },
            "updateable" : false,
            "label" : "Account ID",
            ...
        },
        ...
    ],
    "updateable" : true,
    "label" : "Account",
    ...
    "urls" : 
    {  
        "uiEditTemplate" : "https://MyDomainName.my.salesforce.com/{ID}/e",  
        "sobject" : "/services/data/v59.0/sobjects/Account",  
        "uiDetailTemplate" : "https://MyDomainName.my.salesforce.com/{ID}",  
        "describe" : "/services/data/v59.0/sobjects/Account/describe",  
        "rowTemplate" : "/services/data/v59.0/sobjects/Account/{ID}",  
        "uiNewRecord" : "https://MyDomainName.my.salesforce.com/001/e"
    },
    "childRelationships" : 
    [ 
        {  
            "field" : "ParentId",  
            "deprecatedAndHidden" : false,  
            ...
        }, 
        ...
    ],
     
    "createable" : true,
    "customSetting" : false,
    ...
}

执行 SOQL 查询

若要执行检索所有帐户名称值列表的 SOQL 查询,请提交 查询请求。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/query?q=SELECT+name+from+Account -H "Authorization: Bearer access_token"

输出列出了可用的帐户名称,以及每个名称的前面属性 包括帐户 ID。

{
    "done" : true,
    "totalSize" : 14,
    "records" :
    [
        {
            "attributes" :
            {
                "type" : "Account",
                "url" : "/services/data/v59.0/sobjects/Account/001D000000IRFmaIAH"
            },
            "Name" : "Test 1"
        },
        {
            "attributes" :
            {
                "type" : "Account",
                "url" : "/services/data/v59.0/sobjects/Account/001D000000IomazIAB"
            },
            "Name" : "Test 2"
        },
        ...
    ]
}

注意

您可以在 Salesforce SOQL 和 SOSL 参考中找到有关 SOQL 的更多信息 指南。

更新记录中的字段

若要检索其中一个帐户并更新其帐单城市,请提交 sObject 行请求。要更新对象,请创建一个名为 patchaccount.json 的文本文件,其中包含新的计费城市 信息。

{
    "BillingCity" : "Fremont"
}

在 REST 请求中指定此 JSON 文件。cURL 表示法在指定数据时需要该选项。查看更多 信息,请参阅 http://curl.haxx.se/docs/manpage.html。—d

此外,指定方法,该方法用于 更新 REST 资源。此 cURL 命令检索指定的 Account 对象 使用其 ID 字段并更新其帐单城市。PATCH

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/001D000000IroHJ -H "Authorization: Bearer access_token" -H "Content-Type: application/json" --data-binary @patchaccount.json -X PATCH

不返回响应正文,只返回标头。

HTTP/1.1 204 No Content
Server: 
Content-Length: 0

若要查看帐单地址是否已更改为 Fremont,请刷新 帐户。

使用其他工具

其他工具可用于从 Salesforce 组织获取数据。

如果不想使用 CURL,可以使用其他工具来练习 API。可能 选项包括:

  • Salesforce 命令行界面。
  • Postman(第三方工具)。有关详细信息,请参阅 Postman API 客户端 Trailhead 模块。

这些工具提供了简化创建和发送过程的功能 许多 API 请求。

REST API 简介

REST API 允许您以编程方式访问 Salesforce 中的数据。这 REST API 的灵活性和可扩展性使其成为集成 Salesforce 的绝佳选择 到您的应用程序中,并用于大规模执行复杂的操作。

使用本指南设置部署环境并了解有关以下方面的高级详细信息 数据访问。但是,理解和使用 REST API 需要对软件有基本的了解 开发、Web 服务和 Salesforce 用户界面。

如果您想立即采取行动,快速入门指南涵盖了帮助您入门的基础知识 和运行。

如果您正在寻找有关 Salesforce API 的更多上下文,请查看链接列表。

提示

Salesforce REST API 旨在与 Salesforce 对象一起使用。请参阅 Salesforce 的对象参考 有关 Salesforce 对象的介绍和更多信息的平台。

关于 REST API

REST API 是可用于访问 Salesforce 的多个 Web 界面之一 数据,而不使用 Salesforce 用户界面。通过 API 访问,您可以执行操作和 根据需要将 Salesforce 集成到您的应用程序中。

您可以使用 REST API 工具通过发送 HTTP 在 Salesforce 中创建、操作和搜索数据 对 Salesforce 中端点的请求。根据您发送请求的位置,您可以访问和操作 在不同的信息上,称为资源。资源包括记录、查询结果、 元数据等。

REST API 使用 RESTful 架构来提供简单且一致的接口。一个 REST API 的主要优点是它不需要太多工具即可访问您的数据。它 比 SOAP API 更易于使用,但仍然提供了大量功能。

尽管 REST API 非常适合访问和查询记录,但其他 Salesforce API,例如 Bulk 2.0 API、元数据 API 和 Connect REST API 为特定 任务。

REST API 发行说明

使用 Salesforce 发行说明了解 REST API。

有关影响 Salesforce Platform(包括 REST API)的更新和更改,请参阅 API 发行说明。

为 新的、已更改的和已弃用的调用以及特定于 REST API 的其他更改,请参阅 Salesforce 发行说明中的 REST API。

支持的版本和所需的权限

要使用 Salesforce API 访问您的 Salesforce 组织和数据,您需要一个组织 以及启用了 API 访问权限的用户。有多个支持 API 的 Salesforce 版本 访问权限和向用户授予 API 权限的多种方式。

API 访问支持的版本

默认情况下,API 访问在 Enterprise、Performance、Unlimited 和 Developer 中处于启用状态 版本组织。Professional Edition 组织可以将 API 访问权限添加为附加组件。查看更多 信息,请访问 Salesforce 帮助:使用“您的”添加产品和许可证 帐户应用程序或联系 Salesforce 客户经理。

如果您向没有 API 访问权限的组织发送 API 请求,Salesforce 将返回错误。API_DISABLED_FOR_ORG

为了保护生产组织中的配置和实时数据,我们建议使用 用于主动开发和测试的隔离环境,例如 aDeveloper Edition org、 沙盒或 Scratch 组织。准备就绪后,您可以将成功的更改转移到生产中 组织。

API 用户权限

若要进行任何 API 调用,用户必须在用户中启用“已启用 API”权限 他们分配的配置文件。默认情况下,某些配置文件上启用此权限,包括 Developer Edition 组织中提供的许多配置文件。在受支持的版本中,您还可以使用 Salesforce 集成用户许可证,用于授予系统到系统集成用户完整的组织权限 访问,同时将它们限制为仅限 API 的操作。有关详细信息,请参阅 Salesforce 帮助:仅授予集成用户 API 访问权限

REST 资源和请求

REST API 基于资源的使用情况 – 片段 Salesforce 中的数据,例如记录、记录集合、查询结果、元数据、 或 API 信息。每个资源都由统一资源标识符 (URI) 公开,并且 通过向相应的 URI 发送 HTTP 请求来访问。取决于您要访问的资源以及访问方式 构造 HTTP 请求时,可以执行多种类型的操作,包括:

  • 确定可用的 API 版本
  • Salesforce 组织的访问限制
  • 检索对象元数据
  • 创建、读取、更新和删除记录
  • 查询和搜索数据

您可以使用各种软件工具发送 HTTP 请求,这意味着确切的 请求的外观可能与本指南中的 cURL 示例不同。 但是,无论您如何提交请求,元素都不会更改。典型请求 由这些元素组成。

  • URI
  • HTTP 方法
  • 请求正文(GET 请求不需要)

URI

URI 是 Salesforce 中资源的路径。尽管 URI 从 资源到资源,基本结构保持不变。

https://MyDomainName.my.salesforce.com/services/data/vXX.X/resource/

用于安全访问资源。https://

替换为 Salesforce 组织的子域。Salesforce 在多个服务器实例上运行,因此 本指南中的示例用于代替特定的 实例。MyDomainNameMyDomainName

替换为版本 要使用的 API。您可以通过以下方式找到可用版本列表 访问 Versions 资源。XX.X

替换为 资源路径的其余部分。根据资源的不同,路径可以包含 参数,例如用于标识特定记录的 ID。您可以找到 的 URI 本指南的“参考”部分中的不同资源。resource

sObject 资源访问 Salesforce 中的标准和自定义对象。有关的信息 对象,请参阅 对象参考 Salesforce平台。

注意

URI 的某些部分区分大小写,例如 ID。URI 的其他部分不是 区分大小写,例如对象和字段名称。如果您的请求不成功, 通过将 URI 与示例进行比较,检查 URI 是否具有正确的字母大小写 在本指南中。

HTTP 方法

REST API 支持标准 HTTP 请求方法(HEAD、GET、POST、PATCH、PUT 和 DELETE),它们遵循 https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html 中的规范。

每种方法的用途因资源而异。有关如何操作的信息 以及何时使用每种方法,请在参考中查看该资源的页面 部分。

使用标头传递参数并自定义 HTTP 请求的选项。REST API 支持多个标准 HTTP 标头,以及特定于 到 Salesforce。

示例中使用的常见标头包括:

  • HTTP Accept – 指示客户端接受的格式 响应正文。可能的值为 和 。缺省值为 。application/jsonapplication/xmlapplication/json
  • HTTP Content-type – 指示您的请求正文的格式 附加到请求。可能的值为 和 。application/jsonapplication/xml
  • HTTP 授权 – 提供 OAuth 2.0 访问令牌以授权您的 客户。REST API 支持持有者身份验证类型。
  • 压缩标头 – 压缩请求或响应。查看更多 信息,请参阅压缩 标头。
  • 条件请求标头 – 验证您访问所依据的记录 一个前提条件。有关详细信息,请参阅条件请求 标头。

请求机构

请求正文是一个丰富的输入,可以包含在请求中以提供 其他信息,例如用于创建或更新记录的字段值。一个 请求正文可以是 JSON 或 XML 格式。

注意

使用 GET 方法访问的资源不需要附加请求 身体。

使用 HTTP Content-type 标头指示请求正文的文件格式。如果 使用 cURL 发送请求,使用 或选项。—data-binary-d

REST API 体系结构

REST API 遵循标准的 RESTful 原则和特征。
客户端-服务器
客户端应用程序独立于 Salesforce REST API,这意味着每个应用程序都是托管的 并独立更新。
无 国籍
从客户端到服务器的每个请求都必须包含所有必要的信息 了解请求,并且不要在服务器上使用任何存储的上下文。但是, 资源的表示形式使用 URI 相互连接,允许客户端 在各州之间取得进展。
缓存行为
响应被标记为可缓存或不可缓存。
统一界面
所有资源都通过 HTTPS 的通用接口进行访问。
命名资源
所有资源都使用遵循 Lightning 平台的基本 URI 进行命名 端点。有关详细信息和示例,请参阅 REST 资源和请求。
分层组件
允许在客户端和 资源。
除了标准的 RESTful 原则外,REST API 还包括其他关键特性 在其架构中,在开发 应用。

认证
REST API 支持 OAuth 2.0(一种允许安全 API 授权的开放协议)。有关更多详细信息,请参阅 Salesforce 帮助中的使用 OAuth 授权应用程序。
支持 JSON 和 XML
JSON 请求在 UTF-8 中受支持,并且是默认请求。支持 XML 请求 采用 UTF-8 和 UTF-16 格式。XML 响应以 UTF-8 格式提供。使用标头指定 JSON 或 XML。HTTP ACCEPT
在版本 57.0 及更早版本中,可以追加 URI 或向 URI 添加。例如。我们建议使用 用于指定 JSON 或 XML 的标头 相反。jsonxml/Account/001D000000INjVe.jsonHTTP ACCEPT
在版本 58.0 及更高版本中,不支持将 JSON 或 XML 追加到 URI。
压缩
压缩通过压缩 REST API 之间发送的消息来减少带宽负载 和你的客户。REST API 支持使用 gzip 和 deflate 进行压缩,定义如下 HTTP 1.1 规范。请参阅压缩标头。
条件请求
响应缓存由遵循标准的条件请求标头支持 由 HTTP 1.1 规范定义,但有一些例外。请参阅条件请求 头。
跨域资源共享
跨域资源共享 (CORS) 使 Web 浏览器能够从 出身以外的其他来源。例如,使用 CORS,JavaScript 代码位于 https://www.example.com 可以向 https://www.salesforce.com 请求资源。自 从 JavaScript 访问受支持的 Salesforce API、Apex REST 资源和 Lightning Out 代码,将提供代码的来源添加到 Salesforce CORS 允许列表。 请参阅从 Web 浏览器执行跨域请求。
Salesforce ID 长度
响应正文中的 Salesforce ID 始终为 18 个字符的 ID。在请求正文中,您 可以使用 15 个字符的 ID 或 18 个字符的 ID。
方法重写
如果使用不允许重写或 设置任意HTTP方法名称,请使用request参数。_HttpMethod
POST https://instance_name/services/data/v59.0/chatter/
/chatter/users/me/conversations/03MD0000000008KMAQ
?_HttpMethod=PATCH&read=true
注意

该参数区分大小写。用 所有值的正确大小写。_HttpMethod

HTTPS协议
客户端和服务器之间的所有通信都通过 HTTPS 进行。

通过连接的应用程序和 OAuth 2.0 进行授权

要使客户端应用程序访问 REST API 资源,必须将其授权为保险箱 游客。若要实现此授权,请使用连接的应用程序和 OAuth 2.0 授权 流。

配置连接的应用程序

连接的应用代表客户端应用程序请求访问 REST API 资源。为 连接的应用程序要请求访问权限,则必须使用 OAuth 2.0 协议。OAuth 2.0 是一种开放协议,它授权在 通过代币交换进行申请。

有关配置连接的应用程序的说明,请参阅在 Salesforce 中创建连接的应用程序 帮助。具体而言,请按照启用 API 的 OAuth 设置中的步骤操作 集成。

应用 OAuth 授权流程

OAuth 授权流授予客户端应用对 REST API 资源的受限访问权限 资源服务器。每个 OAuth 流都提供不同的流程来批准对客户端的访问 应用程序,但通常流程由三个主要步骤组成。

  1. 若要启动授权流,代表客户端应用请求的已连接应用 访问 REST API 资源。
  2. 作为响应,授权服务器将访问令牌授予连接的应用程序。
  3. 资源服务器验证这些访问令牌并批准对受保护令牌的访问 REST API 资源。

查看并选择 OAuth 授权流后,将其应用于连接的应用。为 有关每个受支持的流程的详细信息,请参阅 Salesforce 中的 OAuth 授权流程 帮助

更多资源

Salesforce 提供以下资源来帮助您浏览连接的应用程序和 OAuth:

  • Salesforce 帮助:连接的应用程序
  • Salesforce 帮助:使用以下方式授权应用程序 OAuth的
  • Salesforce 帮助:OpenID Connect 令牌 内省
  • Trailhead:使用 连接的应用程序

REST API 支持多个标准和自定义 HTTP 标头,包括两个请求 标头和响应标头。

  • 分配规则标头 分配规则标头是在创建或更新客户、案例或潜在顾客时应用的请求标头
    。如果启用,则使用活动分配规则。如果禁用,则不应用活动分配规则。如果提供了有效的 AssignmentRule ID,则应用 AssignmentRule。如果未随请求一起提供标头,则 REST API 默认使用活动分配规则。
  • 调用选项标头
    指定用于访问 REST API 资源的客户端的选项。例如,可以提供默认命名空间前缀,这样就不需要在代码中指定前缀。
  • 压缩标头
    使用压缩标头压缩 REST API 请求或响应。压缩会降低请求所需的带宽,尽管它需要客户端的更多处理能力。在大多数情况下,这种权衡有利于应用程序的整体性能。
  • 条件请求标头
    在访问资源之前,使用条件请求标头来验证资源。通过在标头中设置前提条件,可以确保仅当满足该前提条件时,请求才会成功。此功能可帮助您在更新 Salesforce 数据时防止错误并拒绝过时的请求。您可以使用条件请求标头实现各种技术,例如响应缓存。
  • 重复规则标头
    配置重复规则的选项。Salesforce 使用重复规则来查看正在创建、更新或更新插入的记录是否与现有记录重复。重复规则是重复管理的一部分。
  • 限制信息标头 此响应标头
    在对 REST API 的每个请求中返回(对版本 URI 的调用除外,这些调用不计入组织的限制)。您可以使用这些信息来监控 API 限制。/
  • 包版本标头
    指定客户端引用的每个包的版本。包版本是一个数字,用于标识包中包含的组件和行为集。此标头还可用于在调用 Apex REST Web 服务时指定包版本。
  • 查询选项标头
    指定查询中使用的选项,例如查询结果批大小。将此请求标头与查询资源一起使用。
  • 警告标头
    如果存在警告,例如使用已弃用的 API 版本,则返回此标头。

分配规则标头

分配规则标头是在创建或更新时应用的请求标头 客户、案例或潜在顾客。如果启用,则使用活动分配规则。如果禁用, 不应用活动分配规则。如果提供了有效的 AssignmentRule ID,则 应用 AssignmentRule。如果未随请求一起提供标头,则 REST API 默认为 使用活动分配规则。

标头字段名称和值

注意

在进行 REST API 调用时,也会应用此标头,这些调用间接导致 创建或更新客户、案例或潜在客户。例如,如果将此标头与 更新记录的调用,并且更新将执行更新 Case 的 Apex 触发器 将应用分配规则。字段名称Sforce-Auto-Assign字段值

  • TRUE.应用活动分配规则 创建或更新了客户、案例或潜在顾客。
  • FALSE.活动分配规则不是 适用于已创建或更新的客户、案例或潜在客户。
  • 有效的 AssignmentRule ID。给定的 AssignmentRule 应用于创建的帐户, 案例或线索。

TRUE并且不区分大小写。FALSE

如果请求中未提供标头,则默认值为 。TRUESforce-Auto-Assign: FALSE

看涨期权标题

指定用于访问 REST 的客户端的选项 API 资源。例如,您可以提供默认的命名空间前缀,以便您不 需要在代码中指定前缀。

“调用选项”标头可以与 sObject 基本信息、sObject 行、按外部 ID 划分的 sObject 行、Query、QueryAll、 和搜索。 批量 API 和批量 API 2.0 也支持它。

标头字段名称和值

字段名称Sforce-Call-Options字段值

  • client– 用作 发送请求的客户端的标识符。此字符串 显示在日志文件中,帮助您跟踪哪个客户端发送了 请求。
  • defaultNamespace——答 开发人员命名空间前缀用作 请求。使用此标头字段,请求将解析 没有指定命名空间的托管包。(不支持 批量 API。

如果 developer 命名空间前缀为 ,并且 您在包中有一个名为 botId 的自定义字段,请将 带有调用选项的默认命名空间 页眉:

battle

Sforce-Call-Options: client=caseSensitiveToken; defaultNamespace=battle

然后 如下所示的查询成功:

/services/data/vXX.X/query/?q=SELECT+Id+botID__c+FROM+Account

在本例中,实际查询的字段是battle__botId__c字段。

使用此标头可以编写客户端代码,而无需指定 命名空间前缀。在前面的示例中,如果没有标头,则必须编写 battle__botId__c。

如果设置了此字段,并且查询还指定了命名空间,则响应 不包含前缀。例如,如果将此标头设置为 ,并发出类似 的查询,则 response 使用元素,而不是元素。battleSELECT+Id+battle__botID__c+FROM+AccountbotId__cbattle_botId__c

当出现以下情况时,该字段将被忽略 检索描述信息,避免命名空间前缀之间的歧义 和同名的客户字段。defaultNamespace

压缩标头

使用压缩标头压缩 REST API 请求或响应。压缩减少 请求所需的带宽,尽管它需要客户端的更多处理能力。 在大多数情况下,这种权衡有利于应用程序的整体性能。

REST API 支持 HTTP 1.1 定义的 gzip 和 deflate 压缩算法 规范。如果您不确定使用哪一个,gzip 比 deflate 更常见。

提示

为了获得更好的性能,我们建议客户端接受并支持压缩 由 HTTP 1.1 规范定义。

请求压缩

包括 or 标头以压缩请求。REST API 在处理之前解压缩任何请求。Content-Encoding: gzipContent-Encoding: deflate

此示例请求使用 gzip 压缩。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/ -H "Authorization: Bearer access-token" -H "Content-Type: application/json" -H "Content-Encoding: gzip" —data-binary @new-account.json -X POST

响应压缩

仅当请求包含 or 标头时,Salesforce 才会压缩响应。即使有 指定了 Accept-Encoding,但它通常会这样做。如果压缩,则响应包含 带有压缩算法的 Content-Encoding 标头,以便客户端知道解压缩 它。Accept-Encoding: gzipAccept-Encoding: deflate

此示例请求请求压缩响应。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/0015e000009sS0DAAU -H "Authorization: Bearer access-token" -H "Content-Type: application/json" -H "Accept-Encoding: gzip" -X GET

条件请求标头

在访问资源之前,使用条件请求标头来验证资源。由 在标头中设置一个前提条件,确保只有在 满足前提条件。此功能可帮助您防止错误并拒绝过时的请求 更新 Salesforce 数据时。您可以使用条件实现各种技术 请求标头,例如响应缓存。

条件请求标头提供两种类型的验证:强验证和弱验证。 强验证检查前提条件是否与 Salesforce 中的资源完全匹配。 强验证标头包括 和 ,它们使用实体标记 (ETag) 来比较 Salesforce 中记录的前提条件。If-MatchIf-None-Match

弱验证会根据 Salesforce 中的资源检查前提条件,但事实并非如此 保证两者相同。弱验证标头包括 或 ,它将前提条件与 Salesforce 中的记录。If-Modified-SinceIf-Unmodified-SinceREST API 条件标头遵循 HTTP 1.1 规范,但存在以下例外情况。

  • 如果为 、 或 PATCH 或 POST 请求包含无效的标头值,则返回状态代码。If-MatchIf-None-MatchIf-Unmodified-Since400 Bad Request
  • 不支持标头。If-Range
  • 不支持 DELETE 请求

ETag (英语)

标头是返回的响应标头 访问 sObject Rows 资源时。它是后续请求中 和 请求标头使用的内容的哈希值,用于确定内容是否 已更改。ETagIf-MatchIf-None-Match

sObject 行(仅限客户记录)资源支持此标头。

此示例显示了 REST API 返回的。ETag

ETag: "U5iWijwWbQD18jeiXwsqxeGpZQk=-gzip"

您可以在 www.w1.org/Protocols/rfc1/rfc3-sec2616.html#sec2616.14 中找到标头的 HTTP 14.19 规范。ETag

如果匹配

标头是 sObject 的请求标头 包含 ETag 列表的行。如果请求的记录的 ETag 匹配 在标头中指定为前提条件的 ETag,则处理请求。否则,一个 412 返回前提条件失败状态代码,并且不处理请求。If-Match

此标头支持 sObject 行(仅限客户记录)资源。

在此示例中,标头包含在 请求。If-Match

If-Match: "Jbjuzw7dbhaEG3fd90kJbx6A0ow=-gzip", "U5iWijwWbQD18jeiXwsqxeGpZQk=-gzip"

您可以在 www.w1.org/Protocols/rfc1/rfc3-sec2616.html#sec2616.14 中找到标头的 HTTP 14.24 规范。If-Match

如果-无匹配

标头是 sObject 行,与 相反。如果 您请求的记录的 ETag 与标头中指定的 ETag 匹配,即 请求未得到处理。为 GET 或 HEAD 返回 304 未修改状态代码 请求,并且 PATCH 请求返回 412 前提条件失败状态代码。If-None-MatchIf-Match

此标头支持 sObject 行(仅限客户记录)资源。

在此示例中,包含一个标头 有请求。If-None-Match

If-None-Match: "Jbjuzw7dbhaEG3fd90kJbx6A0ow=-gzip", "U5iWijwWbQD18jeiXwsqxeGpZQk=-gzip"

您可以在 www.w1.org/Protocols/rfc1/rfc3-sec2616.html#sec2616.14 中找到标头的 HTTP 14.26 规范。If-None-Match

如果修改后

标头是基于时间的请求 页眉。仅当数据自日期和时间以来发生更改时,才会处理请求 在标头中指定。否则,将返回 304 Not Modified 状态代码,并且 请求未得到处理。If-Modified-Since

此标头支持 sObject Rows、sObject 描述、描述全局和可调用 操作资源。

在此示例中,标头是 包含在请求中。If-Modified-Since

If-Modified-Since: Tue, 10 Aug 2015 00:00:00 GMT

您可以在 www.w1.org/Protocols/rfc1/rfc3-sec2616.html#sec2616.14 中找到标头的 HTTP 14.25 规范。If-Modified-Since

如果未修改,则自

标头是请求标头 这是 的反面。如果你做一个 request 并包含 If-Unmodified-Since 标头,则 REST API 仅在以下情况下处理请求 自指定日期以来,数据未发生更改。否则,412 前提条件将失败 返回状态代码,并且不处理请求。If-Unmodified-SinceIf-Modified-Since

此标头支持 sObject Rows、sObject 描述、描述全局和可调用 操作资源。

在此示例中,标头为 包含在请求中。If-Unmodified-Since

If-Unmodified-Since: Tue, 10 Aug 2015 00:00:00 GMT

您可以在 www.w1.org/Protocols/rfc1/rfc3-sec2616.html#sec2616.14 中找到标头的 HTTP 14.28 规范。If-Unmodified-Since

重复的规则标头

配置重复规则的选项。Salesforce 使用 复制规则,用于查看正在创建、更新或更新插入的记录是否为重复记录 现有记录。重复规则是重复管理的一部分。

此标头在 API 版本 52.0 及更高版本中可用。

标头字段名称和值

所有字段的默认值均为 。false字段名称allowSave字段值

  • true– 允许用户确认警报 并保存重复的记录。如果为操作启用了警报,则适用。
  • false– 不允许用户确认 警报或保存重复的记录。如果为操作启用了警报,则适用。

字段名称includeRecordDetails字段值

  • true– 返回重复项中的所有字段 记录。
  • false– 返回重复的记录 ID,但不返回 字段。

字段名称runAsCurrentUser字段值

  • true– 运行重复规则时,使用 当前用户的共享规则。
  • false– 运行重复规则时,使用 系统共享规则,而不是当前用户的共享规则。

允许用户确认警报并保存重复记录。指示 将返回重复字段的记录,并强制执行当前用户的共享规则。 现在,在创建记录时应用这些重复的管理配置选项。 更新和更新插入。

Sforce-Duplicate-Rule-Header: allowSave=true, includeRecordDetails=true, runAsCurrentUser=true

限制信息标题

在对 REST API 的每个请求中都会返回此响应标头(对版本 URI 的调用除外,这些调用不计入组织的限制)。您可以使用这些信息来监控 API 限制。/

标头字段名称和值

字段名称Sforce-Limit-Info字段值

  • api-usage– 指定进行调用的组织的每日 API 使用情况。第一个数字是数字 使用的 API 调用,第二个数字是组织的 API 限制。

标头中返回的值表示标准 REST API 限制和用法。 除非使用 Salesforce Functions 进行调用。使用 Salesforce 拨打的电话 函数从特定于函数的分配中获取。例Sforce-Limit-Info: api-usage=10018/100000

包版本标头

指定 客户。包版本是标识组件和行为集的数字 包含在包中。 此标头还可用于指定包版本 调用 Apex REST Web 服务时。

Package Version 标头可与以下资源一起使用:Describe Global、sObject Describe、 sObject 基本信息、sObject 行、 按外部 ID 划分的 sObject 布局、Query、QueryAll、Search 和 sObject 行。

标头字段名称和值

字段名称和值x-sfdc-packageversion-[namespace]: xx.x,其中 是托管包的唯一命名空间,是包版本。[namespace]xx.xx-sfdc-packageversion-clientPackage: 1.0

查询选项标头

指定查询中使用的选项,例如查询结果批处理 大小。将此请求标头与查询一起使用 资源。

标头字段名称和值

字段名称Sforce-Query-Options字段值

  • batchSize– 指定 为查询请求返回的记录数。子对象计入 批大小的记录。例如,在关系查询中,多个子项 每个返回的父行返回对象。默认值为 2,000; 最小值为 200,最大值为 2,000。不能保证请求的 批处理大小是实际的批处理大小。根据需要进行更改以最大化 性能。

Sforce-Query-Options: batchSize=1000

警告标头

如果存在警告,例如使用已弃用的 API 版本,则返回此标头。

标头字段名称和值

字段名称Warning字段值warningCode warningMessage有关已弃用的 API 版本的警告,请 .warningCode299

Warning: 299 - "This API is deprecated and will be removed by Summer '22. Please see https://help.salesforce.com/articleView?id=000351312 for details."

使用 cURL 发送 REST 请求

本指南中的示例使用 cURL 工具发送 HTTP 请求,这些请求访问 在 Salesforce 中创建和操作资源。如果您使用其他工具发送 requests,您可以使用 cURL 示例中的相同元素来发送请求。

cURL 预装在许多 Linux 和 macOS 系统上。Windows 用户可以下载 版本为 curl.haxx.se/。在 Windows 上使用 HTTPS 时,请确保您的系统满足 SSL 的 cURL 要求。

注意

cURL 是一个开源工具,不受 Salesforce的。

附加请求正文

许多示例包括请求正文 – 包含 请求。使用 cURL 时,请将这些文件保存到本地系统并附加它们 使用 —data-binary 或 -d 选项添加到请求中。

此示例附加 new-account.json 文件。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/sobjects/Account/ -H "Authorization Bearer access-token" -H “Content-Type: application/json” —data-binary @new-account.json -X POST

处理访问令牌中的感叹号

运行 cURL 示例时,由于以下原因,在 macOS 和 Linux 系统上可能会出现错误 OAuth 访问令牌中是否存在感叹号 (!) 特殊字符。 若要避免出现此错误,请转义感叹号或使用单个 引号。

若要对访问令牌中的感叹号进行转义,请在其前插入反斜杠 (\!) 当访问令牌括在双引号内时。例如,访问 此 cURL 命令中的令牌字符串具有感叹号 (!) 转义。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/ -H "Authorization: Bearer 00D50000000IehZ\!AQcAQH0dMHZfz972Szmpkb58urFRkgeBGsxL_QJWwYMfAbUeeG7c1E6LYUfiDUkWe6H34r1AAwOR8B8fLEz6n04NPGRrq0FM"

或者,可以将访问令牌括在单引号内。

curl https://MyDomainName.my.salesforce.com/services/data/v59.0/ -H 'Authorization: Bearer 00D50000000IehZ!AQcAQH0dMHZfz972Szmpkb58urFRkgeBGsxL_QJWwYMfAbUeeG7c1E6LYUfiDUkWe6H34r1AAwOR8B8fLEz6n04NPGRrq0FM'

配置 Salesforce CORS 允许列表

跨域资源共享 (CORS) 允许 Web 浏览器请求 来自其他来源的资源。例如,使用 CORS,https://www.example.com Web 应用程序的 JavaScript 可以从 https://www.salesforce.com 请求资源。要允许访问受支持的 Salesforce API,请执行以下操作: Apex REST 资源和 Web 浏览器中 JavaScript 代码的 Lightning Out,添加请求 源添加到您的 Salesforce CORS 允许列表。对于允许 Web 浏览器制作的 Lightning 应用程序 来自其组织的请求,CORS 允许列表会阻止对 Lightning 应用程序的请求,除非请求 来自已批准的 URL。

适用于:Salesforce Classic(并非在所有组织中都可用)和 闪电体验
适用于:DeveloperEnterprisePerformance 和 Unlimited Edition
在以下版本中启用 API 访问时可用:专业版
所需的用户权限
要创建、读取、更新和删除,请执行以下操作:修改所有数据

这些 Salesforce 技术支持 CORS。

  • Apex REST的
  • 批量 API
  • 批量 API 2.0
  • 连接 REST API
  • 闪电输出
  • REST API
  • CRM 分析 REST API
  • 用户界面 API

将提供请求代码的源添加到 CORS 允许列表。如果支持 CORS 的浏览器 向允许列表中的源发出请求,Salesforce 会在 HTTP 标头中返回源以及任何其他 CORS HTTP 标头。如果源未包含在允许列表中,Salesforce 将返回 HTTP 状态 代码 403。Access-Control-Allow-Origin

  1. 在“设置”的“快速查找”框中,输入 CORS,然后选择“CORS”。
  2. 选择新建
  3. 在 Origin URL Pattern 中输入资源。提示源 URL 模式并不总是与 浏览器的地址栏。
  4. 保存更改。

源 URL 模式必须包含 HTTPS 协议(除非您使用的是 localhost) 和域名。它还可以包括端口。支持通配符 (*),并且必须 在二级域名前面。例如,https://*.example.com 会将 example.com 的所有子域名添加到许可名单中。

源 URL 模式可以是 IP 地址。但是 IP 地址和解析为 同一地址不是同一来源,您必须将它们单独添加到 CORS 允许列表中 条目。

允许将 Google Chrome™ 和 Mozilla® Firefox® 浏览器扩展作为 API 中的资源 版本 53 (Winter ’22) 或更高版本。Chrome 扩展程序必须使用前缀和 32 个字符,不带数字或大写字母 字母,例如.Firefox 扩展必须使用 前缀和 8-4-4-4-12 小字母数字字符的格式,例如 。chrome-extension://chrome-extension://abdkkegmcbiomijcbdaodaflgehfffedmoz-extension://moz-extension://1234ab56-78c9-1df2-3efg-4567891hi1j2

在 CORS 预检测试中请求 REST 资源时,您可以获得成功的响应。 但收到对实际请求的不成功响应。当 资源在印前检查测试之后和发出请求之前被删除。它也可能发生 如果资源不存在。CORS 预检确认资源是否可以在 服务器,但不检查特定资源是否存在。 CORS 预检请求是 通常由浏览器自动发出。

注意

要使用 CORS 访问某些 OAuth 端点,需要满足其他要求。请参阅为 OAuth 端点启用 CORS。

有效的日期和日期时间格式

为 和 字段指定正确的格式。

dateTimedate

日期时间

使用 or 格式指定字段。yyyy-MM-ddTHH:mm:ss.SSS+/-HH:mmyyyy-MM-ddTHH:mm:ss.SSSZdateTime

  • yyyy 是四位数的年份
  • MM 是两位数的月份 (01-12)
  • dd 是两位数的日期 (01-31)
  • “T”是一个分隔符,表示一天中的时间紧随其后
  • HH 是两位数小时 (00-23)
  • mm 是两位数的分钟 (00-59)
  • ss 是两位数秒 (00-59)
  • SSS 是可选的三位数毫秒 (000-999)
  • +/-HH:mm 是祖鲁 (UTC) 时区偏移量
  • “Z”是参考 UTC 时区

将时区添加到 UTC 时, result 是该时区的日期和时间。例如,2002-10-10T12:00:00+05:00 是 2002-10-10T07:00:00Z,2002-10-10T00:00:00+05:00 是 2002-10-09T19:00:00Z。请参阅 W3C XML 架构第 2 部分:DateTime 数据类型。dateTime

日期

使用格式指定字段。yyyy-MM-dddate

注意

不支持指定偏移量。date

状态代码和错误响应

当发生错误或响应成功时,响应标头 包含 HTTP 代码,响应正文通常包含:

  • HTTP 响应代码
  • HTTP 响应代码附带的消息
  • 发生错误的字段或对象(如果响应返回信息 关于错误)
HTTP 响应代码描述
200“OK”成功代码,用于 GET、HEAD 和一些 PATCH 请求。
201“创建”成功代码, 用于 POST 请求和一些 PATCH 请求。
204“无内容”成功 代码,用于 DELETE 请求和一些 PATCH 请求。
300外部 ID 时返回的值 存在于多个记录中。响应正文包含列表 的匹配记录。
304请求内容未更改 自指定日期和时间起。提供日期和时间 在标题中。请参阅获取对象 Metatdata Changes 为例。If-Modified-Since
400请求无法理解, 通常是因为 JSON 或 XML 正文包含错误。
401使用的会话 ID 或 OAuth 令牌具有 已过期或无效。响应正文包含 和 。messageerrorCode
403该请求已被拒绝。验证 登录用户具有适当的权限。如果错误 代码已REQUEST_LIMIT_EXCEEDED,则超出了 API 请求限制 在您的组织中。
404请求的资源不能是 发现。检查 URI 是否存在错误,并验证是否没有 共享问题。
405中指定的方法 不允许对 URI。
409由于原因,请求无法完成 与资源的当前状态发生冲突。检查 API 版本与你的资源兼容 请求。
410请求的资源已停用或删除。删除或更新 对资源的任何引用。
412请求未执行,因为 或客户端在 请求标头不满意。例如,请求包括 一个 If-Unmodified-Since 标头,但数据 在指定日期之后被修改。
414URI 的长度超过 16,384 字节限制。
415请求中的实体位于 指定不支持的格式 方法。
420Salesforce Edge 没有可用于此的路由信息 请求主机。联系 Salesforce 客户支持。
428请求未执行,因为它不是有条件的。添加以下一项 条件请求标头,例如 、和 重新提交。If-Match
431URI 和 标头超过 16,384 字节的限制。
500闪电网络中发生错误 平台,因此无法完成请求。联系 Salesforce 客户支持。
502Salesforce Edge 无法与 Salesforce 实例。
503服务器无法处理 请求。通常,如果服务器已关闭,则会出现此问题 维护或超载。

不正确的 ID 示例在使用 JSON 或 XML 的请求中使用不存在的 ID (request_body.json 或 request_body.xml)

[
{
  "fields" : [ "Id" ],
  "message" : "Account ID: id value of incorrect type: 001900K0001pPuOAAU",
  "errorCode" : "MALFORMED_ID"
}
]

资源不存在请求不存在的资源,例如,您尝试创建一个 使用拼写错误的对象进行记录 名字

[
{
  "message" : "The requested resource does not exist",
  "errorCode" : "NOT_FOUND"
}
]

API 生命周期终止政策

查看哪些 REST API 版本受支持、不受支持或不可用。

Salesforce 承诺支持每个 API 版本至少 3 个 自首次发布之日起的年。为了提高质量和性能 API,有时不再支持超过 3 年的版本。

Salesforce 通知使用计划的 API 版本的客户 为 折旧 至少 1 年后,对版本的支持将结束。

Salesforce API 版本版本支持状态版本停用信息
版本 31.0 至 59.0支持。
版本 21.0 至 30.0截至 22 年夏季,这些版本已被弃用,并且没有 Salesforce 支持的时间更长。从 25 年夏季开始,这些 版本将停用且不可用。Salesforce Platform API 版本 21.0 到 30.0 停用
版本 7.0 至 20.0自 22 年夏季起,这些版本已停用,并且 不能利用的。Salesforce Platform API 版本 7.0 到 20.0 停用

如果你 请求任何资源或使用已停用的 API 版本 REST API 中的操作 返回错误代码。410:GONE

识别 从旧的或不受支持的 API 版本发出的请求,请使用 API 总使用量事件类型。

SOQL 生成器

内容

  • 概述
  • 使用 SOQL Builder
  • 生成查询
  • 在 SOQL Builder 和文本编辑器中查看查询
  • 保存查询结果
  • 在 SOQL Builder 和文本编辑器之间切换

概述

SOQL Builder 作为 Salesforce 扩展包的一部分提供。借助 SOQL Builder,任何人都可以直观地构建、运行和探索查询结果,从而消除构建 SOQL 查询时的猜测。在可视化编辑器中使用单击生成查询,然后使用文本编辑器保存和扩展查询。您可以立即查看查询结果,然后将结果保存到 或 文件中。.csv.json

使用 SOQL Builder

使用 SOQL Builder 构建简单的查询语句,包括:

  • 仅用于一个 sObject 类型的 FROM 子句
  • SELECT 子句用于从选定的 sObject 中选取字段,或 COUNT() 用于执行结果聚合
  • 用于筛选数据的 WHERE 子句
  • 支持 ASC、DESC、NULLS FIRST 和 NULLS LAST 的 ORDER BY 子句
  • LIMIT 子句若要更深入地了解 SOQL 语法或在文本编辑器中构建更复杂的查询,请参阅 SOQL 和 SOSL 参考指南。

注意:

  • 您可以在 SOQL Builder 中运行复杂的查询,即使您看到“不支持的语法”信息性消息。
  • WHERE 子句可能非常复杂。SOQL Builder 支持简单的 WHERE 表达式。可以使用 AND 或 OR 组合条件,但不能同时使用两者。

建立

  • 确保您已通过默认组织的身份验证。如果对默认组织的身份验证已过期,则无法使用 SOQL Builder。
  • 在 VS Code 中,打开一个 Salesforce DX 项目。
  • 授权要查询其对象的组织。

在 SOQL Builder 中打开现有 SOQL 文件

DX 项目在目录中有一个示例文件。但是,您可以在任何目录中创建和存储文件。accounts.soql<project-folder>/scripts/soql.soql

  1. (如有必要)创建文件。.soql
  2. 单击该文件。.soql
  3. 单击“在 SOQL Builder 和文本编辑器之间切换”图标。

还可以在 SOQL Builder 中从 VS Code 菜单打开文件。右键单击文件名,选择“打开方式”,然后选择“SOQL Builder”。.soql

启动 SOQL Builder 并创建查询

  1. 在命令面板中,运行 SFDX: Create Query in SOQL Builder
  2. 单击“文件”>“保存”以保存查询。请确保保留文件扩展名。.soql

生成查询

在生成查询时,请观察 SOQL Builder 在同时更新文件时显示查询语法。生成完语句后,单击“运行查询”以查看输出。.soql

您可以从下拉列表中选择对象和字段,也可以键入以缩小列表结果范围。您只能选择一次对象或字段。如果已选择某个值,则该值不会显示在下拉列表或搜索结果中。

使用 LIKE 运算符进行筛选

筛选结果时,可以通过使用 LIKE 运算符(使用通配符来匹配部分文本字符串)来进一步缩小这些结果的范围并确定这些结果的目标。此查询仅返回以 开头的姓氏。mc

SELECT AccountId, FirstName, lastname
FROM Contact
WHERE lastname LIKE 'mc%'

您可以使用 LIKE 构建自己的过滤器,也可以选择这些预构建选项之一。

  • 开头为
  • 结尾为
  • 包含

查看 COUNT 结果

由于 COUNT() 是一个聚合函数,因此将删除所有其他选定字段。如果您不打算选择 COUNT,则可以从主菜单中撤消该操作。您可以通过添加筛选器(WHERE 子句)来进一步优化结果。运行查询时,返回的行数与记录总数相对应。在此示例中,COUNT 为 3。

局限性:

  • SOQL Builder 目前支持以交互方式构建简单查询。但是,您仍然可以打开更复杂的文件并从 SOQL Builder 中运行查询,但必须使用文本编辑器来更新它。.soql
  • 选择字段时,一次只能选择(单击)一个字段。
  • 每次单击“运行查询”时,都会显示“SOQL 查询结果”选项卡。无法将结果与特定查询语句相关联。SOQL Builder 编辑器会反映您最近的更新。
  • 在单个 SOQL 查询中最多可以检索 2000 条记录。

下一个:

  • 保存(文本)文件以避免丢失更新。.soql
  • 将查询结果输出保存到 or 文件。.csv.json

在 SOQL Builder 和文本编辑器中查看查询

拆分视图以在 SOQL Builder 和文本编辑器中查看查询。

  1. 右键单击该选项卡,然后选择其中一个“拆分”选项。
  2. 右键单击新选项卡,选择“重新打开编辑器”,然后选择“文本编辑器”。

保存查询结果

单击其中一个“保存”图标,将查询结果另存为所选位置的 或 文件。若要避免将这些文件部署到组织或将其添加到源代码管理中,请记住在文件中包含已保存文件的任何路径。.csv.json.gitignore

在 SOQL Builder 和文本编辑器之间切换

您可以在 SOQL Builder 和文本编辑器中查看 SOQL 语句之间轻松切换。

编写 SOQL 查询

内容

  • SOQL文件
  • 代码完成
  • 使用 SOQL Builder 生成和运行查询
  • 执行 SOQL 文本
  • 内联执行 SOQL

可以使用 SOQL 查询代码段查看 SOQL 查询的代码完成建议。

要了解如何使用 Salesforce 对象查询语言 (SOQL),请参阅 SOQL 和 SOSL 参考。

注意:SOQL 语言支持目前处于测试阶段。如果发现任何 bug 或有反馈,请打开 GitHub 问题。有关更多信息,请参阅我们的路线图。

SOQL文件

VS Code 支持在 Apex 文件和独立文件中编写 SOQL。写入文件时,我们建议将文件位于 your 中注册的目录之外,因为这不是要部署到组织的文件。该文件的目的是提供一种在将 SOQL 查询导入 Apex 代码之前生成和测试 SOQL 查询的方法。默认情况下,新项目具有一个包含示例文件的文件夹。您可以使用此文件夹保存所有 SOQL 查询。.soql.soqlsfdx-project.json.soqlscripts/soqlaccounts.soql

代码完成

VS Code 支持嵌入在 Apex 文件和文件中的 SOQL 的代码完成。若要使用此功能,必须刷新 SObject 定义,以便 SOQL 语言服务器可以提供代码完成建议。从命令面板运行。.soqlSFDX: Refresh SObject Definitions

  • 若要在建议之间导航,请使用箭头键。
  • 要根据建议自动完成,请按 Enter 键。

使用 SOQL Builder 生成和运行查询

使用 SOQL Builder 生成并运行 SOQL 查询。请参阅 SOQL Builder。

执行 SOQL 文本

要执行 SOQL,您只需选择文本并运行命令 。您可以选择针对 REST 或工具 API 执行查询。SFDX: Execute SOQL Query with Currently Selected Text

执行查询后,结果将显示在输出窗格中。

内联执行 SOQL

要编写查询并执行它而不将其保存到文件中,您可以使用该命令并直接在命令栏中输入 SOQL。结果将显示在输出窗格中。SFDX: Execute SOQL Query...

SOQL 任务

内容

  • 使用 SOQL 查询编辑器创建查询以列出具有纽约州地址的帐户
  • 资源

这是使用 SOQL 的示例任务存储库,您可以使用 Salesforce 扩展在 Code Builder 或 VS Code 中完成这些任务。我们将继续添加到此列表中,因此请确保您经常访问此主题。

使用 SOQL 查询编辑器创建查询以列出具有纽约州地址的帐户

  1. 在命令面板中,运行 SFDX: Create Query in SOQL Builder 以打开 SOQL Query Builder。
  2. 单击“文件”>“保存”以保存查询。请确保保留文件扩展名。.soql
  3. 单击“在 SOQL 生成器和文本编辑器之间切换”图标 () 以重新打开 SOQL 查询生成器。
  4. 在字段中,搜索对象,然后选择该对象。FromAccount
  5. 在 中,选择 、 和 。FieldsNameBillingStateBillingCountry
  6. 在字段中,选择 ,然后设置:FilterANDBillingCountry = USA AND BillingState = NY
  7. 单击“运行查询”。

此时将弹出“查询结果”选项卡。然后,您可以将结果保存为 或 格式。csvjson

资源

指南:

登山口:

LWC概述

适用于 VS Code 的 Lightning Web 组件扩展利用编辑器的内置代码导航和语言功能,以便您可以高效地构建 Lightning Web 组件。

利用以下适用于 VS Code 的 Lightning Web 组件扩展功能:

  • 代码补全
  • Linting
  • 查看有关悬停的文档
  • 代码导航

代码补全

Lightning Web 组件扩展基于 VS Code 的 HTML 和 JavaScript 语言功能构建,包括语法突出显示、括号匹配以及使用 IntelliSense 完成特定于语言的代码。该扩展为以下 Lightning Web 组件资源提供代码完成。

代码片段

代码片段可用于基架类和接口定义,以及各种语句(如循环和条件语句等)。在处理 LWC HTML 文件时,请从命令面板运行以查看可用代码段。您还可以通过键入组件名称(例如,)。Insert Snippetaccordion

以下存储库中提供了用于 Salesforce 开发的开箱即用代码段:

  • Apex 代码片段
  • 用于 LWC 开发的 HTML 代码片段
  • 用于 LWC 开发的 JavaScript 代码片段

@salesforce作用域模块

Lightning 组件通过作用域模块访问 Salesforce 值。Lightning Web 组件扩展为以下作用域模块提供代码完成:

  • @salesforce/resourceUrl
  • @salesforce/contentAssetUrl
  • @salesforce/apex
  • @salesforce/user

要了解有关模块的更多信息,请参阅《Lightning Web 组件开发人员指南》中的@salesforce模块了解更多信息。@salesforce

在此示例中,VS Code 显示完成语句时可供选择的可能静态资源名称。import

下面是 的代码完成。@salesforce/schema

下面是 Apex 控制器的代码完成示例。

闪电 API

VS Code 还完善了 Lightning API 资源,例如 和 .有关详细信息,请参阅《照明 Web 组件开发人员指南》中的 lightning/ui*Api Wire和功能。lightning/uiRecordApilightning/uiObjectInfoApi

Lightning Web 组件语法

VS Code 完善了 Lightning Web Components 框架的反应式属性和连线服务。有关详细信息,请参阅《Lightning Web 组件开发人员指南》中的反应性属性和使用线路服务获取数据。

下面是在装饰器中包含 Apex 函数的代码完成示例。getContactList@wire

HTML 属性和标记中的命名空间补全

还为 和 命名空间中组件的 HTML 标记和属性提供了代码完成功能。在这里,VS Code 使用 ,完成其属性。lightningcc-view-sourcesource

查看有关悬停的文档

当您将鼠标悬停在命名空间中的标准 Lightning Web 组件上时,VS Code 会显示文档,如果您为自定义组件提供文档,则会显示命名空间。以下是显示的文档。该下拉列表还提供了一个链接,用于在组件库中查看组件。lightningclightning-layout

Linting

Linting 会在您编辑时提供有关格式错误或外观可疑的代码的错误。 VS Code 强制执行 Salesforce 的 ESLint 规则。要激活 ESLint,请从命令行安装它。有关说明,请参阅 Lightning Web 组件 ESLint 插件和 Lightning Web 组件 ESLint 配置存储库。

在此示例中,当将鼠标悬停在 上时,linter 会报告您不能命名以“on”开头的 API 属性。onpress

窥视问题和快速修复

VS Code 具有一系列操作来快速解决问题和重构代码,包括快速修复和速览问题。若要了解详细信息,请参阅 VS Code 文档中的重构。

单击错误消息上的“查看问题”将突出显示 linter 发现错误的行。如果邮件显示存在多个错误,请单击邮件右上角的向下箭头以查看其他错误。

单击“快速修复”可提供用于禁用行或文件中有效 API 名称警告的选项,以及指向文档的链接。您可以通过单击旁边的黄色灯泡图标来查看这些相同的选项。@api onpress;

错误和警告

悬停时显示文件和编译器错误。在这里,当鼠标悬停在上面时,错误消息说必须声明它。@track

代码导航

VS Code 提供了预览或跳转到代码中定义的快捷方式,而不会丢失当前正在处理的代码。有关详细信息,请参阅 VS Code 文档的“代码导航”部分。

若要预览定义,请按住 Ctrl(Windows 或 Linux)或 Command (macOS),然后将鼠标悬停在要查看其定义的项目上。此示例显示命名空间组件源的预览。c

若要查看定义,请右键单击该项并选择“速览定义”,或按 Alt+F12

若要跳转到定义的位置,请右键单击该项,然后选择“转到定义”,或按 F12

支持 js-meta.xml

VS Code 通过集成红帽对 js-meta.xml 的 XML VSCode 扩展来提供 IntelliSense 支持。它支持扩展开箱即用的功能,例如但不限于自动建议、语法错误报告、重命名支持、自动代码生成等。

快速启动 LWC 开发

概述

创建一个名为 LWC 的组件,用于在应用中显示联系人姓名和电话号码。您将从名为 的 Apex 类中获取要显示的联系信息。contactListContactController

在开始之前,请安装 Salesforce Extensions for Desktop 或 Set Up Code Builder

添加查询联系人的 Apex 类

  1. 在 VS Code 中,运行命令 SFDX:从命令面板创建项目以创建 Salesforce DX 项目(如果没有)。
  2. 登录到要添加 LWC 的组织。
  3. 从命令面板运行 SFDX: Refresh SObject Definitions 命令,以获取 SObjects 相关代码的完成建议。
  4. 从命令面板中,运行 SFDX: Create Apex Class 并创建一个名为 .ContactController

接下来,让我们添加一个调用到此类的方法。使此方法既是公共的,又是静态的。因为它是一个静态方法,所以你不需要创建类的实例来访问该方法,你只需使用类的名称,后跟点 () 和方法的名称。此方法查询联系人对象上的一组字段。将此代码粘贴到:getContacts.ContactController.cls

public with sharing class ContactController {
    @AuraEnabled(cacheable=true)
    public static List<Contact> getContacts() {
        return [
SELECT
Id,
Name,
Email,
Phone
FROM Contact
WITH SECURITY_ENFORCED
LIMIT 10
];
    }
}

接下来,添加显示查询字段的 LWC 组件。

创建显示联系人信息的 LWC 组件

  1. 从命令面板中,运行 SFDX:创建 Lightning Web 组件,并创建在默认位置调用的组件。contactList
  2. 在文件中,剪切并粘贴以下代码,然后保存文件:contactList.html
<template>
    <lightning-card title="Contact List">
        <template if:true={contacts.data}>
            <template for:each={contacts.data} for:item="contact">
                <div class="slds-var-p-horizontal_medium" key={contact.Id}>
                    <p>{contact.Name}, {contact.Phone}</p>
                </div>
            </template>
        </template>
        <template if:true={contacts.error}>
            <p>{contacts.error}</p>
        </template>
    </lightning-card>
</template>

  1. 在文件中,剪切并粘贴以下代码并保存:contactList.js
import { LightningElement, wire } from 'lwc';
import getContacts from '@salesforce/apex/ContactController.getContacts';

export default class ContactList extends LightningElement {
    @wire(getContacts) contacts;
}
  1. 将以下代码剪切并粘贴到文件中并保存:contactList.js-meta.xml
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
 	<apiVersion>57.0</apiVersion>
 	<isExposed>true</isExposed>
 	<targets>

   		<target>lightning__HomePage</target>
 	</targets>
</LightningComponentBundle>

  1. 右键单击“SFDX:将源部署到组织”下的默认文件夹,然后运行“将源部署到组织”。force-app/main

在 Lightning Experience 中将新组件添加到您的应用程序

  1. 在 Visual Studio Code 中,打开命令面板并运行 SFDX: Open Default Org。 这将在单独的浏览器中打开您的组织。
  2. 应用启动器中,找到并选择销售
  3. 点击设置齿轮,然后选择编辑页面
  4. 将 Lightning Web 组件从“Lightning 组件”列表的“自定义”区域拖动到“页面画布”的顶部。contactList
  5. 点击保存
  6. 单击“激活”。
  7. 单击 Assign as Org Default(分配为组织默认值)。
  8. 点击保存
  9. 再次单击“保存”,然后单击“后退”箭头返回页面。
  10. 刷新页面以查看新组件。

测试 Lightning Web 组件

内容

  • 探索您的 LWC 测试
  • 为 Jest 测试添加调试配置
  • 在文件内运行、调试或观看 Jest 测试

安装 sfdx-lwc-jest,以便准备好 Lightning Web 组件的 Jest 测试运行程序。

探索您的 LWC 测试

LWC 测试边栏提供了一个中心位置,供你对你编写的代码运行测试。可以运行一个测试用例、一个文件中的测试用例或所有测试。您还可以查看上次测试运行的结果,并直接从测试导航到相应的代码行。要访问测试侧边栏,请单击视图栏中的烧杯图标(悬停文本:测试)。如果未看到此图标,请确保在 VS Code 中打开的项目在其根目录中包含 sfdx-project.json 文件。

若要运行选定的测试,请将鼠标悬停在测试用例或文件的名称上,以显示 LWC 测试视图中的播放图标。单击播放图标(悬停文本:SFDX:运行 Lightning Web 组件测试用例,SFDX:运行 Lightning Web 组件测试文件)以运行测试用例或文件中的所有测试用例。要运行视图中的所有测试,请单击 LWC 测试视图顶部较大的播放图标(悬停文本:SFDX:运行所有 Lightning Web 组件测试)。

测试结果记录如下:绿色表示通过测试,红色表示测试失败,橙色表示跳过测试。

若要跳转到测试文件或测试用例,请点按边栏中的测试名称。

要清除测试结果,请单击边栏顶部的刷新图标(悬停文本:SFDX:刷新 Lightning Web 组件测试资源管理器)。

为 Jest 测试添加调试配置

添加 Jest Tests 调试配置以自动更新 。作为先决条件,必须安装 node.js 和 npm。launch.json

注意:如果您从空项目开始,请先安装 sfdx-lwc-jest,然后使用所述步骤添加测试配置。

要快速将 Jest Tests 配置添加到您的标准项目中:

  1. 转到活动栏中的“运行和调试”。
  2. 从下拉列表中选择“添加配置”。
  3. 选择 Debug: LWC Jest Tests
  4. 保存更新后的 .launch.json
  5. 从“运行”视图的“配置”下拉列表中选择“调试:LWC Jest 测试”配置,然后开始调试。

在文件内运行、调试或观看 Jest 测试

你可以在文件中的上下文操作中运行或调试 Jest 单元测试,也可以通过单击编辑器窗口右上角菜单栏中的按钮来运行或调试 Jest 单元测试。在“终端”面板中查看测试结果。

运行 Jest 测试

要运行单个 Jest 测试用例,请导航到该文件,然后单击 Jest 测试用例定义上方的 Run Test.test.js

要运行 Jest 测试文件中的所有测试用例,请单击编辑器窗口右上角菜单栏上的播放图标。

调试 Jest 测试

要调试单个 Jest 测试用例,请导航到该文件,然后单击 Jest 测试用例定义上方的 Debug Test.test.js

要调试 Jest 测试文件中的所有测试用例,请单击编辑器窗口右上角菜单栏上的调试图标。

将启动 VS Code 的内置调试器,以便在 VS Code 中调试测试。您可以设置断点,通过调试操作控制调试会话,或使用调试控制台来计算表达式。

观看 Jest 测试

要观看 Jest 测试文件,请单击编辑器窗口右上角菜单栏上的眼睛图标。切换图标以停止观看。在观看 Jest 测试文件时,如果您编辑 Jest 测试文件或 Jest 测试文件正在测试的 LWC JavaScript 文件,则测试文件将重新运行。

Linting

内容

  • 先决条件
  • 安装
  • 配置 Linting 规则
  • 添加其他脚本
  • 另见

Linting 在编辑时提供有关格式错误的代码的错误。 VS Code 强制执行 Salesforce 的 ESLint 规则。

先决条件

使用 SSL 支持构建的 Node.js 的活动 LTS 版本。

安装

对于新项目

如果使用该命令创建 SFDX 项目,则您的项目将包含一个已包含 ESLint 插件的文件。sfdx force:project:createpackage.json

  1. 要安装 ESLint 插件和其他依赖项,请在项目目录中运行。npm install
  2. 配置 ESLint 插件规则(可选)。
  3. 若要运行 linting,项目中必须有组件。要开始 linting,请运行 。npm run lint:lwc

对于现有项目

  1. 验证您的项目是否具有这些配置。如果您没有配置,请运行 .package.jsonpackage.jsonnpm install eslint @salesforce/eslint-config-lwc --save-dev "scripts": { "lint": "npm run lint:lwc", "lint:lwc": "eslint force-app/main/default/lwc" } "devDependencies" { "@salesforce/eslint-config-lwc": "3.4.0", "eslint": "^5.16.0" }
  2. 如果项目没有 package.json 文件,请复制该文件并将其添加到项目目录。
  3. 验证您的项目是否具有此 .eslintignore 文件。此文件指定哪些文件不进行 lint 检查。如果您的项目没有它,请将其添加到您的项目目录中。
  4. 验证您的项目是否具有此 .eslintrc.json 文件。此文件指定 linting 配置级别。如果您的项目没有它,请将其添加到您的项目目录中。
  5. 要安装 ESLint 插件和其他依赖项,请在项目目录上运行。npm install
  6. 若要运行 linting,项目中必须有组件。要开始 linting,请运行 。npm run lint:lwc

配置 Linting 规则

ESLint 包括三个配置级别。缺省级别为 。@salesforce/eslint-config-lwc/recommended

要更改配置级别,请在.eslintrc.json

{
 "extends": ["@salesforce/eslint-config-lwc/recommended"]
}
  • @salesforce/eslint-config-lwc/base此配置可防止 Lightning Web 组件的常见陷阱,并强制实施其他 Salesforce 平台限制。
  • @salesforce/eslint-config-lwc/recommended此配置可防止常见的 Javascript 陷阱,并强制执行所有最佳实践。
  • @salesforce/eslint-config-lwc/extended此配置限制了某些 Javascript 语言功能的使用,这些功能在较旧的浏览器(如 IE11)中有时速度较慢。为了在较旧的浏览器上支持新的 Javascript 语法和语言功能,Lightning Web 组件编译器转换了 Lightning Web 组件模块。

有关 linting 规则和单独使用它们的更多详细信息,请参阅 ESLint 插件 Github 存储库。

添加其他脚本

该部分包括一些已预先配置为运行 ESLint 的脚本。若要添加自己的,请参阅 npm 文档。"scripts"package.json

使用 Salesforce 扩展进行 Apex 开发

内容

  • 概述
  • 其他资源

概述

Apex 是一种强类型、面向对象的编程语言,结合对 Salesforce API 的调用,允许 Salesforce 开发人员添加业务逻辑来操作其组织中的数据。 Salesforce 扩展包附带了大量工具,用于编写、测试、重构和调试 Apex 代码。应用内帮助使低代码开发人员和管理员能够轻松编写、测试和调试 Apex 代码,例如,从他们使用 Flow Builder 等工具创建的事件激活的触发器。

您可以使用 Salesforce Extensions 执行以下操作:

  • 快速创建 Apex 类、测试类和触发器。
  • 在各种类型的调试器之间进行选择,以满足调试要求。
  • 轻松执行 Anonymous Apex。

其他资源

  • Apex 开发人员指南
  • Salesforce DX 开发人员指南
  • 快速入门:使用 Salesforce 扩展进行 Apex 开发

登山口:

  • Apex 触发器
  • 使用 Apex Replay Debugger 查找并修复 Bug

快速入门 Apex 开发

概述

完成此快速入门,即可创建、测试和调试使用 Apex 类创建的工作流,并触发 Apex 触发器。

您将创建一个名为 的自定义对象,并向该自定义对象添加一个名为的自定义字段。您将使用 Apex 更新和测试更新的 Price 字段,并了解如何使用 Salesforce 扩展使用 Apex Code。BookPrice

在开始之前,请安装 Salesforce Extensions for Desktop 或 Set Up Code Builder

创建自定义对象

  1. 登录到您的沙盒或开发人员组织。
  2. 转到“设置”>“对象管理器”>创建>自定义对象
  3. 输入标签。Book
  4. 输入复数标签。Books
  5. 点击保存。
  6. 在“书籍详细信息”页面的“自定义字段和关系”部分中,单击“新建”。
  7. 选择数据类型,然后单击下一步Number
  8. 输入字段标签。Price
  9. 在长度文本框中输入。16
  10. 在小数位文本框中输入,然后单击下一步2
  11. 单击“下一步”接受字段级安全性的默认值。
  12. 点击保存

添加 Apex 类

  1. 在 VS Code 中,使用组织选取器或命令面板连接到将自定义对象添加到的组织。
  2. 从命令面板运行 SFDX: Refresh SObject Definitions 命令,以获取 SObjects 相关代码的代码完成建议。
  3. 单击活动栏中的云图标以打开组织浏览器。
  4. 向下滚动到“自定义对象”并找到该对象。单击检索图标以运行 SFDX:从组织检索源Book_c
  5. 从命令面板中,运行 SFDX:Create Apex Class 并创建一个名为 .MyBooks
  6. 添加对此类调用的方法。applyDiscount

使此方法既是公共的,又是静态的。因为它是一个静态方法,所以你不需要创建类的实例来访问该方法,你只需使用类的名称,后跟一个点 (.) 和方法的名称。

此方法采用一个参数,即分配给变量 books 的记录列表。该方法循环访问书籍列表,并对当前书籍价格应用 10% 的折扣:

public with sharing class MyBooks {
    public MyBooks() {

    }
    public static void applyDiscount(Book__c[] books) {
        for (Book__c b : books){
           b.Price__c *= 0.9;
        }
     }
}

接下来,添加调用此方法的触发器。applyDiscount

添加 Apex 触发器

Apex 触发器是在从数据库插入、更新或删除特定类型的记录之前或之后执行的一段代码。每个触发器都使用一组上下文变量运行,这些变量提供对导致触发器触发的记录的访问。

  1. 在命令面板中,运行 SFDX: Create Apex Trigger 并创建一个名为 的新类。MyBooksTrigger
  2. 将默认模板更新为以下触发器定义:
trigger MyBooksTrigger on Book__c (before insert) {

   Book__c[] books = Trigger.new;

   MyBooks.applyDiscount(books);
}

我们现在有了更新所有插入的书籍价格所需的代码。接下来,让我们添加一个测试类并添加一个单元测试。单元测试是编写代码的重要组成部分,并且是必需的。除了确保代码的质量外,单元测试还使您能够满足部署或打包 Apex 的代码覆盖率要求。要为 Salesforce AppExchange 部署 Apex 或打包 Apex,单元测试必须覆盖至少 75% 的 Apex 代码,并且这些测试必须通过。

编写单元测试

现在添加一个具有一个测试方法的测试类。然后运行测试并验证代码覆盖率。测试方法练习并验证触发器和类中的代码。此外,它还使您能够达到触发器和类的 100% 代码覆盖率。 在我们的示例中,创建一个测试类,该类插入一个新的 book 对象,该对象会触发我们之前编写的 Apex 触发器。 要创建测试类,请执行以下操作:

  1. 在命令面板中,运行 SFDX:Create Apex Class 并创建一个名为 .MyBooksTestClass
  2. 将以下代码粘贴到文件中:MyBooksTestClass.cls
@isTest 
private class MyBooksTestClass {
    static testMethod void validateMyBooks() {
       Book__c b = new Book__c(Name='Behind the Cloud', Price__c=100);
       // Insert book
       insert b;    
       // Retrieve the new book
       Book b2 = [SELECT Price__c FROM Book__c WHERE Id =:b.Id];
      //Confirm that the price has been updated correctly
       System.assertEquals(90, b2.Price__c);
      }
}

注意:此测试类是使用注释定义的。我们建议以这种方式定义的类仅包含测试方法以及支持这些测试方法所需的任何方法。创建用于测试的单独类的一个优点是,使用 定义的类不计入组织 6 MB 的 Apex 代码限制。还可以将批注添加到单个方法中。有关更多信息,请参见 isTest 注释和执行调控器和限制。@isTest@isTest@isTest

  1. 若要运行编写的测试,必须将代码部署到组织。在文件中单击鼠标右键,然后运行 SFDX: Deploy This Source to Org 以部署代码。
  2. 单击文件中的“运行所有测试”以测试代码。MyBooksTestClass

Apex 语言服务器

内容

  • 与 Apex 语言服务器集成
  • Apex 语言服务器状态
  • 重置 Apex 索引
  • 另见

Apex 语言服务器是一种与 IDE 无关的方法,用于工具访问代码编辑功能,例如代码完成、转到定义、查找所有用法和重构。Apex 语言服务器是 Salesforce 扩展包的一部分。它为 Salesforce Extensions for VS Code 提供了一种强大的方法来实现其他 IDE 也可以访问的 Apex 分析器。

Apex 语言服务器是语言服务器协议 3.0 规范的实现。语言服务器协议允许工具(在本例中为 VS Code)与语言智能提供程序(服务器)进行通信。我们使用此通用规范构建了 Apex 语言服务器,使我们的工具合作伙伴能够提高其工具的智能性。

有关更多信息,请观看我们的 Dreamforce ’17 演示视频,通过语言服务器为所有 IDE 构建强大的工具。

与 Apex 语言服务器集成

如果您是希望与 Apex 语言服务器集成的开发人员,请使用 apex-jorje-lsp.jar 文件。

有关初始化 Apex 语言服务器并与之通信的示例,请参阅 languageServer.ts 文件。

Apex 语言服务器状态

将鼠标悬停在状态栏中可查看 Apex 语言服务器的当前状态。若要始终查看状态,请固定状态消息。Apex 语言服务器状态现在在状态栏中始终可见,直到取消固定。{}

重置 Apex 索引

若要清除 Apex 语言服务器的索引,请删除该目录并重新启动 VS Code。PROJECT_DIR/.sfdx/tools/<Salesforce Release>

另见

  • 语言服务器协议规范
  • 语言服务器协议 – Eclipse Newsletter 2017 年 5 月
  • VS Code 的语言服务器协议实现
  • Langserver.org – 有关其他语言服务器和客户端的信息,例如 Atom、Sublime、Vim 等

编写 Apex 代码的工具

内容

  • 代码补全
  • 代码片段
  • 自定义元数据模板
  • SObjects 的 Intellisense
  • 转到定义
  • 查找所有参考资料
  • 大纲视图
  • 语法错误
  • 快速修复
  • 匿名顶点

使用适用于 VS Code 的 Apex 扩展访问代码编辑功能,例如代码完成、转到定义、查看 Apex 类和触发器的大纲、重构以及查找代码中的语法错误。

代码补全

当您在 Apex 类或触发器中工作时,Apex 扩展会提供上下文相关的建议。键入时,自动完成将列出方法或变量等成员。自动完成列表还显示建议的文档。使用以下密钥:

  • Ctrl+空格键查看代码完成建议
  • 用于在建议之间导航的箭头键
  • 输入键以从建议中进行选择

如果要更改建议的预选方式,请参阅 IntelliSense – 建议选择。

代码片段

代码片段可用于基架类和接口定义,以及各种语句(如循环和条件语句等)。在 Apex 类或触发器中工作时,请从命令面板运行以查看可用代码片段。您还可以将这些代码片段作为代码完成建议进行查看。Insert Snippet

以下存储库中提供了用于 Salesforce 开发的开箱即用代码段:

  • Apex 代码片段
  • 用于 LWC 开发的 HTML 代码片段
  • 用于 LWC 开发的 JavaScript 代码片段

示例自定义代码段

片段的真正力量在于能够自定义片段供自己使用。按照以下步骤创建自定义 Apex 代码段,以便快速编写简单的 SOQL 查询:

  1. 从命令面板运行“代码段:配置用户代码段”命令。
  2. 选择打开文件。apex.json
  3. 将以下代码片段代码添加到文件中:"SOQL" : { "prefix": "soql", "body": [ "[SELECT ${1:field1, field2} FROM ${2:SobjectName} WHERE ${3:clause}];" ], "description": "Apex SOQL query" }
  4. 保存文件。
  5. 在 Apex 类文件中使用此代码段,方法是键入“soql”并选择将此代码段添加到代码中。
  6. 代码片段将添加到您的 Apex 文件中。[SELECT field1, field2 FROM SobjectName WHERE clause];

有关代码段的详细信息,请参阅 Visual Studio Code 中的代码段。

自定义元数据模板

除了 VS Code 中提供的通用代码片段功能外,还可以使用自定义模板为 Apex 类或触发器创建新的元数据。有关如何设置自定义模板的信息,请参阅自定义代码模板。下面是将模板用于 Apex 类的示例:

  1. 使用自定义代码编辑文件:DefaultApexClass.cls
//Copyright (c) <year><copyright holder>

public with sharing class <%= apiName %> {
      public <%= apiName %>(String prop) {
   this.prop = prop;
      }
  @AuraEnabled
    public static List<SObject> getRecords(){
      try {
          return [Select Id from Sobject];
      } catch (Exception e){
          throw new AuraHandledException(e.getMessage());
      }
    }
}
  1. 从命令面板运行 SFDX: Create Apex Class 命令。
  2. 输入文件名。ApexClass
  3. 接受默认目录位置。

确认该文件包含您的自定义代码。ApexClass.cls

SObjects 的 Intellisense

若要确保 Intellisense 功能正确提示完成建议,必须刷新 SObject 定义。从命令面板运行 SFDX: Refresh SObject Definitions 命令。

您现在可以预览、查看或转到以下定义:

  • 用户定义的 Apex
    • 类(来自扩展类的定义)
    • 构造 函数
    • 接口(来自实现类的定义)
    • 方法
    • 性能
    • 变量(局部变量和类变量)
  • 标准对象
    • 字段(标准字段和自定义字段)
    • 对象定义
  • 自定义对象
    • 领域
    • 对象定义

刷新 SObject 定义时,扩展使用默认组织生成 Apex 类。这些类表示当前用户有权访问的标准对象和自定义对象。我们建议您不要编辑这些具有代表性的 Apex 类,因为这些类是只读的。如果修改了这些建议,可能会影响自动完成建议。此外,刷新 SObject 定义时,更改也会丢失。

每当刷新 SObject 定义时,都会删除并重新生成具有代表性的 Apex 类。您可以通过更新对象和文件来修改 SObjects;或者通过在默认组织中以声明方式进行更改。修改 SObjects 后,请确保同步本地项目和默认组织。.object-meta.xml.field-meta.xml

首次启动 Salesforce CLI 集成扩展(它是 Salesforce 扩展包的一部分)并启用该设置时,如果您的项目不包含任何 Apex 类,则会自动执行 SFDX: Refresh SObject Definitions 命令。添加或编辑标准对象或自定义对象或其字段后,请确保运行此命令。salesforcedx-vscode-apex.enable-sobject-refresh-on-startup

转到定义

Apex 扩展为用户定义的 Apex 提供转到定义支持,例如类和方法、标准对象和自定义对象。

  • 要预览定义,请按住 Ctrl(Windows 或 Linux)或 Cmd (macOS),然后将鼠标悬停在要查看其定义的项目上。
  • 要查看定义,请右键单击该项目并选择“速览定义”,或按 。Alt+F12
  • 若要跳转到定义的位置,请右键单击该项目,然后选择“转到定义”,或按 。F12

查找所有参考资料

您可以找到对用户定义的 Apex 的所有引用,例如类、类变量、枚举、接口、方法和属性。要查找参考文献,请右键单击该项目并选择“转到参考文献”或按 ;或者右键单击该项目,然后选择“查找所有引用”。参考结果将显示在编辑器窗口的左窗格中。Shift+F12

大纲视图

Apex 大纲视图显示在编辑器中打开的 Apex 类或触发器的结构。

  • 要查看文件中的符号列表,请按 (Windows 或 Linux) 或 Cmd+Shift+O (macOS)。Ctrl+Shift+O
  • 要转到其中一个符号,请从列表中选择它。

侧栏中的“资源管理器”还提供“大纲”视图,以帮助您处理项目。

语法错误

任何语法错误(如缺少分号或括号)都会在编辑器中用红色波浪线标记。“问题”面板还列出了语法错误。若要转到包含语法错误的源文件,请双击该错误。

快速修复

当您引用未在源代码中声明的方法时,请使用“快速修复”小组件自动声明该方法。

可以通过以下方式调用声明缺失的方法快速修复:

  • 单击未声明的方法的名称时,编辑器窗口的左侧会出现一个灯泡。单击灯泡,然后单击“yourClass”中的“创建方法”yourMethod“以进行快速修复。
  • 将鼠标悬停在方法名称上,然后在弹出窗口中单击“快速修复”。然后,单击“yourClass”中的“创建方法”yourMethod“以进行快速修复。

注意:“快速修复”小组件的键盘快捷键是 。在 macOS 以及 Windows 和 Linux 中。Cmd+Ctrl+

匿名顶点

在项目中保留 Apex 代码以执行某些任务是很常见的。默认情况下,新项目具有包含示例文件的文件夹顶点。我们建议您使用此文件夹创建使用文件扩展名的 Anonymous Apex 文件。scripts/hello.apex.apex

可以通过两种方式在 Visual Studio 代码中执行 Anonymous Apex:You can execute Anonymous Apex in Visual Studio code in two ways:

  1. 选择任何 Apex 代码并运行命令 SFDX: Execute Anonymous Apex with Currently Selected Text
  2. 运行命令 SFDX: Execute Anonymous Apex with Editor Contents 以执行文件的整个上下文。

在这两种情况下,执行的代码的结果都会打印到输出窗格中。

在项目中保留 Apex 代码以执行某些任务是很常见的。默认情况下,新项目具有一个包含示例文件的文件夹。建议使用此文件夹创建具有文件扩展名的 Anonymous Apex 文件。scripts/apexhello.apex.apex

Apex 测试

内容

  • 探索您的 Apex 测试
  • 从文件内运行 Apex 测试

Apex 扩展允许您运行 Apex 测试来验证代码的功能。

探索您的 Apex 测试

侧栏中的“测试”视图提供了多种功能,例如 LWC 测试和 Apex 测试。若要访问“测试”视图,请单击 VS Code 编辑器左侧“活动栏”中的烧杯图标 ()。如果未看到此图标,请确保项目的根目录中包含文件。如果“测试”视图为空,请检查 Java 设置是否配置正确。sfdx-project.json

使用 Apex 测试功能可以运行一个测试方法、一个类中的测试方法或所有 Apex 测试。

运行测试

  • 为单个方法运行测试:将鼠标悬停在测试方法的名称上,然后单击播放图标(将鼠标悬停文本:运行单个测试)。
  • 为类中的所有方法运行测试:将鼠标悬停在测试类的名称上,然后单击播放图标(悬停文本:运行测试)。
  • 运行所有测试:将鼠标悬停在 Apex 测试视图上,然后单击播放图标 ()。

运行 Apex 测试后,“命令面板”中提供了“SFDX:重新运行上次调用的 Apex 测试类”和“SFDX:重新运行上次调用的 Apex 测试方法”命令。

查看测试结果

  • 通过测试时,类和方法旁边的蓝色图标将变为绿色图标。
  • 对于失败的测试,图标将变为红色。

若要查看测试运行的详细信息,请将鼠标悬停在侧边栏中测试类的名称上。 测试结果将显示在“输出”面板中。

转到测试类定义

若要跳转到测试类、已通过的测试方法或尚未运行的方法的定义,请单击其名称。如果单击失败的测试方法的名称,则会跳转到发生失败的行。

清晰的测试结果

要清除测试结果,请单击 Apex Tests 视图顶部的刷新图标(悬停文本:刷新测试)。

刷新 Apex 测试视图

如果自上次填充“测试”视图以来添加了方法或类,请单击“Apex 测试”视图顶部的刷新图标以获取更新的列表。

从文件内运行 Apex 测试

您可以从编辑器窗口中打开的类文件运行 Apex 测试。单击 Apex 测试方法定义上方的运行测试”或 Apex 测试类定义上方的“运行所有测试”。您可以在“输出”面板中查看测试结果,输出的“失败”部分列出了失败测试的堆栈跟踪。若要导航到导致失败的代码行,请按 Ctrl(Windows 或 Linux)或 Cmd (macOS),然后单击该堆栈跟踪。

突出显示 Apex 测试代码覆盖率

每次运行一个或多个测试时,您都可以检索 Apex 类和 Apex 触发器的代码覆盖率结果。为此,请编辑工作区设置并检查并运行 Apex 测试。现在,您可以在“输出”面板中查看代码覆盖率,该面板显示了每个 Apex 类和 Apex 触发器的覆盖率百分比,以及测试运行结果未涵盖的行。retrieve-test-code-coverage

要查看测试的代码覆盖率,请单击侧栏底部组织别名旁边的三条形图标 (),然后打开正在测试的 Apex 类或 Apex 触发器。单击三条形图标可在启用和禁用代码覆盖率突出显示之间切换。

Apex 重构

内容

  • 重构:重命名
  • 重构:提取常量
  • 重构:提取局部变量

重构:重命名

您可以重命名源中定义的任何有效 Apex 符号:方法、局部变量、字段、属性、构造函数或类型(类、触发器或枚举)。要执行重命名,请右键单击要重命名的符号,然后选择重命名符号

在应用重命名之前,将执行新符号名称的验证。如果验证失败,则会显示一条错误消息,说明无法应用重命名重构的原因。如果新名称不是有效的 Apex 标识符,或者有时新名称与现有标识符名称冲突,则验证将失败。(如果允许这些情况,则可能会导致编译器错误或运行时行为更改。

GIF showing a renaming error

如果新名称与现有标识符名称冲突,我们会尝试在存在冲突的上下文中完全限定对现有名称的引用。

GIF showing a renaming conflict

重构:提取常量

您可以将文本提取到常量中。文本包括:String、Integer、Long、Double、Decimal 和 Boolean。

  1. 在编辑器中,选择要提取的表达式。
  2. 单击装订线中的灯泡,然后选择“提取常量”。
  3. 新常量将声明为从中调用重构的包含类中的字段。
  4. 现在,所选表达式应替换为新字段的名称。

重构:提取局部变量

您可以将表达式提取到局部变量中。

  1. 在编辑器中,选择要提取的表达式。
  2. 单击装订线中的灯泡,然后选择“提取变量”。
  3. 新的局部变量将在调用重构的声明上方的行中声明。
  4. 现在,所选表达式应替换为新局部变量的名称。

调试 Apex

Salesforce 扩展包为每个开发人员提供了丰富的调试选项,无论您处于低代码到专业代码连续体的哪个位置。使用此信息确定哪个 Apex 调试器适合您:

  • Replay Debugger:免费且易于使用。
  • 交互式调试器:传统的许可调试器,可用于实时查看和暂停事件。
  • ISV 调试器:用于直接从许可证管理组织 (LMO) 在客户组织中调试托管包代码。

其他资源

  • 调试日志
  • 使用 Apex Replay Debugger 查找并修复 Bug
  • Apex 类和 Apex 触发器的调试日志过滤

Apex 重播调试器

内容

  • 概述
  • 设置断点和检查点
  • 易于调试
  • 重播调试器设置
  • 重播调试日志
  • 考虑
  • 资源

概述

Apex Replay Debugger 可以与所有组织中的所有非托管代码一起使用。它适用于 Apex 类、触发器、匿名 Apex 和日志文件。这是一个易于使用的调试器,适合大多数调试用例。这是进入调试过程的良好门户 – 根据需要扩展到其他调试器。

设置断点和检查点

在生成用于重播调试的调试日志之前,请设置断点和检查点。断点可以动态设置,不需要部署。检查点是组织中所有对象在某个时间点的快照。每次设置检查点时都必须重新部署检查点。

  1. 要设置行断点,请打开一个 或 文件,然后单击行号左侧的列。.cls.trigger
  2. 有关行断点提供的详细信息,请添加检查点。您最多可以设置五个检查点,以便在代码行运行时获取堆转储。所有局部变量、静态变量和触发器上下文变量在检查点都有更好的信息。触发器上下文变量在日志中不存在,仅在检查点位置可用。
    在 Visual Studio Code 中,检查点是一种断点。检查点的功能类似于从日志重播调试时的断点。在启动 Apex Replay Debugger 会话之前设置并上传检查点。
    1. 在 Apex 类或触发器中最多五行上设置检查点。
    2. 单击要设置检查点的代码行。
    3. 打开命令面板(在 Windows 或 Linux 上按 Ctrl+Shift+P,在 macOS 上按 Cmd+Shift+P)。
    4. 运行 SFDX: Toggle Checkpoint
      • 或者,在行号左侧的装订线中单击鼠标右键,选择“添加条件断点”|”表达式,并将表达式设置为 。Checkpoint
      • 或者,若要将现有断点转换为检查点,请右键单击该断点,然后选择“编辑断点”|”表达式。将表达式设置为 。Checkpoint
    5. 要将检查点上传到组织以收集堆转储信息,请打开命令面板,然后运行 SFDX:在组织中更新检查点

易于调试

快速调试您的 Apex 开发工作,而无需显式设置跟踪标志:

  1. 打开设置了检查点或断点的 Apex 测试类或匿名 Apex 类。
  2. 运行 SFDX:从命令面板启动带有当前文件的 Apex Replay Debugger(或通过右键单击打开的文件来选择命令)。您可以在 Apex 测试文件、匿名 Apex 文件或 Apex 日志文件上调用此命令。

该命令更新组织中的检查点,设置(并在完成后删除)跟踪标志,并生成新的调试日志。对于匿名 Apex 文件,将在窗口中打开一个新的日志文件。

重播调试器设置

设置 Apex Replay Debugger 以调试组织中更复杂的问题,例如可排队的 Apex 或 Apex 触发器问题:

  1. 打开命令面板,然后运行 SFDX:更新组织中的检查点,将检查点上传到组织以收集堆转储信息。注意:如果您修改 Apex 代码或切换检查点,请再次运行此命令以保持同步。
  2. 运行 SFDX:打开 Replay Debugger 的 Apex 调试日志
  3. 在您的组织中,重现您正在调试的问题。
  4. 获取组织中的调试日志列表,运行 SFDX:获取 Apex 调试日志
  5. 单击要重播的日志。日志将下载并在 VS Code 中打开。
  6. 运行 SFDX:使用当前文件启动 Apex Replay Debugger

单步执行所有记录的事件后,调试会话将结束。如果要在日志开头重新开始,请运行 SFDX:使用最后一个日志文件启动 Apex 重播调试器。如果您设置了不同的检查点,请再次上传它们并重复这些步骤。

重播调试日志

重播调试日志并检查变量的值。

  1. 若要切换到 VS Code 的“调试”视图,请单击窗口左边缘的 bug 图标。
  2. 若要重播在调试日志中记录的代码执行,直到命中断点,请单击编辑器顶部的“调试操作”窗格中的绿色播放图标。
  3. 打开日志文件。
  4. 单步执行代码,并在“调试”视图的“变量”部分中检查变量的状态。有关详细信息,请参阅 Visual Studio Code 文档中的调试。
    当您在调试会话期间单步执行代码时,Apex Replay Debugger 会在您设置检查点的行上提供有关堆转储中变量的详细信息。 单步执行所有记录的事件后,调试会话将结束。如果要在日志开头重新开始,请运行 SFDX:使用最后一个日志文件启动 Apex 重播调试器

考虑

使用 Apex Replay Debugger 时,请牢记这些注意事项和已知问题。

  • 只能在组织中使用此调试器。ISV 客户调试在 Apex Replay Debugger 中不可用。若要调试客户的组织,请使用 ISV 客户调试器
  • 一次只能重播一个调试日志。此限制可能会使异步 Apex 难以调试,这会生成多个调试日志。
  • 请务必在上传检查点后立即启动调试会话,因为检查点将在 30 分钟后过期。
  • 请务必在启动会话后立即调试代码,因为堆转储在生成后大约一天过期。
  • 您无法重播由计划的 Apex 生成的调试日志。
  • 长字符串变量值在断点处被截断。在检查点,heap-dump-augmented 变量具有完整的字符串。
  • 在断点处查看标准对象或自定义对象时,只能向下钻取到对象的直接子变量(一级深度)。在检查点,堆转储增强变量可以完全向下钻取到子标准对象,而不仅仅是直接子对象。
  • 无法展开集合(列表、集或映射),因为其成员以字符串形式显示。
  • 修改集合不会更新“调试”视图的“VARIABLES”部分中的集合变量。
  • 不能设置方法或条件断点。
  • 不能在“调试”视图的“监视”部分中计算或监视变量或表达式。
  • 调试时,右键单击“调试”视图的“变量”部分中的变量,然后选择“复制值”即可正常工作。但是,“复制为表达式”和“添加到监视”无法按预期工作。
    • 复制为表达式函数,如复制值:它复制变量的值,而不是复制完整的变量名称。
    • “添加到监视”会将变量的值复制到 WATCH 部分,但由于我们不计算此部分中的变量,因此您只能看到 。<VariableValue>:<VariableValue>

资源

使用 Apex Replay 调试器简化调试工作流程

Apex 交互式调试器

内容

  • 设置 Apex 调试器
  • 调试代码
  • 设置异常断点
  • 将用户和请求类型列入允许名单
  • 考虑

Apex Interactive Debugger(也称为 Apex Debugger)是一种传统的调试器,允许客户使用 VS Code 作为客户端,在沙盒和临时组织中实时调试其 Apex 代码。您可以使用它来:

  • 在 Apex 类和触发器中设置断点。
  • 查看变量,包括 sObject 类型、集合和 Apex System 类型。
  • 查看调用堆栈,包括由 Apex 数据操作语言 (DML) 激活的触发器、方法到方法调用和变量。
  • 与已安装的托管包中的全局类、异常和触发器进行交互。(当您检查具有对您不可见的托管类型的对象时,变量检查窗格中仅显示全局变量。
  • 完成标准调试操作,包括单步执行、单步执行和单步执行,以及运行到断点。
  • 将结果输出到调试控制台。

要调试订阅者的沙盒组织,请使用 ISV Customer Debugger,它是 Apex Interactive Debugger 扩展的一部分。

设置 Apex 调试器

首次在 VS Code 中使用 Apex Debugger 时,请完成以下设置步骤。

注意:您只能将提供给许可证管理组织的默认许可证与 ISV 客户调试器一起使用,以调试订阅者组织。如果您没有 Apex Debugger 许可证,请使用 Replay Debugger。

  1. 将该功能添加到您计划调试的所有类型的临时组织定义文件中:DebugApex
    "features": "DebugApex"
  2. 在 VS Code 中,运行 SFDX:创建默认临时组织
  3. 选择包含该功能的临时组织定义文件。DebugApex
  4. 临时组织准备就绪后,将 Apex Debugger 的权限分配给组织的管理员用户。
    1. 在 VS Code 中,运行 SFDX: Open Default Org
    2. 在浏览器中,从“设置”中输入“快速查找”框,然后选择“权限集”。Permission Sets
    3. 单击“新建”。
    4. 为权限集指定一个您可以记住的名称,例如 .Debug Apex
    5. 在“选择将使用此权限集的用户类型”部分中,从“用户许可证”下拉列表中选择“无”。选择“无”允许您将权限集分配给多种类型的用户。
    6. 保存更改。
    7. 单击“系统权限”。
    8. 单击编辑
    9. 启用 Debug Apex。Debug Apex 所需的其他权限会自动添加。
    10. 保存更改。
    11. 单击“管理分配”。
    12. 单击“添加分配”。
    13. 选择要向其分配权限集的用户,然后单击“分配”。
    14. 单击完成
  5. 可选:在 VS Code 中,运行 SFDX:从默认临时组织拉取源。然后,将新权限集添加到源代码管理存储库。如果您的 Salesforce DX 项目中有权限集的副本,则可以通过运行 将权限分配给临时组织用户。sfdx force:user:permset:assign -n Your_Perm_Set_Name
  6. 在 VS Code 中,为 Apex Debugger 创建启动配置。
    1. 若要打开“调试”视图,请在 VS Code 活动栏中单击 bug 图标(悬停文本:调试)。
    2. 若要创建文件,请单击齿轮图标(悬停文本:Configure 或 Fix launch.json),然后选择 Apex Debugger。(如果您已经创建了此文件,请单击齿轮图标将打开该文件。launch.json
    3. 在阵列中,添加配置。它应包含的最少信息:"configurations""Launch Apex Debugger""configurations": [ { "name": "Launch Apex Debugger", "type": "apex", "request": "launch", "sfdxProject": "${workspaceRoot}" } ]
    4. 保存您的文件。每个项目只需要一个文件,即使您使用多个临时组织也是如此。此文件位于项目的目录中。launch.jsonlaunch.json.vscode

:::注意 Visual Studio Marketplace 中提供了一个名为 Salesforce Apex Debug 的非官方调试器扩展。它与我们的官方扩展名相冲突。请确保在使用我们的扩展程序时禁用该扩展程序。 :::

调试代码

要设置行断点,请打开一个 或 文件,然后单击行号左侧的列。活动断点为红色。非活动断点为灰色。您可以在“调试”视图的“断点”面板中查看断点列表。.cls.trigger

若要启动调试会话,请从“调试”视图顶部的配置下拉菜单中选择“启动 Apex 调试器”。然后,单击绿色播放图标(悬停文本:开始调试)。

在调试会话进行过程中,运行带有断点的代码行的任何同步活动都会导致执行在断点处停止。在执行暂停时,您可以检查调用堆栈并查看变量的当前值。还可以使用调试会话进行时显示在编辑器顶部的“调试操作”窗格单步执行代码,并观察这些值的更改。一次最多可以调试两个线程。有关详细信息,请参阅 Visual Studio Code 文档中的调试。

设置异常断点

要使 Apex Debugger 在调试会话期间引发异常时停止执行,请在异常上设置断点。当命中断点时,调试器会在导致异常的代码行上暂停。“调试”视图中的“调用堆栈”面板显示异常的名称。

若要设置异常断点,请按 Ctrl+Shift+P(Windows 或 Linux)或 Cmd+Shift+P (macOS) 打开命令面板,然后选择“SFDX:配置 Apex 调试例外”。可用异常列表包括 System 命名空间中的异常以及项目中扩展 .从列表中选择一个例外,然后选择“始终中断”。Exception

若要查看异常断点,请运行 SFDX:配置 Apex 调试异常。列表顶部显示具有活动断点的异常类,标记为 。若要删除异常断点,请从列表中选择一个例外,然后选择“永不中断”。Always break

关闭 VS Code 时,将删除所有异常断点。(但是,您的行断点将保留。

将用户和请求类型列入允许名单

若要筛选已调试的请求,请编辑文件以设置允许的用户列表。(该文件位于项目的目录中。如果不使用允许的用户列表,则组织中的所有事件都会在调试会话期间触发调试。将允许列表用户或请求类型设置为仅关注与要调试的问题相关的事件。launch.jsonlaunch.json.vscode

将筛选器添加到配置中:"Launch Apex Debugger"

"configurations": [
  {
    "name": "Launch Apex Debugger",
    "type": "apex",
    "request": "launch",
    "sfdxProject": "${workspaceRoot}",
    "userIdFilter": [],
    "requestTypeFilter": [],
    "entryPointFilter": ""
  }
]

若要自动完成 的潜在请求类型值,请按 Ctrl+空格键。"requestTypeFilter"

要按入口点进行筛选,请输入正则表达式作为 的值。例如,要允许 Visualforce 页面发出的请求,请输入 。"entryPointFilter"MyPage".*/apex/MyPage.apexp"

考虑

使用 Apex Debugger 时,请牢记这些限制和已知问题。

一般注意事项

  • 如果在调试会话进行时编辑 Apex 类,则在保存更改后,断点可能与调试输出不匹配。
  • 在停止会话之前关闭 VS Code 时,调试会话是孤立的。如果您有孤立会话,则无法启动新会话。若要停止活动会话,请在 VS Code 中运行 SFDX:停止 Apex 调试器会话。要管理 Dev Hub 的 Apex Debugger 会话,请转到设置中的 Apex Debugger。
  • 评估功能不可用。
  • 不允许热插拔。这些操作会终止调试会话:
    • 安装或卸载软件包
    • 保存导致组织元数据重新编译的更改
  • 在调试会话期间,无法保存对以下项的更改:
    • 顶点类或触发器
    • Visualforce 页面或组件
    • 闪电资源
    • 权限或首选项
    • 自定义字段或自定义对象

入口点的注意事项

不支持以下入口点:

  • 异步执行的代码,包括异步测试提示:介于一对 和 方法之间的代码可以同步运行。若要调试异步功能,请在测试中使用这些方法。startTeststopTest
  • 批处理、可排队和计划顶点
  • 入站电子邮件
  • 带有注解的代码@future

断点的注意事项

  • 不能设置条件断点。
  • 在 or 方法上设置的断点必须位于方法的主体内。getset
  • 不能在 Execute Anonymous 块中设置断点,也不能单步执行 Execute Anonymous 块。但是,当您使用 Execute Anonymous 命中断点时,我们会在堆栈中显示您的 Execute Anonymous 帧。要查看 Execute Anonymous 代码的变量,请单击堆栈中的此行。

变量的注意事项

  • 您无法监视变量。
  • 不支持动态 Visualforce 和 Lightning 组件中的变量检查。
  • 您无法钻取到 Apex 库对象的实例变量。若要查看这些对象的内容,请使用它们的方法。toString
  • 在循环中声明的变量在循环外可见。
  • 钻取到变量以查看其子项的值。例如,如果运行查询,则结果将嵌套如下。[SELECT Id, ContactId, Contact.accountId, Contact.Account.ownerId FROM Case]Case --> Contact -----> contactId -----> Account --------> accountId --------> ownerId
  • 当您对 EntityDefinition 表中的变量执行 SOQL 查询时,即使您没有显式显示该变量,结果也会包括 。durableIdSELECT

另见

Apex 交互式调试器

ISV 客户调试器

内容

  • 配置 ISV 客户调试器
  • 调试订阅者的组织
  • 续订调试会话
  • 保护订阅者的知识产权
  • ISV 客户调试器注意事项

Salesforce ISV(独立软件供应商)是在 Salesforce Platform 上创建可在 Salesforce AppExchange 上使用的托管软件包的开发人员。包订阅者无权访问托管代码,这可能会使调试具有挑战性。ISV 调试器允许 ISV 在沙盒组织中重现订阅者环境中的问题,以便于调试。借助 ISV 调试器,ISV 可以与订阅者合作,调试特定于订阅者组织的问题。

配置 ISV 客户调试器

ISV Customer Debugger 是 Apex Interactive Debugger () 扩展的一部分,因此除了 Salesforce 扩展包及其必备组件外,您无需安装任何其他内容。您只能调试沙盒组织。salesforcedx-vscode-apex-debugger

  1. 登录到您的许可证管理组织 (LMO),并使用配置文件或权限集在设置中为用户启用“查看和调试托管 APEX”权限。
  2. 通过许可证管理组织 (LMO) 登录订阅者的沙盒。如果您不熟悉此过程,请参阅 ISVforce 指南。有关如何获取订阅者组织的登录访问权限的信息,请参阅向客户请求登录访问权限。有关如何通过订阅者支持控制台登录的信息,请参阅登录订阅者组织。
  3. 在订阅者的组织中,从“设置”中,在“快速查找”框中输入“Apex Debugger”,然后单击“Apex Debugger”。
  4. 单击“启动合作伙伴调试会话”。
  5. 在“使用 VS Code 的 Salesforce 扩展”部分中,若要复制 URL,请单击“复制到剪贴板”。forceide://
  6. 在 VS Code 中,按 Ctrl+Shift+P(Windows 或 Linux)或 Cmd+Shift+P (macOS) 打开命令面板,然后运行 SFDX:创建和设置用于 ISV 调试的项目
  7. 收到指示后,将 URL 粘贴到提示符中,然后按 Enter。forceide://
  8. 收到指示时,接受默认项目名称或输入调试项目的名称,然后按 Enter。
  9. 选择存储项目的位置,然后单击“创建项目”。
  10. 等待项目生成过程完成。VS Code 检索组织中其他包的打包元数据、订阅者的元数据和框架类,将它们转换为源格式,并创建 Salesforce DX 项目。VS Code 还为项目创建启动配置(文件)。此过程可能需要很长时间,尤其是对于包含大量元数据的组织,因此请随时让它保持运行状态,稍后再回来查看。可以在 VS Code 底部的输出面板中监视进度。要显示输出面板,请选择“查看>输出”,然后从“输出”选项卡一角的下拉菜单中选择“Salesforce CLI”。
    项目准备就绪后,VS Code 会在新窗口中打开它。launch.json
  11. 在新窗口中,从“资源管理器”视图中,打开要在其中设置断点的 Apex 类或触发器。
  12. 要设置断点,请单击行号左侧的装订线。
  13. 切换到“调试”视图。
  14. 要启动 Apex Debugger,请单击启动配置下拉菜单旁边的播放图标。

调试订阅者的组织

除了一个值得注意的例外,调试订阅者组织的工作方式与调试其他组织的工作方式相同。例外情况:您无法中断组织中其他用户触发的 Apex 事件。只有“登录身份”用户才能触发 Apex 断点命中事件。

有关 Apex Debugger 的信息,请参阅本自述文件的其余部分。有关在 VS Code 中进行调试的一般信息,请参阅 Visual Studio Code 文档中的调试。

续订调试会话

如果您的会话已过期,请使用启动原始会话时所遵循的所有相同步骤从安装程序启动新会话。

保护订阅者的知识产权

订阅者所在组织的代码是订阅者的知识产权。建议不要在完成调试后保留它。在安装过程中,从存储项目的位置删除整个项目。切勿将订阅者的元数据存储在版本控制系统中。稍后启动新的调试会话时,VS Code 会再次为你下载元数据。

ISV 客户调试器注意事项

有关 Apex Debugger 的一般限制和已知问题,请参阅 Apex Interactive Debugger 一文中的注意事项。使用 ISV 客户调试器时,请牢记这些其他注意事项。

  • 您只能调试沙盒组织。
  • 一次只能调试一个客户。但是,如果您购买了 Apex Debugger 许可证,则可以一次调试多个客户。Apex Debugger 许可证还允许您在沙盒和临时组织中进行调试。
  • 单击“返回到订阅者概述”时,调试会话将终止。调试时保持登录到订阅者的组织,只有在完成调试后才返回到 LMO。

Apex 任务

内容

  • 使用 Anonymous Apex 批量更新帐户评级
  • 资源

此存储库包含示例 Apex 任务,您可以使用 Salesforce 扩展在 Code Builder 或 VS Code 中完成这些任务。我们不断添加到此列表中,因此请确保您经常访问此主题。

使用 Anonymous Apex 批量更新帐户评级

假设您的帐户设置为 由于不利的商业条件。您现在想要对这些帐户进行批量更新,并将其评级更改为 .您希望将此更新限制为收入超过一定金额的中型帐户。RatingColdWarm

此 Anonymous Apex 代码更新年收入大于员工人数或员工人数超过员工人数的账户的评级:$10,000,0001000

  1. 在文件夹中,使用文件扩展名创建一个 Anonymous Apex 文件。 将此代码粘贴到文件中:scripts/apex.apex List<Account> acctList =[SELECT Name, Rating FROM Account WHERE AnnualRevenue > 500000 AND NumberOfEmployees > 100]; for (Account acc: acctList){ if (acc.Rating == 'Cold') { acc.Rating = 'Warm'; update acc; } System.debug(acc.Name + acc.Rating); }
  2. 单击 Execute Anonymous Apex 以执行您的代码。

列出帐户及其更新的评级。DEBUG CONSOLE

资源