Apex Developer Guide Spring 23 新增功能总结 和 GraphQL的介绍
一.Apex Developer Guide Spring 23 新增功能总结
1. 动态传递绑定变量到SOQL查询中:
API版本57及其以后,通过新的Database.queryWithBinds、Database.getQueryLocatorWithBinds和Database.countQueryWithBinds方法,查询中的绑定变量是直接从Map参数中用键来解决,而不是从Apex代码变量中解决。
Map<String, Object> acctBinds = new Map<String, Object>{'acctName' => 'Acme Corporation'};
List<Account> accts =
Database.queryWithBinds('SELECT Id FROM Account WHERE Name = :acctName',
acctBinds,
AccessLevel.USER_MODE);
2. 使用System.enqueueJob方法来执行 调取队列的延迟:
一个新的可排队作业添加到异步执行队列中,并指定一个最小延迟(0-10分钟)。使用System.enqueue(queueable, delay)方法可以忽略任何组织范围的enqueue延迟设置。在Apex测试期间,延迟会被忽略。
Integer delayInMinutes = 10;
ID jobID = System.enqueueJob(new MyQueueableClass(), delayInMinutes);//MyQueueableClass是队列
3. 使用 用户模式 的数据库操作保护Apex代码:
新的数据库和搜索方法支持一个accessLevel参数,可以让你在用户模式而不是默认的系统模式下运行数据库和搜索操作。为了加强Apex的安全环境,你可以为数据库操作指定用户模式访问。在用户模式下,运行用户的字段级安全(FLS)和对象权限
//when we query the data
List<Account> acc = [SELECT Id FROM Account WITH USER_MODE];
//For DML Operation
Account acc = new Account(Name='test');
insert as user acc;
二. GraphQL 介绍
GraphQL 是 Facebook 开发的一种应用层服务器端技术,用于对现有数据执行查询。GraphQL 可以优化 RESTful API 调用。它提供了一种获取和更新数据的声明方式。
GraphQL Wire Adapter 在 Spring '23 版本中处于试验阶段。
1. 什么是GraphQL?
GraphQL是一种用于API的标准查询语言,是一种发送和接收数据的新模式,为客户提供一个单一的端点,在一个请求中调用所有需要的数据。调用GraphQL API的应用程序通常比使用传统REST API的应用程序性能要好得多。这是因为他们能够通过在一次调用中检索所有必要的数据的能力,减少到服务器的往返次数。客户不仅可以在一次请求中查询到他们想要的所有数据,而且响应也只包含他们需要的数据。
GraphQL 是一种强大的查询语言,它允许开发人员以比传统 REST API 调用更高效、更灵活的方式从 Salesforce 中仅检索他们需要的数据。并且也 可以与 Lightning Web 组件 (LWC) 一起使用,以从 Salesforce 对象中检索数据。
- 在 Salesforce 中使用 GraphQL 的主要优势之一是它能够在单个查询中从多个对象检索数据。这允许开发人员检索相关数据并避免多次 REST API 调用,这既耗时又难以维护。
- 在 Salesforce 中使用 GraphQL 的另一个优势是它能够根据特定条件过滤数据(分页、过滤和排序)。借助 GraphQL,开发人员可以使用过滤器和变量来检索他们需要的数据,从而提高查询效率并减少检索的不必要数据量。
1.1 在LWC中的使用:
GraphQL Wire Adapter提供了几个好处,使开发人员更容易在LWC中访问Salesforce数据:
- LWC的本地可查询性: 使用具有丰富谓词的行业标准查询语言来查询Salesforce数据。开发人员现在可以在他们的LWC中轻松有效地查询Salesforce数据,而不需要使用Apex来处理数据查询。
- 单一的端点和数据聚合: 你可以为你的所有资源获得一个端点,而且数据可以在多个资源中聚合。更少、更具体的请求有助于你优化你的应用程序的性能。
- 更好的开发者体验: GraphQL通过丰富的表达式、全面的数据视图和可扩展的经验,实现了更好的开发者体验。 模块化、分布式的数据获取逻辑: GraphQL片段允许应用和表现逻辑的干净分离。获取数据的组件和呈现数据的组件可以独立编写和测试,没有责任的重叠。这也使得组件的可重用性更高。
- LDS的内置共享缓存:GraphQL数据是强类型的,并由正式的模式描述。LDS利用这种对数据的深入理解,更有效地缓存数据,并提供跨越GraphQL和非GraphQL结果的一致性保证。例如,LDS可以结合和重用来自以前的GraphQL和非GraphQL电线适配器请求的数据,以满足随后的请求,而不需要从服务器请求数据,这提高了应用程序的性能
- 用户权限和安全: 就像REST一样,在运行查询时,GraphQL尊重场级安全、机关许可和用户CRUD许可。
- 移动离线支持: 在支持离线的移动环境中,GraphQL查询可以针对本地缓存的数据进行评估,这使得组件可以离线使用GraphQL查询。这种能力对于我们的客户来说非常重要,因为他们在农村地区、地下和灾难现场等低度或无连接条件下操作关键任务功能。离线查询反映了尚未复制到服务器上的草稿变化(记录的创建和更新)。这些运行时环境还支持使用GraphQL查询,为本地数据缓存打底,为离线模式做准备。
引入模块graphql中的函数lightning/graphql。此函数接受 GraphQL 查询并以 JavaScript 对象的形式返回数据。
您可以导入标识符并传入组件属性的配置。参数是:
- query—(必需)已解析的 GraphQL 查询。gql 使用JavaScript 模板文字函数 解析查询 。gql 将 GraphQL
查询解析为有线适配器可以使用的格式。 gql 不是反应性的。如果包含 ${} 字符串插值构造,则仅在扩展模板文字时才对它们求值一次。 - variables— 查询的动态值键值对 gql 。variables 与 getter 函数一起使用
,以便电线适配器可以对变化做出反应。 - operationName— 您要在查询中执行的操作的名称。
1、 使用LWC 组件中的graphql函数从 Salesforce 对象检索数据的示例:
import { LightningElement, wire } from 'lwc';
import { graphql } from 'lightning/uiGraphQLApi';
export default class MyComponent extends LightningElement {
@wire(graphql, {
query: `query getAccounts {
accounts {
id
name
industry
phone
website
}
}`
}) accounts;
}
在此示例中,我们使用该graphql函数来执行从对象中检索数据的查询Account。查询被定义为模板字符串,它指定了我们要检索的字段。装饰@wire器用于将查询结果绑定到属性accounts。
2、查询以特定名称开头的客户数据示例
import { LightningElement, wire } from 'lwc';
import { gql, graphql } from 'lightning/uiGraphQLApi';
export default class ExampleGQL extends LightningElement {
@wire(graphql, {
query: gql`
query AccountInfo {
uiapi {
query {
Account(where: { Name: { like: "United%" } }) @category(name: "recordQuery") {
edges {
node {
Name @category(name: "StringValue") {
value
displayValue
}
}
}
}
}
}
}`
})
propertyOrFunction
}
3、查询 最低金额minAmount = '1000000’ 的客户数据 示例
import { LightningElement, wire } from 'lwc';
import { gql, graphql } from 'lightning/uiGraphQLApi';
export default class AccountsGQL extends LightningElement {
records;
errors;
minAmount = '1000000’;
@wire(graphql, {
query: gql`
query myOperationName($minAmount: Currency) {
uiapi {
query {
Account(where: { AnnualRevenue: { gte: $minAmount } }) @category(name: "recordQuery") {
edges {
node {
Id
Name @category(name: "StringValue") {
value
}
AnnualRevenue @category(name: "CurrencyValue") {
displayValue
}
}
}
}
}
}
}`,
variables: '$myVariables',
operationName: 'myOperationName',
})
graphqlQueryResult({ errors, data }) {
if (data) {
this.records = data.uiapi.query.Account.edges.map(edge => edge.node);
this.errors = undefined;
} else if (errors) {
this.errors = errors;
}
}
get myVariables() {
return {
minAmount: this.minAmount
};
}
}
1.2 在postman中使用GraphiQL 获取数据:
在 GraphiQL 中,连接到 Salesforce GraphQL API 端点并确保设置以下 HTTP 请求标头:
content-type:application/json
Authorization:Bearer
X-Chatter-Entity-Encoding: false