使用Heroku运行Salesforce Canvas应用程序

学习目标

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

  • 了解Canvas应用程序的身份验证过程。
  • 了解如何使用Heroku运行Salesforce Canvas应用程序。

Salesforce Canvas

使用Salesforce Canvas,您可以将在Heroku上运行的UI或Web应用程序嵌入到Salesforce UI中。Canvas的主要优势是能够使用大量的开源Web技术来构建可轻松与Salesforce集成的Web应用程序。Canvas SDK在Web应用程序中使用JavaScript来访问用户有权访问的Salesforce数据。您可以在本地计算机上开发Canvas应用程序,并使用典型的开发人员流程进行变更管理和部署。

在幕后,Canvas应用程序通过iframe加载到Salesforce中。当然,您可以通过iframe将任何Web应用程序加载到Salesforce的UI中,但使用Canvas,您可以通过JavaScript使用安全通信协议与Salesforce进行通信。当您需要超出Canvas JavaScript API实现的功能时,您可以将Canvas处理的身份验证与Salesforce REST API结合使用,可能使用像JSforce这样的REST API包装器 。

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

认证

Canvas应用程序在Salesforce中使用已连接的应用程序,可以使用已 签名的请求或典型的 OAuth流来处理身份验证。签名请求方法的一个优点是,当Salesforce管理员允许用户访问Canvas应用程序时,应用程序无需中间授权即可向Salesforce发出请求。加载Canvas应用程序后,应用程序可以开始访问用户有权访问的Salesforce数据。

在Heroku上运行Canvas应用程序时,应用程序需要连接应用程序的消费者秘密,该秘密通过Heroku Config Var提供给应用程序,可作为环境变量提供给应用程序。

基本画布应用程序

基本的Canvas应用加载Canvas SDK JavaScript库:

<script type="text/javascript" src="https://.salesforce.com/canvas/sdk/js/36.0/canvas-all.js"></script>
<script type="text/javascript">
    // callback to access the OAuth access token and context object
    Sfdc.canvas(function() {
        // Save the token
        Sfdc.canvas.oauth.token(window.signedRequestJson.oauthToken);
        window.alert("hello, " + window.signedRequestJson.context.user.fullName);
    });
</script>

应用程序的 上下文数据取决于应用程序在Salesforce中的运行位置。您可以将Canvas应用加载到Chatter提要,Chatter选项卡,布局,移动卡,发布者操作和VisualForce页面中。每个都可以为Canvas应用程序提供不同的上下文。例如,如果Canvas应用程序在客户页面的布局中呈现,则上下文包含客户的数据。然后,Canvas应用程序中的JavaScript可以使用该数据来呈现信息。

使用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同步。