使用Heroku的Apex标注和工作流程

学习目标

完成本单元后,您将能够:

  • 了解如何使用Heroku使用Apex标注和工作流程。
  • 了解Apex标注和工作流程的用例。

呼叫Heroku应用程序

有时,由于正在执行的流程的规模或类型,Salesforce上的事件需要由外部系统处理。例如,Salesforce中的用户上载需要调整大小以供将来使用的图像。Heroku可以从Salesforce接收事件并执行一些响应过程。(可选)可以使用REST API或Heroku Connect将流程的输出存储回Salesforce中。

该图显示了Salesforce和从出站消息触发或发送的数据事件的框。 箭头来自框并指向包含Heroku托管的所有应用程序的另一个框

根据Salesforce中的事件调用Heroku应用程序有两种主要方法:工作流出站消息或Apex HTTP标注。工作流出站消息以声明方式进行SOAP调用。Apex HTTP callout以编程方式对Heroku应用程序进行REST调用。无论哪种方式,Heroku应用程序都会收到带有事件详细信息有效负载的请求,然后执行操作。

带有工作流程的标注

使用工作流,您可以声明性地定义规则和外部系统的标注。该规则可以连接到任何Salesforce对象,如Contact或Account,并根据这些记录事件触发:

  • 创建
  • 创建,每次编辑
  • 创建,并随时编辑以符合标准

规则必须具有筛选事件的条件。如果您不想进行任何过滤,则可以添加始终为真的条件。以下是一个示例规则:

“配置工作流规则”对话框的屏幕截图,显示规则名称应为“新建联系人”

要在规则执行时调用Heroku应用程序,请将出站消息添加到即时工作流操作列表中,并将Heroku应用程序端点指定为端点URL,如:

Configure OUtbound Messaging对话框的屏幕截图,显示名为New Contact to Heroku的消息

如果选择Send Session ID,Heroku应用程序可以使用该令牌代表用户进行REST API调用。如果您不发送会话ID。没有办法检查请求是否有效或防止恶意调用您的Heroku应用程序的API端点。

在Heroku方面,您可以使用任何开源Web或REST技术实现事件处理程序。但由于消息是SOAP格式,因此您需要能够解析XML。例如,使用JavaScript,Node.js,Express和express-xml-bodyparser库,这里是一个处理出站消息并解析SOAP消息的端点。

 app.post("/new_contact", function(req, res) {
    var notification = req.body["soapenv:envelope"]["soapenv:body"][0]["notifications"][0];
    var sessionId = notification["sessionid"][0];
    var data = {};
    if (notification["notification"] !== undefined) {
      var sobject = notification["notification"][0]["sobject"][0];
      Object.keys(sobject).forEach(function(key) {
        if (key.indexOf("sf:") == 0) {
          var newKey = key.substr(3);
          data[newKey] = sobject[key][0];
        }
      }); // do something #awesome with the data and sessionId
    }
    res.status(201).end();
  }); 

在此示例中,每次创建联系人时,Heroku应用程序都会收到联系人详细信息,并可以根据需要对数据执行任何操作。

带有Apex触发器的标注

您可以在Salesforce对象上定义Apex触发器以处理以下任何事件:

  • 插入
  • 更新
  • 删除
  • 合并
  • UPSERT
  • 取消删除

触发器可以使用Apex标注对Heroku应用程序上的端点进行REST JSON调用。例如,这是一个调用Heroku应用程序的Apex触发器:

 trigger NewContactWebhookTrigger on Contact (after insert) {
  String url = 'https://foo.herokuapp.com/new_contact';
  String content = Webhook.jsonContent(Trigger.new, Trigger.old);
  Webhook.callout(url, content);
} 

引用的Webhook Apex类是:

 public class Webhook {
  public static String jsonContent(List<Object> triggerNew, List<Object> triggerOld) {
    String newObjects = '[]';
    if (triggerNew != null) {
      newObjects = JSON.serialize(triggerNew);
    }
    String oldObjects = '[]';
    if (triggerOld != null) {
      oldObjects = JSON.serialize(triggerOld);
    }
    String userId = JSON.serialize(UserInfo.getUserId());
    String content = '{"new": ' + newObjects + ', "old": ' + oldObjects + ', "userId": ' + userId + '}';
    return content;
  }
  @future(callout=true) public static void callout(String url, String content) {
    Http h = new Http();
    HttpRequest req = new HttpRequest();
    req.setEndpoint(url);
    req.setMethod('POST');
    req.setHeader('Content-Type', 'application/json');
    req.setBody(content);
    h.send(req);
  }
} 

jsonContent方法获取触发器数据并将其序列化为JSON。callout方法使用JSON有效负载将HTTP发布到Heroku。

与出站消息一样,您可以使用任何开源Web或REST技术构建Heroku应用程序。使用JavaScript,Node.js和Express,端点可以定义为:

 app.post("/new_contact", function(req, res) {
  // do something with req.body
  res.status(201).end();
}); 

在请求处理程序中,req.body是从Apex触发器发送的反序列化JSON数据。

使用Apex触发器,您可以使用某种形式的预共享密钥来验证请求,从而避免潜在的恶意请求。您还可以让有效负载包含会话ID,以便让Heroku应用程序将REST API请求返回给Salesforce以获取或更新数据。

使用Heroku的Apex标注和工作流程

学习目标

完成本单元后,您将能够:

  • 了解如何使用Heroku使用Apex标注和工作流程。
  • 了解Apex标注和工作流程的用例。

呼叫Heroku应用程序

有时,由于正在执行的流程的规模或类型,Salesforce上的事件需要由外部系统处理。例如,Salesforce中的用户上载需要调整大小以供将来使用的图像。Heroku可以从Salesforce接收事件并执行一些响应过程。(可选)可以使用REST API或Heroku Connect将流程的输出存储回Salesforce中。

该图显示了Salesforce和从出站消息触发或发送的数据事件的框。 箭头来自框并指向包含Heroku托管的所有应用程序的另一个框

根据Salesforce中的事件调用Heroku应用程序有两种主要方法:工作流出站消息或Apex HTTP标注。工作流出站消息以声明方式进行SOAP调用。Apex HTTP callout以编程方式对Heroku应用程序进行REST调用。无论哪种方式,Heroku应用程序都会收到带有事件详细信息有效负载的请求,然后执行操作。

带有工作流程的标注

使用工作流,您可以声明性地定义规则和外部系统的标注。该规则可以连接到任何Salesforce对象,如Contact或Account,并根据这些记录事件触发:

  • 创建
  • 创建,每次编辑
  • 创建,并随时编辑以符合标准

规则必须具有筛选事件的条件。如果您不想进行任何过滤,则可以添加始终为真的条件。以下是一个示例规则:

“配置工作流规则”对话框的屏幕截图,显示规则名称应为“新建联系人”

要在规则执行时调用Heroku应用程序,请将出站消息添加到即时工作流操作列表中,并将Heroku应用程序端点指定为端点URL,如:

Configure OUtbound Messaging对话框的屏幕截图,显示名为New Contact to Heroku的消息

如果选择Send Session ID,Heroku应用程序可以使用该令牌代表用户进行REST API调用。如果您不发送会话ID。没有办法检查请求是否有效或防止恶意调用您的Heroku应用程序的API端点。

在Heroku方面,您可以使用任何开源Web或REST技术实现事件处理程序。但由于消息是SOAP格式,因此您需要能够解析XML。例如,使用JavaScript,Node.js,Express和express-xml-bodyparser库,这里是一个处理出站消息并解析SOAP消息的端点。

 app.post("/new_contact", function(req, res) {
    var notification = req.body["soapenv:envelope"]["soapenv:body"][0]["notifications"][0];
    var sessionId = notification["sessionid"][0];
    var data = {};
    if (notification["notification"] !== undefined) {
      var sobject = notification["notification"][0]["sobject"][0];
      Object.keys(sobject).forEach(function(key) {
        if (key.indexOf("sf:") == 0) {
          var newKey = key.substr(3);
          data[newKey] = sobject[key][0];
        }
      }); // do something #awesome with the data and sessionId
    }
    res.status(201).end();
  }); 

在此示例中,每次创建联系人时,Heroku应用程序都会收到联系人详细信息,并可以根据需要对数据执行任何操作。

带有Apex触发器的标注

