将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服务公开大型数据集至关重要。