Acceder a datos de Salesforce en aplicaciones híbridas
Objetivos de aprendizaje
Después de completar esta unidad, podrá:
- Utilizar la biblioteca force.js para acceder a la API de REST de Salesforce desde una aplicación híbrida
- Usar controladores Apex para acceder a datos de Salesforce desde una aplicación híbrida remota.
Acceso a la API de Salesforce con Force.js
En nuestra encuesta de la aplicación ContactExplorer, vio cómo funciona la biblioteca force.js. Esta biblioteca proporciona un amplio conjunto de funciones para realizar operaciones en registros de Salesforce. Además de las operaciones de creación, eliminación, actualización e inserción y actualización, admite consultas SOQL, búsquedas SOSL, definiciones de metadatos y operaciones de gestión de archivos.
Puede descargar force.js y otras bibliotecas de JavaScript de Mobile SDK desde los repositorios de GitHub SalesforceMobileSDK-Shared/libs y SalesforceMobileSDK-Shared/dependencies.
Información general sobre force.js y Mobile SDK
Para empezar, cargue los recursos básicos para aplicaciones en la nube de Salesforce.
- Cree un archivo comprimido, como un archivo ZIP, que contenga cordova.js, force.js y cualquier otro recurso estático que requiera su proyecto.
- En Salesforce, cargue el archivo a través de Su nombre | Configuración de aplicaciones | Desarrollo | Recursos estáticos.
Ejemplo de una página de Visualforce sencilla
<apex:page docType="html-5.0" sidebar="false" showHeader="false" contentType="text/html" applyHtmlTag="false" applyBodyTag="false" standardStylesheets="false" cache="true"> <html> <head> <meta charset="utf-8"></meta> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no"></meta> <apex:includeScript value="{!URLFOR($Resource.Easy, 'cordova/cordova.js')}" /> <apex:includeScript value="{!URLFOR($Resource.Easy, 'libs/force.js')}" /> <script> (function() { /* Do login */ force.login( function() { console.log("Auth succeeded"); showUsersList(); }, function(error) { console.log("Auth failed: " + error); } ); /* This method will render a list of users from current salesforce org */ var showUsersList = function() { fetchRecords(function(data) { var users = data.records; var listItemsHtml = ''; for (var i=0; i < users.length; i++) { listItemsHtml += ('<li class="table-view-cell"><div class="media-body">' + users[i].Name + '</div></li>'); } document.querySelector('#users').innerHTML = listItemsHtml; }) } /* This method will fetch a list of user records from salesforce. Just change the soql query to fetch another sobject. */ var fetchRecords = function (successHandler) { var soql = 'SELECT Id, Name FROM User LIMIT 10'; force.query(soql, successHandler, function(error) { alert('Failed to fetch users: ' + error); }); }; })(); </script> </head> <body> <header> <h1>Hello, Visualforce!</h1> </header> <!-- Placeholder to add users list --> <ul id="users"> </ul> <p>Welcome to Mobile SDK.</p> </body> </html> </apex:page>
Uso de controladores Apex en una aplicación híbrida remota
En el caso de las aplicaciones híbridas remotas, normalmente accede a los datos de Salesforce mediante una página de Visualforce y el controlador Apex asociado. Si la página de Visualforce contiene código JavaScript, dicho código puede interactuar y compartir datos con el controlador Apex del servidor.
- La flexibilidad y el desempeño son superiores a los de apex:actionFunction.
- Es compatible con parámetros y tipos de valores devueltos en el método de controlador Apex mediante la asignación automática entre tipos de Apex y JavaScript.
- Usa un modelo de procesamiento asíncrono con devoluciones de llamada.
- A diferencia de apex:actionFunction, la solicitud AJAX no incluye el estado de vista para la página de Visualforce. Esto aumenta la rapidez del recorrido de ida y vuelta.
En el siguiente ejemplo se inserta código JavaScript con una etiqueta <script> en la página de Visualforce. Este código llama al método invokeAction() en el objeto de gestor de comunicación remota de Visualforce. Pasa a invokeAction() los metadatos necesarios para llamar la función getItemId() en el objeto de controlador Apex objName. Dado que invokeAction() se ejecuta de forma asíncrona, el código define además una función de devolución de llamada para procesar el valor devuelto desde getItemId(). En el controlador Apex, la anotación @RemoteAction expone la función getItemId() a código JavaScript externo.
//Visualforce page code <script type="text/javascript"> Visualforce.remoting.Manager.invokeAction( '{!$RemoteAction.MyController.getItemId}', objName, function(result, event){ //process response here }, {escape: true} ); <script> //Apex Controller code @RemoteAction global static String getItemId(String objectName) { ... }
Por ejemplo, en el método getItemId() puede llamar a una API de Salesforce y capturar el valor devuelto en JavaScript.
Recursos
- REST API Developer’s Guide
- Integration adn REST APIs Developer Center
- Accessing Salesforce Data: Controllers vs. APIs
- Calling the REST API from Visualforce Pages, Revisited (Salesforce Developers Blog)
- https://github.com/forcedotcom/SalesforceMobileSDK-Shared
- Inicio rápido: Conectar Postman a Salesforce