您可以在Salesforce对象上定义Apex触发器以处理以下任何事件:

  • 插入
  • 更新
  • 删除
  • 合并
  • UPSERT
  • 取消删除

触发器可以使用Apex标注对Heroku应用程序上的端点进行REST JSON调用。例如,这是一个调用Heroku应用程序的Apex触发器:

 trigger NewContactWebhookTrigger on Contact (after insert) {
  String url = 'https://foo.herokuapp.com/new_contact';
  String content = Webhook.jsonContent(Trigger.new, Trigger.old);
  Webhook.callout(url, content);
} 

引用的Webhook Apex类是:

 public class Webhook {
  public static String jsonContent(List<Object> triggerNew, List<Object> triggerOld) {
    String newObjects = '[]';
    if (triggerNew != null) {
      newObjects = JSON.serialize(triggerNew);
    }
    String oldObjects = '[]';
    if (triggerOld != null) {
      oldObjects = JSON.serialize(triggerOld);
    }
    String userId = JSON.serialize(UserInfo.getUserId());
    String content = '{"new": ' + newObjects + ', "old": ' + oldObjects + ', "userId": ' + userId + '}';
    return content;
  }
  @future(callout=true) public static void callout(String url, String content) {
    Http h = new Http();
    HttpRequest req = new HttpRequest();
    req.setEndpoint(url);
    req.setMethod('POST');
    req.setHeader('Content-Type', 'application/json');
    req.setBody(content);
    h.send(req);
  }
} 

jsonContent方法获取触发器数据并将其序列化为JSON。callout方法使用JSON有效负载将HTTP发布到Heroku。

与出站消息一样,您可以使用任何开源Web或REST技术构建Heroku应用程序。使用JavaScript,Node.js和Express,端点可以定义为:

 app.post("/new_contact", function(req, res) {
  // do something with req.body
  res.status(201).end();
}); 

在请求处理程序中,req.body是从Apex触发器发送的反序列化JSON数据。

使用Apex触发器,您可以使用某种形式的预共享密钥来验证请求,从而避免潜在的恶意请求。您还可以让有效负载包含会话ID,以便让Heroku应用程序将REST API请求返回给Salesforce以获取或更新数据。

在Heroku中使用Salesforce REST API

学习目标

完成本单元后,您将能够:

  • 了解使用Salesforce REST API的用例。
  • 了解不同类型的身份验证。
  • 了解如何在Heroku上使用Salesforce REST API和应用程序。

Salesforce REST API和Heroku

Salesforce REST API提供了一种通过简单的HTTP + JSON请求与Salesforce集成的简便方法。有一些REST API可以访问Salesforce上的几乎所有内容,因此您的自定义应用程序可以对Salesforce中的数据,流程和元数据执行任何操作。REST API使用OAuth进行身份验证,这是处理REST身份验证的标准方法。

该图显示了通过REST接口将Salesforce中的对象与Heroku之间的连接

虽然REST API可以直接使用,但API周围有许多包装器库,使它们易于在 Node.js, Python, Ruby,Java等中使用。包装器库处理低级任务,例如身份验证和请求和响应处理。因此,而不是手动构建HTTP请求(以Node.js为例):

var query = 'SELECT name Account'; var url = 'https://na1.salesforce.com/services/data/v20.0/query/?q=' + encodeURIComponent(query); request.get(url, { 'auth': { 'bearer': 'bearerToken' } }); 

您可以使用Node.js 的开源 nforce库,只需执行以下操作:

org.query({ query: 'SELECT name FROM Account' }); 

最终,nforce库在幕后做了同样的事情,但是库使API更容易使用。

您可以在Salesforce REST API之上构建应用程序到应用程序集成和自定义用户界面。最大的区别在于如何处理身份验证。通过app-to-app集成,应用程序可以识别单个集成用户,并且所有对REST API的调用都是以该用户身份完成的。使用自定义用户界面,用户不会直接使用自定义应用进行身份验证。相反,用户会遍历OAuth流程以授权自定义应用代表其进行API调用。REST API的每个请求都代表使用自定义用户界面的指定用户完成。

应用程序到应用程序集成的一个用例是转换,整理,然后复制或代理另一个系统的数据。例如,在Heroku上运行的面向客户的订单管理应用程序需要从Salesforce获取客户信息。此设置可以使用单个集成用户从Salesforce获取所有必需的信息。

但是,如果订单管理应用程序用于通过Salesforce登录的后台,则该应用程序是一个自定义用户界面,它使用OAuth允许订单管理应用程序代表指定用户发出API请求。在这种情况下,了解哪个命名用户正在进行每个REST调用对于安全性和审计非常重要。

使用Heroku,可以轻松部署任何类型的应用程序并利用OAuth和Salesforce REST API。

您可以直接进入 Salesforce REST API文档,以便在方便时学习低级API。要快速入门,包括部署到Heroku和使用REST API的基本应用程序,请查看 Quick Force Node(JavaScript)或 Quick Force Java。

使用OAuth进行REST API身份验证

身份验证是使用REST API的一个关键方面,因为对API的每个请求都必须包含身份验证令牌或密钥。无论是使用应用程序到应用程序集成还是自定义用户界面,您的应用程序都需要Salesforce中的 连接应用程序,以允许Salesforce识别发出请求的应用程序,并使组织管理员能够管理对API的访问。

单个用户

通过应用程序到应用程序的集成,应用程序需要知道单个集成用户的凭据。然后可以调用REST API以使用凭据登录,凭据返回身份验证令牌。

命名用户

构建自定义用户界面时,应用程序永远不会收到实际凭据。相反,OAuth流程为应用程序提供了获取授权令牌的代码。由于用户手动授权应用程序访问Salesforce,因此流程遵循以下步骤。

  1. 用户尝试访问需要身份验证的页面。
  2. Heroku上的应用程序将用户重定向到Salesforce OAuth页面。
  3. 如果先前未授权该应用程序,则会提示用户。
将显示“允许访问”对话框的屏幕截图,询问Workbench是否已获得授权
  1. 授权后,Salesforce会使用代码将用户重定向回应用程序。
  2. 应用程序使用代码检索访问令牌和刷新令牌。
  3. 应用程序使用访问令牌对Salesforce进行REST API调用。

通常,访问和刷新令牌被加密并以某种形式的会话状态或数据库存储,以便用户不必继续通过每个请求的授权流程。

请记住,这些令牌是敏感的,必须以极端的安全勤勉处理!

将Salesforce和Heroku与Salesforce Connect集成

学习目标

完成本单元后,您将能够:

  • 了解Salesforce Connect架构。
  • 开发Salesforce Connect自定义适配器。
  • 了解何时以及如何使用Salesforce Connect与Heroku。

Salesforce与Heroku连接

Salesforce Connect是一种将外部数据代理到Salesforce而不将其复制到数据库的简便方法。通过这种方式,您可以将数据提取到Salesforce中,并将该数据与Salesforce中的其他对象相关联。Salesforce Connect可与各种数据源配合使用。

  • 任何OData 2.0数据源都可以通过Salesforce Connect引入Salesforce。
  • Heroku Connect可以将Heroku Postgres数据库公开给Salesforce Connect。
  • 任何Heroku应用程序都可以提供可与Salesforce Connect一起使用的端点。
该图描述了外部对象如何用于外部连接通过SAP,Oracle,Workday或Heroku提供的外部数据

在这个单元中,我们专注于第三种选择。如果您想了解更多有关其他信息的信息,您可以学习如何将Heroku Postgres数据库与Salesforce Connect与 Heroku外部对象一起使用,或者深入了解 Salesforce Connect Trailhead模块。

Heroku应用程序可以为Web和移动应用程序以及REST服务提供Web端点。由于可以使用Apex在Salesforce中轻松使用REST服务,因此可以轻松为Salesforce Connect编写自定义适配器,以代理REST服务提供的数据。

Salesforce Connect自定义适配器的主要用例是外部系统(如Heroku应用程序!)提供的标准Salesforce UI中有用的数据。例如,假设您在Heroku上有一个面向客户的房地产应用程序,它将REST数据公开给JavaScript和移动UI。将一些房地产数据带入Salesforce UI会很棒,因为一些后台业务流程和报告可以使用它。您需要做的就是从Heroku上运行的REST服务编写适配器到Salesforce Connect结构。

