Integrar o Salesforce e a Heroku ao Salesforce Connect

Objetivos de aprendizagem

Após concluir esta unidade, você estará apto a:

  • Entender a arquitetura do Salesforce Connect.
  • Desenvolver adaptadores personalizados do Salesforce Connect.
  • Entender como e quando usar o Salesforce Connect com o Heroku.

Salesforce Connect com Heroku

O Salesforce Connect é uma maneira fácil de fazer proxy de dados externos para o Salesforce sem copiá-los para o banco de dados. Assim, você pode extrair dados para o Salesforce e correlacioná-los com outros objetos no Salesforce. O Salesforce Connect funciona com várias origens de dados.

  • Qualquer origem de dados OData 2.0 pode ser extraída para o Salesforce com o Salesforce Connect.
  • O Heroku Connect pode expor um banco de dados Heroku Postgres no Salesforce Connect.
  • Todos os aplicativos Heroku podem fornecer pontos de extremidade que podem ser consumidos com o Salesforce Connect.

Imagem mostrando como os Objetos externos podem ser usados para conectar externamente com dados  exteriores disponíveis a partir de SAP, Oracle, Workday ou Heroku

Nesta unidade, vamos nos concentrar na terceira opção. Se quiser saber mais sobre as outras opções, aprenda a usar um banco de dados Heroku Postgres com o Salesforce Connect e objetos externos do Heroku ou se aprofunde no módulo do Trailhead Salesforce Connect.

Os aplicativos Heroku podem oferecer pontos de extremidade Web para aplicativos móveis e Web e para serviços REST. Como os serviços REST podem ser consumidos no Salesforce facilmente com o Apex, é fácil criar adaptadores personalizados para o Salesforce Connect que fazem proxy dos dados fornecidos pelos serviços REST.

O principal caso de uso dos adaptadores personalizados do Salesforce Connect é quando um sistema externo (como seu aplicativo Heroku!) fornece dados que são úteis na interface de usuário padrão do Salesforce. Por exemplo, digamos que você tenha um aplicativo imobiliário voltado para o cliente na Heroku que expõe dados REST ao JavaScript e a interfaces de usuário móveis. Seria ótimo poder trazer alguns desses dados imobiliários para a interface de usuário do Salesforce, já que alguns processos e relatórios de negócio do back-office poderiam utilizá-los. Você só precisa criar um adaptador dos serviços REST em execução na Heroku para a estrutura do Salesforce Connect.

A principal vantagem de usar o Salesforce Connect em vez dos métodos de ETL tradicionais é que os dados sempre ficam sincronizados, já que são recuperados quase em tempo real, e não copiados.

Introdução ao Salesforce Connect e à Heroku

Para começar a aprender sobre adaptadores personalizados do Salesforce Connect, confira a publicação de blog Como processar dados JSON do GitHub no Salesforce. Se você não sabe como executar serviços REST na Heroku, selecione uma linguagem de programação e uma estrutura que estejam de acordo com as suas necessidades e a sua experiência. Se não souber por onde começar, uma boa opção é Aplicativo de exemplo Ionic 2 com serviços REST, que pode ser implantado na Heroku com apenas um clique. Depois da sua implantação, você terá um ponto de extremidade REST para dados imobiliários mais ou menos assim: https://ionic2-realty-rest-demo.herokuapp.com/properties/

Com o ponto de extremidade REST na Heroku pronto para consumo, agora é hora de escrever código do Apex para fazer a ponte entre o Salesforce Connect e o serviço. Para o serviço REST imobiliário dado como exemplo, poderíamos ter um adaptador Apex simples que estende a classe DataSource.Connection e implanta os métodos sync(), query() e search() com uma estrutura básica como esta:

  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) { }
    }
 

Você pode implementar o método search() usando a função de pesquisa personalizada ou usar este utilitário de pesquisa pronto para usar:

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

O método sync() informa o Salesforce sobre a estrutura de dados dos objetos externos. Para o exemplo, podemos adicionar uma tabela com algumas colunas. Os campos ExternalId, DisplayUrl e Name são obrigatórios.

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;
}

Quando um usuário no Salesforce acessa uma lista de registros de um objeto externo, o método query() busca e analisa os dados na estrutura de dados definida pelo método sync(). Veja um exemplo do método query() para o serviço REST imobiliário.

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;
 }

O método getProperties() faz uma solicitação à API REST imobiliária na Heroku. O método query() transforma os dados na estrutura de dados do objeto externo.

Quando as outras etapas de configuração são estiverem concluídas, os dados imobiliários ficam disponíveis no Salesforce.

Como o Salesforce Connect faz o proxy dos dados, cada vez que um usuário solicita os dados, o Salesforce Connect usa o adaptador para buscá-los. Agora os dados se parecem e funcionam como quaisquer outros dados no Salesforce, exceto pelo fato de virem de um aplicativo na Heroku!

Recursos avançados do Salesforce Connect

Os adaptadores personalizados do Salesforce Connect facilitam a extração de dados para o Salesforce por meio da Heroku. Facilitam muito. Você pode até definir relacionamentos entre os diferentes conjuntos de dados. Saiba mais sobre referências de objeto externo na documentação DataSource.Column.

Dica de profissional: este exemplo simples usa dados anônimos, mas, na maioria dos casos, você deve usar algum tipo de autenticação com o repositório de dados externo. Saiba mais sobre autenticação de origens de dados externas na documentação do Apex.

Os adaptadores personalizados do Salesforce Connect também podem lidar com paginação de dados, que é essencial se seus serviços REST expõem grandes conjuntos de dados.