使用Salesforce Connect而不是传统ETL方法的主要好处是数据始终保持同步,因为它几乎实时检索而不是复制。

开始使用Salesforce Connect和Heroku

要开始了解Salesforce Connect自定义适配器,请查看Salesforce博客文章中的 渲染GitHub JSON数据。如果您不熟悉在Heroku上运行REST服务,请选择适合您需求和专业知识的编程语言和框架。如果您不知道从哪里开始,那么一个很棒的地方是带有REST服务的 Ionic 2示例应用程序,只需单击一下即可在Heroku上部署。在部署之后,您有一个REST端点用于房地产数据,如下所示:https: //ionic2-realty-rest-demo.herokuapp.com/properties/

随着Heroku上的REST端点准备好被消费,现在只需编写一些Apex代码来桥接Salesforce Connect和服务。对于示例房地产REST服务,我们可以使用一个简单的Apex适配器来扩展DataSource.Connection类,并使用以下基本结构实现sync(),query()和search()方法:

  global class RealEstateConnection extends DataSource.Connection {
      override global List<DataSource.TableResult> search(DataSource.SearchContext searchContext) { }
      override global List<DataSource.Table> sync() { }
      override global DataSource.TableResult query(DataSource.QueryContext queryContext) { }
    }
 

您可以使用自定义搜索功能实现search()方法,也可以使用此搜索开箱即用的实用程序:

override global List<DataSource.TableResult> search(DataSource.SearchContext searchContext) {
    return DataSource.SearchUtils.searchByName(searchContext, this);
  }

sync()方法告诉Salesforce有关外部对象的数据结构。对于此示例,我们只需添加一个包含几列的表。ExternalId,DisplayUrl和Name字段是必需的。

override global List<DataSource.Table> sync() {
  List<DataSource.Column> columns = new List<DataSource.Column>();
  columns.add(DataSource.Column.text('ExternalId', 255));
  columns.add(DataSource.Column.url('DisplayUrl'));
  columns.add(DataSource.Column.text('Name', 128));
  columns.add(DataSource.Column.text('city', 128));
  columns.add(DataSource.Column.text('price', 128));
  List<DataSource.Table> tables = new List<DataSource.Table>();
  tables.add(DataSource.Table.get('Properties', 'Name', columns));
  return tables;
}

当Salesforce中的用户访问外部对象的记录列表时,query()方法将数据提取并解析为sync()方法中定义的数据结构。以下是房地产REST服务的query()方法示例。

override global DataSource.TableResult query(DataSource.QueryContext queryContext) {
   List<Map<String, Object>> properties = DataSource.QueryUtils.process(queryContext, getProperties());
   DataSource.TableResult tableResult = DataSource.TableResult.get(queryContext, properties);
   return tableResult;
 }
 public List<Map<String, Object>> getProperties() {
   Http httpProtocol = new Http();
   HttpRequest request = new HttpRequest();
   String url = 'https://ionic2-realty-rest-demo.herokuapp.com/properties/';
   request.setEndPoint(url);
   request.setMethod('GET');
   HttpResponse response = httpProtocol.send(request);
   List<Map<String, Object>> properties = new List<Map<String, Object>>();
   for (Object item : (List<Object>)JSON.deserializeUntyped(response.getBody())) {
     Map<String, Object> property = (Map<String, Object>)item;
     property.put('ExternalId', property.get('id'));
     property.put('DisplayUrl', 'https://ionic2-realty-rest-demo.herokuapp.com/');
     property.put('Name', property.get('title'));
     properties.add(property);
   }
   return properties;
 }

getProperties()方法向Heroku上的房地产REST API发出请求。query()方法将数据转换为外部对象的数据结构。

当 其他安装步骤已经完成,房地产数据是在Salesforce中可用。

由于Salesforce Connect代理数据,因此每次用户请求数据时,Salesforce Connect都会使用适配器来获取数据。现在数据看起来和行为就像Salesforce中的任何其他数据一样,除了它来自Heroku上的应用程序!

Salesforce Connect高级功能

Salesforce Connect自定义适配器可以轻松地将数据从Heroku中提取到Salesforce中。几乎太容易了。您甚至可以定义不同数据集之间的关系。在DataSource.Column文档中了解有关外部对象引用的更多信息 。

专业提示:这个简单的示例使用匿名数据,但在大多数情况下,使用某种形式的身份验证与外部数据存储区。在Apex文档中了解有关外部数据源身份验证的详细信息 。

Salesforce Connect自定义适配器还可以处理 数据分页,这对于REST服务公开大型数据集至关重要。

将Salesforce和Heroku与Heroku Connect集成

学习目标

完成本单元后,您将能够:

  • 了解Heroku Connect架构。
  • 了解如何将Salesforce和Heroku与Heroku Connect集成。

Heroku Connect

您可以使用 Heroku Connect进行数据复制和数据代理。Heroku Connect与令人敬畏的Heroku Postgres数据库结合使用。您可以将数据复制到Salesforce或从Salesforce复制到此SQL数据库,或者您可以使用Salesforce Connect将其从Heroku Postgres数据库代理到Salesforce,我们将在下一个单元中介绍它。

图表显示箭头首先从Salesforce转到中间组件然后再转到Heroku,然后在插入联系人后返回Salesforce

使用Heroku Connect进行数据复制可以是一种方式,从Salesforce到Heroku Postgres,或双向。从Heroku Postgres到Salesforce的数据复制可以配置为以非常低的延迟执行,尽管不是实时的。您可以选择通过指定的时间间隔控制延迟,也可以选择轮询以响应Salesforce Streaming API的更改。

由于Heroku Connect使用Heroku Postgres,因此复制数据可以使用所有 标准数据库功能。例如, Dataclips(一个Heroku插件)提供了一种简单的方法来查询数据并通过网络或CSV等格式共享查询。

Heroku Connect的一个常见用途是使用并可能更改存储在Salesforce中的数据的企业对消费者应用程序。假设您有一个存储在Salesforce中的充气独角兽派对帽的产品目录,并希望公共网站显示该目录。通过将产品数据复制到Heroku Postgres数据库,Heroku Connect可以轻松实现,以便公共站点可以轻松访问数据。公共站点可以使用各种开源技术构建,如Node.js,Java或PHP。Heroku Connect与数据的接口只是标准的SQL。

这个只读用例很常见,但更新回Salesforce也很容易。例如,如果公共产品网站允许用户“喜欢”某个产品,那么该信息可以存储在Salesforce中,以协助后台销售和营销工作。

Heroku Connect入门

开始使用Heroku Connect的最简单方法是使用 Quick Start:Heroku Connect Trailhead项目。您还可以深入了解详细的 Heroku Connect文档,以便在周六晚上免费学习更多信息。实际上,任何一个晚上都可以。

Heroku Connect是一个 Heroku插件,因此可以通过Heroku仪表板轻松配置和配置 。要配置Heroku Connect,您需要使用OAuth对Salesforce实例进行身份验证,并允许Heroku Connect代表您进行API调用。Heroku Connect使用此API连接来同步Salesforce和Heroku Postgres数据库之间的数据。

为Heroku应用程序配置Heroku Connect后,您可以配置同步的数据和数据。在配置Salesforce到数据库映射之后,您的应用程序可以建立与Heroku Postgres数据库的连接,并使用标准SQL来访问数据。

Heroku Connect应用程序架构

使用Heroku Connect进行数据复制时,Salesforce拥有数据模式。要向映射添加字段,请在Salesforce中自定义对象,然后配置Heroku Connect映射。您可以映射多个对象。您还可以映射对象之间的关系,使您能够在Salesforce中创建与标准对象相关的自定义对象。例如,Product Likes对象可以整理联系人和产品。只有Heroku应用程序会写入此对象。然后,Salesforce中的后台用户可以访问报告和活动的数据。

通常,处理Heroku应用程序的开发人员拥有一个镜像Heroku环境的本地开发环境。您可以在本地Postgres数据库中轻松创建Heroku Connect架构,以自包含开发环境。Heroku上的集成测试应用程序通常连接到Salesforce实例,以便可以在将Heroku Connect同步数据库移至生产之前对其进行测试。

连接到与Heroku Connect同步到Salesforce的Heroku Postgres数据库与连接到任何其他Postgres数据库没什么不同。这只是一个数据库!

由于数据已从Salesforce复制,因此您可以针对Postgres多次运行查询,但只有一次从Salesforce读取(直到数据更改或轮询间隔检查更改)。因为Heroku Postgres非常接近Heroku应用程序,所以读取速度极快且低延迟。

插入和更新都只是标准的SQL语句,并根据映射的设置和计划与Salesforce同步。

将Salesforce和Heroku与Heroku Connect集成

学习目标

完成本单元后,您将能够:

  • 了解Heroku Connect架构。
  • 了解如何将Salesforce和Heroku与Heroku Connect集成。

Heroku Connect

您可以使用 Heroku Connect进行数据复制和数据代理。Heroku Connect与令人敬畏的Heroku Postgres数据库结合使用。您可以将数据复制到Salesforce或从Salesforce复制到此SQL数据库,或者您可以使用Salesforce Connect将其从Heroku Postgres数据库代理到Salesforce,我们将在下一个单元中介绍它。

图表显示箭头首先从Salesforce转到中间组件然后再转到Heroku,然后在插入联系人后返回Salesforce

使用Heroku Connect进行数据复制可以是一种方式,从Salesforce到Heroku Postgres,或双向。从Heroku Postgres到Salesforce的数据复制可以配置为以非常低的延迟执行,尽管不是实时的。您可以选择通过指定的时间间隔控制延迟,也可以选择轮询以响应Salesforce Streaming API的更改。

由于Heroku Connect使用Heroku Postgres,因此复制数据可以使用所有 标准数据库功能。例如, Dataclips(一个Heroku插件)提供了一种简单的方法来查询数据并通过网络或CSV等格式共享查询。

Heroku Connect的一个常见用途是使用并可能更改存储在Salesforce中的数据的企业对消费者应用程序。假设您有一个存储在Salesforce中的充气独角兽派对帽的产品目录,并希望公共网站显示该目录。通过将产品数据复制到Heroku Postgres数据库,Heroku Connect可以轻松实现,以便公共站点可以轻松访问数据。公共站点可以使用各种开源技术构建,如Node.js,Java或PHP。Heroku Connect与数据的接口只是标准的SQL。

这个只读用例很常见,但更新回Salesforce也很容易。例如,如果公共产品网站允许用户“喜欢”某个产品,那么该信息可以存储在Salesforce中,以协助后台销售和营销工作。

Heroku Connect入门

开始使用Heroku Connect的最简单方法是使用 Quick Start:Heroku Connect Trailhead项目。您还可以深入了解详细的 Heroku Connect文档,以便在周六晚上免费学习更多信息。实际上,任何一个晚上都可以。

Heroku Connect是一个 Heroku插件,因此可以通过Heroku仪表板轻松配置和配置 。要配置Heroku Connect,您需要使用OAuth对Salesforce实例进行身份验证,并允许Heroku Connect代表您进行API调用。Heroku Connect使用此API连接来同步Salesforce和Heroku Postgres数据库之间的数据。

为Heroku应用程序配置Heroku Connect后,您可以配置同步的数据和数据。在配置Salesforce到数据库映射之后,您的应用程序可以建立与Heroku Postgres数据库的连接,并使用标准SQL来访问数据。

Heroku Connect应用程序架构

使用Heroku Connect进行数据复制时,Salesforce拥有数据模式。要向映射添加字段,请在Salesforce中自定义对象,然后配置Heroku Connect映射。您可以映射多个对象。您还可以映射对象之间的关系,使您能够在Salesforce中创建与标准对象相关的自定义对象。例如,Product Likes对象可以整理联系人和产品。只有Heroku应用程序会写入此对象。然后,Salesforce中的后台用户可以访问报告和活动的数据。

通常,处理Heroku应用程序的开发人员拥有一个镜像Heroku环境的本地开发环境。您可以在本地Postgres数据库中轻松创建Heroku Connect架构,以自包含开发环境。Heroku上的集成测试应用程序通常连接到Salesforce实例,以便可以在将Heroku Connect同步数据库移至生产之前对其进行测试。

连接到与Heroku Connect同步到Salesforce的Heroku Postgres数据库与连接到任何其他Postgres数据库没什么不同。这只是一个数据库!

由于数据已从Salesforce复制,因此您可以针对Postgres多次运行查询,但只有一次从Salesforce读取(直到数据更改或轮询间隔检查更改)。因为Heroku Postgres非常接近Heroku应用程序,所以读取速度极快且低延迟。

插入和更新都只是标准的SQL语句,并根据映射的设置和计划与Salesforce同步。

Salesforce和Heroku集成入门

学习目标

完成本单元后,您将能够:

  • 了解集成Salesforce和Heroku的不同原因。
  • 描述集成Salesforce和Heroku的方法。

作为Salesforce开发人员,您知道Heroku提供了一个运行与Salesforce集成的应用程序的好地方,可用于各种用例。但究竟是什么原因以及最佳的整合方法是什么?继续阅读,您的问题很快就会得到解答。

集成Salesforce和Heroku的原因

现代企业系统由许多不同的部分组成,具有不同类型的用户的不同接口。这些接口通常将来自各种数据源的数据汇集在一起​​。微服务架构已经成为一种将系统各部分分离为更易于维护,可独立部署的服务的方式,以提供将不同系统组合在一起的端点。Heroku是运行应用程序和微服务的好地方,您可以通过各种集成方法与Salesforce一起使用它们。

将Heroku上的应用程序与Salesforce集成的四个常见原因是:

  • 数据复制
  • 数据代理
  • 自定义用户界面
  • 外部流程

我们稍后会在模块中更深入地研究每一个。

通过数据复制集成

数据复制是在Salesforce和另一个系统之间复制或同步数据。您可以使用数据复制进行数据仓库,以启用跨数据源报告和分析。您还可以使用它来处理需要Salesforce数据或将数据提供给Salesforce的旧系统。Heroku和Salesforce最常见的用例是为使用开源技术构建的面向客户的应用程序提供高吞吐量,低延迟的界面。

例如,假设您正在销售充气式独角兽派对帽。Salesforce是您的产品信息记录系统,例如定价和库存,使用Node.js,Rails,Java等构建的公共网站。该网站使用该数据显示可用性并提供订购功能。通过在Heroku上运行公共Web应用程序,将产品信息复制到Heroku上的数据存储区是有意义的,这样它就可以处理大量低延迟的请求。例如,如果公共站点的用户可以“喜欢”某个产品,则可以使用数据复制将喜欢的数量传播回营销团队的Salesforce。

通过数据代理集成

数据代理聚合不同的数据存储,但与数据复制不同,不会复制数据。数据只能按需读取。这种方法使数据科学,商业智能,报告和仪表板工具能够跨多个数据存储整理数据,而无需担心存储和过时等数据同步问题。您可以通过数据代理集成旧系统和外部系统,以向Salesforce提供数据,或者Salesforce可以将其数据提供给其他外部系统。

如果Salesforce用户需要运行将Salesforce中的产品数据与来自外部系统的仓库数据相关联的库存报告,则数据代理可以提供该信息,而无需使用提取转换和加载(ETL)等较慢的方法。运行报表时,Salesforce从外部系统获取必要的数据,而不会存储数据。同样也适用于相反的方向 – 在Heroku上运行的应用程序是Salesforce到另一个提供安全和转换层的系统的数据代理。我们很快就会谈到这一点。

通过自定义用户界面集成

您可以使用各种技术(例如Visualforce和Lightning Components)轻松地为Salesforce创建自定义用户界面。当使用Java,Node.js,PHP等开源技术构建接口时,它们可以在Heroku上运行并集成到Salesforce UI中或仅与Salesforce数据集成。其他时候,旧系统或外部系统提供需要在Salesforce UI中显示的用户界面。

例如,使用Salesforce for CRM的公司收购了另一家公司,该公司使用Java内置的自定义系统。集成这些系统的第一种简单方法就是在Heroku上运行Java系统并在Salesforce中进行渲染。在Heroku上运行Java系统可以减轻扩展和操作负担,同时标准化自定义系统的部署体系结构。在Heroku上运行并与Salesforce数据集成的独立用户界面可以为Salesforce以及面向客户的Web和移动应用程序提供后台扩展。自定义用户界面可能具有库,功能或开发人员技能组,这些技能组决定了在本机Force.com选项上使用Heroku和开源技术。

通过外部流程整合

外部流程可以卸载批处理或工作流,并触发事件处理到Heroku上的应用程序。根据需要完成的工作类型和所涉及的工作量,此方法可能会有所帮助。数据科学,机器学习,图像和视频处理以及与传统或外部系统的集成可能是将外部进程卸载到Heroku的原因。

例如,假设您的房地产公司为其列出的待售房屋上传照片。这些照片非常庞大,因此您需要一种方法来调整它们以减少加载时间和存储成本。您可以轻松地将此作业卸载到Heroku上的外部进程。每次将照片上传到Salesforce时,都会将其发送到Heroku上的应用程序进行处理,并将已调整大小的图像保存回Salesforce。Heroku上处理外部进程的应用程序只能负责系统的这一部分。在这种情况下,应用程序可能被视为可以单独部署的微服务,而不需要任何其他系统依赖性。

集成方法概述

所以现在你知道数据复制,数据代理,自定义用户界面和外部进程都是Heroku和Salesforce结合的重要原因。但你如何真正做到这一点?有许多方法可以实现这些类型的集成,包括:

  • Heroku Connect
  • Salesforce Connect
  • Salesforce REST API
  • 标注
  • 帆布

我们很快就会深入研究每一个,但这里有一个快速概述,可以帮助您入门。

Heroku Connect

Heroku Connect为Salesforce提供数据复制和数据代理。数据复制在Salesforce和Heroku Postgres数据库之间同步数据。根据配置方式,同步可以是单向或双向。要了解Heroku Connect,请查看 快速入门:Heroku Connect Trailhead项目。Heroku Connect还使用Heroku外部对象通过OData协议为Salesforce提供数据代理 。Heroku外部对象为Heroku Connect维护连接的Heroku Postgres数据库提供了一个OData包装器。此功能允许其他Web服务使用包装器生成的RESTful端点从指定的Heroku Postgres数据库中检索数据。

图表显示箭头首先从Salesforce转到中间组件然后再转到Heroku,然后在插入联系人后返回Salesforce

使用Heroku Connect进行数据复制的最大好处之一是,Heroku上的应用程序可以快速轻松地访问Salesforce数据的子集。作为应用程序开发人员,您只需像往常一样为查询编写标准SQL。Heroku Connect和Postgres提供对Salesforce数据的低延迟和高吞吐量访问。

Salesforce Connect

您可以使用Salesforce Connect(以前称为Lightning Connect)作为数据代理,根据需要将OData或其他数据源提取到Salesforce中。没有数据复制到Salesforce数据库。您可以运行在Heroku上公开OData 2.0或由外部系统提供的端点。如前所述,Heroku Connect可以将Heroku Postgres数据库公开为OData供Salesforce Connect使用。或者, Salesforce Connect自定义适配器允许Salesforce代理Apex可以与之通信的任何数据源,包括REST与XML或JSON和SOAP。

该图描述了外部对象如何用于外部连接通过SAP,Oracle,Workday或Heroku提供的外部数据

Salesforce Connect的主要优点是它将外部数据带入Salesforce UI,并使其看起来好像数据驻留在Salesforce中,尽管它只是根据需要从外部数据源代理。通过此过程,可以轻松为Salesforce用户整理不同的数据源。

Salesforce REST API

Salesforce REST API通过简单的JSON格式的HTTP请求提供Heroku访问Salesforce数据的应用程序。您可以将此集成用于数据代理和自定义用户界面。使用在Heroku上运行的开源技术构建的应用程序可以使用OAuth在自定义用户界面中授权用户,然后代表他们与Salesforce数据进行交互。没有用户界面的集成用例可以在Salesforce和外部系统之间代理数据。

该图显示了通过REST接口将Salesforce中的对象与Heroku之间的连接

Callouts

您可以使用Salesforce中的Callouts来调用Heroku上的外部进程。您在Apex中编写Callouts或使用工作流出站消息使Salesforce上的事件触发Heroku上的进程执行。该过程通常使用前面提到的集成方法之一将流程结果返回到Salesforce。

该图显示了Salesforce和从出站消息触发或发送的数据事件的框。 箭头来自框并指向包含Heroku托管的所有应用程序的另一个框

Canvas

Canvas提供了一种将外部用户界面加载到Salesforce中的方法,该方法可以通过JavaScript API与Salesforce数据进行交互。您可以在Heroku上运行外部UI,并使用开源Web技术构建它。数据请求Canvas应用程序在Salesforce用户的上下文中发生。

该图表显示Heroku应用程序可以通过Canvas Javascript桥与Salesforce交互

比较整合方法

每个Salesforce和Heroku集成方法都有一个位置,取决于开发人员技能组和手头的用例。以下是集成选项之间的一些基本差异。

Heroku ConnectSalesforce ConnectREST APICallouts Canvas
安全模型集成用户各种(包括集成用户和命名主体)OAuth的应用用户应用用户
范围排除在限制之外最大数量的源,对象和字段API限制API限制请求限制
SObject功能所有标准功能只读
无公式和汇总汇总字段
无触发,工作流程,审批流程
无验证规则
字段历史记录跟踪
无备注,附件
所有标准功能N / A所有标准功能
数据战略实时BiDi同步或ODataOData或代理阅读和复制有效载荷Canvas API
终端用户匿名,客户Salesforce用户任何没有Salesforce用户
协议SQLApex HTTPHTTPHTTP

以下是集成的一些一般性建议:

  • 要在Salesforce和Heroku之间复制数据,请使用Heroku Connect。
  • 要将Heroku Postgres数据库公开给Salesforce,请使用Heroku Connect外部对象。
  • 要将OData,SOAP,XML或JSON数据源代理到Salesforce,请使用Salesforce Connect。
  • 如果Heroku Connect不符合要求,就像在Heroku上有用户通过Salesforce登录的自定义UI时,请使用Salesforce REST API。
  • 要卸载或扩展Salesforce数据事件的处理,请使用Salesforce到Heroku的标注。
  • 要将Heroku(或其他外部Web应用程序)中的自定义UI嵌入到Salesforce中,请使用Canvas。

画布开发(9)Salesforce App中的Canvas

学习目标

完成本单元后,您将能够了解到:

  • 设置Canvas应用程序位置并将其添加到导航菜单
  • Salesforce App上下文注意事项
  • Salesforce App Access注意事项
  • Salesforce App自定义图标
  • 适用于Canvas应用程序的Salesforce App导航方法

Canvas使您可以在Salesforce应用程序中公开您的画布应用程序。 Salesforce应用程序是随时随地的Salesforce。这款企业级移动应用程序可让您实时访问在办公室中看到的相同信息,但它可以帮助您在离开办公桌时完成工作。就像在完整的Salesforce站点中一样,用户可以访问发布者和Chatter订阅源项,包括Canvas应用。

开发人员可以在Salesforce应用中使用画布应用来:

  • 将画布应用程序公开为动作。图标表示画布应用程序。您可以使用默认拼图图标或上传相关操作的自定义图标。
  • 从Salesforce中的画布应用程序或Chatter API发布到Feed。
  • 在Salesforce应用程序内的Feed项目中显示画布应用程序。图标表示画布应用程序。您可以使用默认拼图图标或在Feed项中提供缩略图URL来显示自定义图标。
  • 在导航菜单中添加画布应用程序作为选项。图标表示画布应用程序。您可以使用默认拼图图标或在画布应用程序的连接应用程序设置中提供自定义图标URL。

注意:Canvas应用程序不会出现在Salesforce for Android的应用程序导航菜单中。要在导航菜单中查看画布应用程序,请登录Salesforce移动Web。

例如,您可能拥有仓库员工用于处理移动设备上的订单的画布应用程序。您可以创建一个从设备图标访问应用程序的操作,允许员工提取客户订单列表。处理订单后,应用程序会在Salesforce中设置订单状态,并将Feed项目发布到关联的客户帐户。

用户仍然可以在台式机上的Salesforce中访问您的画布应用程序。 Salesforce提供的移动设备的附加功能不会影响或限制现有功能。

设置Canvas应用程序位置并将其添加到导航菜单

要添加要在Salesforce应用程序导航菜单中显示的画布应用程序,您必须设置位置并将其添加到移动导航。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“应用”,然后选择“Apps”。
  2. 在“已连接的应用程序”相关列表中,单击导航窗格中要提供的应用程序,然后单击“Edit”。
  3. 在“Canvas应用程序设置”部分中,选择“Canvas”。
  4. 在“位置”字段中,选择“Mobile Nav”,然后单击“Add”。
  5. 单击“Save”。
  6. 要使画布应用程序显示在导航菜单中,您必须将其添加到移动导航中。从设置中,输入导航在“快速查找”框中,选择“Salesforce Navigation”。
  7. 从可用的菜单项中,选择您的应用,然后单击“Add”。
  8. 单击“Save”。

Salesforce App上下文注意事项

在Salesforce应用程序内显示画布应用程序时,请记住这些注意事项。

在Feed或发布者中显示画布应用程序时,您收到的画布上下文(来自签名请求或来自getContext调用)包含特定于Salesforce应用程序发布者的信息。

  • 您可以通过查看环境部分中的displayLocation值来验证您是在Feed还是发布者上。对于发布者,displayLocation设置为Publisher。对于Feed,displayLocation设置为ChatterFeed。
  • 创建Canvas订阅源项时,可以将JSON字符串指定为参数的值。发送上下文时,feed项的参数字段中的任何值都将在上下文的environment部分的参数中发送。
  • 与任何画布应用程序一样,上下文包含有关应用程序维度的信息。由于Salesforce是专为移动设备设计的,因此我们为其提供的尺寸与我们为完整Salesforce网站提供的尺寸不同。
  • 要创建单指触摸滚动体验:
    1. 确保最外面的div元素包含以下属性。
      • 最小高度:250px;
      • 溢出:滚动;
      • 宽度:100%;
      • -webkit-overflow-scrolling:touch;
      • -webkit-transform:translated(0%,0px,0px);
    2. 将height属性设置为签名请求中提供的clientHeight值。例如:
      // Where sr is a parsed signed request object.
      var h = parseInt(sr.context.environment.dimensions.clientHeight, 10);
      Sfdc.canvas.byId(‘divElementId’).style.height = h;
    3. clientHeight值可能非常小,特别是在手机的横向模式下,用户可能无法看到任何内容。将min-height设置为所需的高度(以像素为单位),以确保良好的用户体验。
    4. 在导航菜单中,默认拼图图标大小为60像素乘60像素。

Salesforce App Access注意事项

修改Salesforce应用程序中显示的画布应用程序时,请记住这些注意事项。

必要时,Salesforce应用程序布局与您习惯使用的完整Salesforce站点布局不同。在创建用于Salesforce应用程序的画布应用程序时,请记住以下内容。

  • 由于画布应用程序旨在在Salesforce中显示第三方应用程序,因此设备必须能够访问画布应用程序URL。如果您的应用只能在防火墙后面访问,那么移动设备也必须位于防火墙后面。如果用户无权访问画布URL,则会收到错误 – 可能是404或500错误。
  • 当您将画布应用程序作为操作访问时,如果画布应用程序使用“您在做什么”标题,则标题将固定在页面顶部,并且画布应用程序滚动区域将位于标题文本框下方。
  • Feed中的画布应用程序链接和说明可能显示的字符数少于完整Salesforce站点中显示的字符数。
  • 根据您使用的设备,如果旋转设备,进纸屏幕可能会发生变化。如果可能,您的画布应用应支持旋转。使用orientation事件处理设备方向的更改。
  • Salesforce应用程序和完整Salesforce站点中使用的高度不同。使用签名请求中的Dimensions对象在发布者中正确呈现您的操作。
  • 在操作菜单中,可能会截断长动作标签。
  • Feed布局与完整Salesforce站点的布局不同。而不是在Feed中打开应用程序,将打开一个页面,在整个屏幕上显示画布应用程序。要返回Salesforce应用,请点按。
  • 当您查看操作栏或Feed时,将显示画布应用程序的默认Canvas拼图图标。您可以使用您提供的图像覆盖此默认操作图标。
  • 当画布应用程序在导航菜单中显示为选项时,将使用默认的Canvas拼图图标。您可以在画布应用程序的连接应用程序设置中自定义图标。
  • 当用户脱机访问Salesforce时,Canvas应用程序不可用。

Salesforce应用程序自定义图标

自定义图标有助于区分Salesforce应用中的应用。如果您没有自定义应用程序的图标,您将获得默认的拼图图标。

您可以自定义Salesforce导航菜单中使用的图标。您可以在画布应用程序的连接应用程序设置的“基本信息”部分的“图标URL”条目中设置此图标。在“设置”中,在“快速查找”框中输入“应用”,然后选择“应用”并单击“编辑”以连接应用。图标URL必须是指向图标图像文件的安全HTTPS URL。图像文件必须是GIF,JPG或PNG文件格式。对于Salesforce导航菜单,图标不能大于60像素高,60像素宽。

Salesforce导航菜单中使用的自定义图标也用于Chatter选项卡和Canvas App Previewer。如果您的画布应用程序将显示在导航菜单中,我们建议您使用60×60像素大小的图标,让Salesforce自动将图标调整为Chatter选项卡和Canvas App Previewer所需的较小尺寸。

您还可以自定义画布应用程序的Salesforce操作栏和操作菜单中使用的图标。操作栏使用为访问画布应用程序的操作设置的自定义图标,而不是与连接的应用程序关联的自定义图标。您可以通过上载自定义图标的静态资源文件然后使用此静态资源作为全局操作的图标来设置操作图标。静态资源图标文件应为PNG格式,大小为120像素高,120像素宽。有关自定义操作图标的更多指南,请参阅“Salesforce App开发人员指南”中的“自定义图标指南和最佳实践”。

用于Canvas应用程序的Salesforce App导航方法

Canvas框架包含可用于在canvas应用程序和Salesforce应用程序之间平滑集成导航的方法,而无需使用Visualforce。

以前,绕过包含画布应用程序的iframe的导航限制的唯一方法是使用Visualforce页面。这些Canvas方法提供了一种更简单的替代方法,用于控制Salesforce应用程序中的画布应用程序的导航。

例如,您的画布应用程序代码可以调用Salesforce“创建记录”逻辑以导航到“Create Account”按钮所在的页面。单击该按钮会触发导航方法以转到创建页面,该页面位于画布应用程序之外。

Canvas框架中的这些方法是驻留在JavaScript库中的事件。从画布代码调用其中一种导航方法时,会向Salesforce发送一个事件,该事件将读取有效内容并将用户定向到指定的目标。

从画布应用程序调用方法与从Visualforce页面调用函数略有不同,因为这些方法通过Canvas跨域API代理到Salesforce容器。

将导航方法引用为具有名称和有效负载的事件变量。例如:

var event = {name:”s1.createRecord”, payload: {entityName: “Account”, recordTypeId: “00h300000001234”}};

下表显示了Salesforce中导航方法的名称,有效负载和用途。

FunctionDescription
back([refresh])导航到sforce.one历史记录中保存的先前状态。它相当于单击浏览器的“后退”按钮。
刷新是可选的。默认情况下,页面不刷新。如果可能,传递true以刷新页面。
navigateToSObject(recordId [, view])导航到由recordId指定的sObject记录。此记录“主页”有多个视图,Salesforce应用程序中的视图可用作用户可以在其间滑动的幻灯片。
view是可选的,默认为detail。 view指定记录主页中最初显示的幻灯片。
注意:不支持与ContentNote SObject对应的记录ID。可能的值如下。
•detail:记录详细信息幻灯片
•chatter:Chatter幻灯片
•related:相关幻灯片的视图
navigateToURL(url[, isredirect])导航到指定的URL。
支持相对和绝对URL。相对URL相对于Lightning域,并保留导航历史记录。外部URL – 即Lightning域外的URL – 在单独的浏览器窗口中打开。
注意:根据用户的设备平台,设备设置,Salesforce版本以及要打开的外部URL的身份验证要求,单独的浏览器窗口可能需要身份验证或重新身份验证。
使用相对网址导航到应用内的不同屏幕。使用外部URL允许用户访问其他站点或应用程序,他们可以在其中执行不需要在应用程序中保留的操作。要返回到您的应用,必须在用户完成其他应用时关闭由外部URL打开的单独窗口。新窗口与您的应用程序具有单独的历史记录,并且在关闭窗口时将丢弃此历史记录。这也意味着用户无法单击“后退”按钮返回到您的应用程序;用户必须关闭新窗口。
mailto:, tel:, geo:, 和其他URL方案支持启动外部应用程序并尝试“做正确的事情。”但是,支持因移动平台和设备而异。 mailto:和tel:是可靠的,但我们建议您测试一系列预期设备上的任何其他URL。
isredirect 是可选的,默认为false。将其设置为true以指示新URL应替换导航历史记录中的当前URL。
注意:在 <apex:commandButton>或任何 <button type=”submit”> or<input type=”submit”>的onClick处理程序中使用navigateToURL时要小心. 即使isredirect = true,命令按钮的默认单击操作也是表单帖子。 在此方案中,命令按钮执行表单发布和navigateToURL操作,要求用户单击后退按钮两次以导航到上一页。 要阻止默认单击操作,请将onClick处理程序配置为调用
event.preventDefault()或返回false。
注意:不支持与ContentNote SObject对应的URL。
navigateToFeed(subjectId, type)导航到指定类型的Feed,作用域为subjectId。对于某些Feed类型,subjectId是必需的但是被忽略。对于这些Feed类型,将当前用户的ID作为subjectId传递。
type是Feed类型。可能的值如下。
•BOOKMARKS:包含上下文用户保存为书签的所有Feed项。将当前用户的ID作为subjectId传递。
•COMPANY:包含除TrackedChange类型的Feed项目之外的所有Feed项目。要查看订阅源项,用户必须具有对其父项的共享访问权限。将当前用户的ID作为subjectId传递。
•文件:包含所有包含上下文用户遵循的人员或组发布的文件的源项目。将当前用户的ID作为subjectId传递。
•GROUPS:包含上下文用户拥有或属于其成员的所有组中的所有Feed项。将当前用户的ID作为subjectId传递。
•新闻:包含上下文用户遵循的所有更新,用户所属的组以及用户所关注的文件和记录。包含父级为上下文用户的记录的所有更新。包含提及上下文用户或提及上下文用户所属的组的每个提要项和注释。将当前用户的ID作为subjectId传递。
•PEOPLE:包含上下文用户遵循的所有人发布的所有Feed项。将当前用户的ID作为subjectId传递。
•RECORD:包含父级为指定记录的所有订阅源项,可以是组,用户,对象,文件或任何其他标准或自定义对象。当记录是一个组时,该提要还包含提及该组的提要项。当记录是用户时,该Feed仅包含该用户的Feed项。您可以获取其他用户的记录Feed。将记录的ID作为subjectId传递。
•TO:包含上下文用户提及的所有Feed项。包含上下文用户注释的订阅源项以及由评论的上下文用户创建的订阅源项。将当前用户的ID作为subjectId传递。
•TOPICS:包含包含指定主题的所有Feed项。将主题的ID作为subjectId传递。仅Salesforce for Mobile Web支持此值。 Salesforce for iOS或Salesforce for Android中不提供主题
navigateToFeedItemDetail( feedItemId)导航到特定的源项,feedItemId和任何关联的注释。
navigateToRelatedList( relatedListId, parentRecordId)导航到parentRecordId的相关列表。 例如,要显示Warehouse对象的相关列表,parentRecordId是Warehouse c.Id.
relatedListId是要显示的相关列表的API名称或ID。
navigateToList(listViewId
, listViewName, scope)
导航到listViewId指定的列表视图,该列表视图是要显示的列表视图的ID。
listViewName设置列表视图的标题。 它不需要匹配为列表视图保存的实际名称。 要使用保存的名称,请将listViewName设置为null。
将范围设置为视图中sObject的名称,例如“Account”或“MyObject c”。
createRecord(entityName[, recordTypeId][, defaultFieldValues])打开页面以为指定的entityName创建记录,例如“Account”或“MyObject c”。
recordTypeId是可选的,它指定创建的对象的记录类型。调用
createRecord而不提供recordTypeId可能会导致错误。
defaultFieldValues是可选的,如果提供,则预填充记录创建面板上的字段,包括面板上未显示的字段。 用户必须具有对具有预填充值的字段的创建访问权限。 保存期间由字段访问限制引起的错误不会显示错误消息。
editRecord(recordId)打开页面以编辑recordId指定的记录。

有关与Visualforce一起使用的导航方法的信息,请参阅Salesforce App Developer’s Guide。

画布开发(8)Chatter Feed中的Canvas应用程序

学习目标

完成本单元后,您将能够了解到:

  • Chatter Feed上下文注意事项
  • Chatter Feed Canvas应用访问注意事项

Canvas使您可以将画布应用程序公开为Feed项。该Feed为用户提供有关Salesforce内部发生的信息以及他们所关注的记录和组的信息。

开发人员可以在Feed中使用画布应用来:

  • 从发布者的画布应用程序或Chatter API发布到Chatter摘要。
  • 在Chatter摘要项目中显示画布应用程序。

创建画布应用程序Chatter订阅源项时,它包含缩略图图像,链接标题和说明。在Salesforce Classic中,当用户单击链接或说明时,画布应用会在Feed中打开。如果用户再次点击该链接,则内容会折叠,从而为用户提供在其Feed中工作的无缝体验。在Lightning Experience中,当用户单击链接或描述时,用户将被重定向到专用的画布应用页面。

例如,您可能有一个画布应用程序,允许用户记录他们的工作时间。您现在可以以编程方式创建一个显示画布应用程序的供稿项,该应用程序向用户显示当前记录的小时数。

此外,Feed项可以显示取决于当前用户的操作。因此,画布应用程序可以将供稿项目发布给用户的经理,经理可以批准或拒绝记录的小时数。由于内容是从canvas应用程序提供的,因此开发人员可以完全控制该行为。

Chatter Feed上下文注意事项

当您在Feed项目中显示画布应用程序时,您从签名请求或getContext()调用中收到的上下文信息包含特定于Feed的信息:

  • 位置 – 如果画布应用程序位于Feed中,则Environment.displayLocation字段包含该值ChatterFeed。
  • 参数 – 创建包含画布应用程序的订阅源项时,可以指定JSON字符串作为参数值。当canvas应用程序接收上下文时,feed项中的参数将包含在Environment.Parameters对象中。
  • Size-Environment.Dimensions对象包含有关canvas应用程序大小的信息。
    1. 画布应用高度默认为100像素。
    2. 画布应用程序宽度默认为420像素,这与Feed中画布应用程序的最大宽度相同。
    3. Feed中画布应用的最大高度为400像素。
    4. Feed中画布应用的最大宽度为420像素。
    5. 此代码段显示Feed中画布应用的默认大小值:
      “dimensions”:
      {
      “width”: “420px”,
      “height”: “100px”, “maxHeight”: “400px”, “maxWidth”: “420px”
      }
    6. Feed的固定宽度为420像素。例如,如果将画布应用的大小调整为200像素,则Feed宽度仍为420像素。
    7. 您可以使用Canvas SDK中的resize()方法将画布应用程序的值更改为maxHeight和maxWidth。

Chatter Feed Canvas应用访问注意事项

修改Feed中显示的画布应用时,请记住以下注意事项:

  • 如果删除了画布应用程序且该应用程序位于Feed项目中,则这些Feed项目将保留。如果用户访问其中一个Feed项,则会收到canvas应用程序不存在的错误。
  • 如果删除用户对画布应用程序的访问权限且该应用程序位于Feed项目中,则这些Feed项目将保留。如果用户访问其中一个Feed项,他们将收到一条错误消息,表明他们无权访问画布应用。
  • 通过发布者操作或Chatter API创建画布应用程序源项时,Salesforce会检查画布应用程序是否存在以及用户是否具有该权限。
    1. 如果画布应用程序不存在,则无法创建订阅源项并返回错误。
    2. 如果画布应用程序存在,但尝试创建订阅源项的用户无权访问画布应用程序,则会创建订阅源项。但是,用户将无法查看订阅源项并返回错误。
  • 如果画布应用程序尝试执行用户没有权限的操作,则该操作将失败,并且画布应用程序将收到错误。例如,如果应用尝试创建商品记录但用户没有商品的创建权限,则该应用将收到错误。然后,画布应用程序应将错误转发给用户。

画布开发(7)Publisher中的Canvas应用程序

学习目标

完成本单元后,您将能够了解到:

  • 设置Canvas应用程序位置并创建操作
  • 手动创建操作
  • Canvas SDK Publisher事件
  • 发布者上下文注意事项
  • Publisher Canvas App Access注意事项

Canvas使您可以将画布应用程序公开为快速操作。 发布者允许用户访问组织中最常见的操作。 您可以将发布者扩展为包含画布应用程序,以便用户可以利用画布应用程序的常见自定义操作。 然后,这些操作可以与Feed集成,并创建特定于已执行操作的Feed帖子。

开发人员可以使用发布商中的画布应用来:

  • 将Web应用程序中的内容添加到Chatter发布者中。
  • 创建一个公开画布应用程序的自定义操作。
  • 将画布应用程序直接集成到发布者生命周期中:从画布应用程序发布到Chatter摘要中,使用“共享”按钮功能,并指定发布消息的位置。

例如,您可能拥有一个用户用来记录工作时间的画布应用程序。 您可以创建一个快速操作,允许用户在发布者中打开该画布应用程序,以便他们可以在发布者中快速提交时间记录。

用户仍然可以以标准方式访问画布应用程序以获得完整功能; 但是,发布者中的画布应用程序可以快速访问应用程序的最常见功能。 用户可以选择快速操作并创建Chatter订阅源项,该项可以是文本帖子,链接帖子,甚至是画布帖子。

设置Canvas应用程序位置并创建操作

要将画布应用程序添加到发布者或操作栏,您必须设置位置并在创建画布应用程序时创建操作。

  1. 在Salesforce中,从“设置”中,在“快速查找”框中输入“应用”,然后选择“应用”。
  2. 在Connected Apps相关列表中,单击New。填写画布应用的基本字段。请参阅创建画布应用程序。
  3. 在Canvas App设置中,选择Canvas,然后在Locations字段中选择Publisher。您必须为画布应用选择此位置,以使其显示在完整Salesforce站点中的发布者和Salesforce应用程序的操作栏中。
  4. 选择“自动创建操作”字段。这为画布应用程序创建了一个快速操作。
  5. 隐藏发布商标题,其中包含“您在做什么?”文本,选择隐藏Publisher标题。这会在完整的Salesforce站点和Salesforce应用程序中隐藏标题。
  6. 要在完整Salesforce站点和Salesforce应用程序中隐藏用户的发布者“共享”按钮,请选择“隐藏发布者共享按钮”。仅当选择了“隐藏发布者标题”时,才会启用此复选框。

要使画布应用程序显示为操作,您必须将操作添加到全局发布者布局。请参阅Salesforce帮助中的“自定义全局发布者布局”。

手动创建操作

如果在创建画布应用程序时未选择“自动创建操作”字段,则需要手动创建操作。

  1. 从“设置”中,在“快速查找”框中输入“Actions”,然后选择“Global Actions”
  2. 单击“New Action”。
  3. 在“操作类型”字段中,选择“自定义画布”。
  4. 在“画布应用程序”字段中,选择要作为操作显示的画布应用程序。只有具有Publisher位置的画布应用才会显示在此字段中。
  5. 在“高度”字段中,输入画布应用程序的高度(以像素为单位)。
    这是画布应用在出版商中出现时的初始高度。您可以使用Canvas SDK resize()方法将高度更改为最大500像素。
  6. 在“标签”字段中,输入一个值。
    此值在用户界面中显示为快速操作标题。
  7. 在“名称”字段中,输入不带空格的唯一值。
  8. 或者,在“图标”字段中,您可以通过单击“ Change Icon”上载图标。您必须先将图标作为静态资源上传,然后才能在此处进行更改。
  9. 单击“Save”。

要使画布应用程序显示为快速操作,您必须将操作添加到全局布局。请参阅Salesforce帮助中的“自定义全局发布者布局”。

Canvas SDK Publisher事件

在发布者中公开画布应用程序时,可以使用定义良好的事件来启用画布应用程序和发布者之间的通信。

您的画布应用程序可以订阅和发布这些事件,以便与发布者框架更紧密地集成。例如,您可以激活标准Chatter共享按钮以发布Chatter摘要项。您还可以访问用户在“您在做什么”中输入的帖子文本?发布商中的字段,并将其与您应用中的内容相结合。

FieldDescription
publisher.clearPanelState在停用或隐藏画布应用程序时由发布者触发。当用户在发布者中选择其他应用程序或单击“共享”按钮后,可能会发生这种情况。 Visualforce页面也可以侦听此事件。
publisher.failure遇到错误情况时由发布者触发,例如提交无效数据时。例如:
•Feed中的文字太长
•您尝试发布到Feed的画布应用程序不存在
•画布应用程序URL无效
画布应用程序应该侦听此事件并提醒用户发生了错误并且未创建帖子。
publisher.getPayload单击“共享”按钮时由发布者触发。有效负载包含诸如输入到您正在使用的内容中的文本等信息。字段以及与之共享订阅源项的人员。
publisher.setupPanel最初加载Chatter摘要页时由发布者触发。
publisher.setPayload由画布应用程序触发,以向发布者表明发送给发布者的内容应该在订阅源项目中共享。此事件是对publisher.getPayload的响应,包含有关您尝试创建的Feed项的信息。您可以创建三种Feed项类型:
•TextPost
•LinkPost
•CanvasPost
publisher.setValidForSubmit由画布应用程序触发,向发布者表明画布应用程序已准备好提交有效负载。触发此事件后,“共享”按钮将变为活动状态。
此代码段启用“共享”按钮:
$$.client.publish(sr.client,
{name : ‘publisher.setValidForSubmit’, payload : true});
publisher.showPanel当用户在发布者中选择画布应用时,由发布者触发。此事件表示正在显示画布应用程序。 Visualforce页面也可以侦听此事件。
publisher.success单击“共享”按钮并成功提交数据后,由发布者触发。

发布者事件的顺序

以下是从画布应用程序角度看发布者事件的顺序:

  1. 画布应用程序侦听pu​​blisher.setupPanel。
  2. 画布应用程序侦听pu​​blisher.showPanel。
  3. 用户与画布应用程序交互,例如,单击按钮或输入一些文本。 canvas应用程序执行所需的任何验证,然后触发publisher.setValidForSubmit。结果,发布者然后启用“共享”按钮。
  4. 画布应用程序侦听pu​​blisher.getPayload。
  5. canvas应用程序触发publisher.setPayload。
  6. 画布应用程序侦听pu​​blisher.success。
  7. canvas应用程序侦听pu​​blisher.failure。
  8. 画布应用程序侦听pu​​blisher.clearPanelState。

发布者上下文注意事项

当您在发布者中显示画布应用程序时,您从签名请求或从
getContext()调用包含特定于发布者的信息:

  • Location – 如果画布应用程序位于发布者中,则Environment.displayLocation字段包含值Publisher。
  • Size-Environment.Dimensions对象包含有关canvas应用程序大小的信息。
    1. 画布应用高度将是您在创建的快速操作中指定的高度。
    2. 如果在创建画布应用程序时选择了“自动创建操作”,则画布应用程序高度默认为200像素。
    3. 画布应用程序宽度默认为521像素,这与发布者中画布应用程序的最大宽度相同。
    4. 发布者中画布应用的最大高度为500像素。
    5. 发布者中画布应用的最大宽度为521像素。
    6. 此代码段显示发布商中画布应用的默认大小值:
      “dimensions”:{“width”:“521px”,“height”:“200px”,“maxHeight”:“500px”,“maxWidth”:“521px”}
    7. 发布商的固定宽度为521像素。例如,如果将画布应用程序的大小调整为400像素,则发布者宽度仍为521像素。
    8. 您可以使用Canvas SDK中的resize()方法将画布应用程序的值更改为maxHeight和maxWidth。

Publisher Canvas App Access注意事项

修改发布者中显示的画布应用时,请记住以下注意事项:

  • 如果画布应用程序具有与之关联的快速操作,则无法删除画布应用程序或删除Publisher位置。 您必须先删除快速操作。
  • 如果用户无法通过配置文件或权限集访问画布应用程序,并且他们在发布者中选择了应用程序,则会收到错误消息。
  • 如果画布应用程序尝试执行用户没有权限的操作,则该操作将失败,并且画布应用程序将收到错误。 例如,如果应用尝试创建商品记录但用户没有商品的创建权限,则该应用将收到错误。 然后,画布应用程序应将错误转发给用户。