Skip to main content

Acceder a datos de Salesforce mediante API de REST

Objetivos de aprendizaje

Después de completar esta unidad, podrá:

  • Generar una solicitud REST con la interfaz RestClient.
  • Recibir la respuesta de REST desde Salesforce.
  • Utilizar Mobile SDK para procesar la respuesta REST.

Siga el proceso con Trail Together

¿Desea seguir el proceso con un experto a medida que realiza este paso? Mire este video que forma parte de la serie Trail Together.

(Este video comienza en el minuto 16:05, en caso de que desee rebobinar y mirar el comienzo del paso nuevamente).

Envío de solicitudes REST

En sus vistas personalizadas, accede a los datos de la organización de Salesforce mediante la API de Salesforce. Echemos un vistazo más de cerca a cómo llama a la API de Salesforce en las aplicaciones Swift de Mobile SDK.

Uso del publicador RestClient

Para acceder a datos de Salesforce, envía solicitudes de REST a Salesforce y recibe las respuestas en su aplicación. ¿Cómo codifica solicitudes de red, las envía y las procesa en sus respuestas?

Las aplicaciones de interfaz de usuario de Swift utilizan una arquitectura de vista y modelo. Una clase de vista define formatos de pantalla en SwiftUI y, en el tiempo de ejecución, llama a una clase de modelo asociada para los datos que completa sus interfaces. En el proyecto de plantilla Swift de Mobile SDK, las clases de modelos están en la carpeta del proyecto Modelos. Por ejemplo, el archivo ContactsForAccountModel.swift define el código que solicita una lista de contactos para una cuenta. Cuando llega la respuesta, la clase ContactsForAccountModel procesa los registros devueltos para enviar una lista de información de contacto a la clase ContactsForAccountListView

RestClient es su punto de entrada a todos los servicios REST. Las aplicaciones del Mobile SDK utilizan métodos RestClient para fabricar y enviar solicitudes de REST. Siempre accederá únicamente a esta clase a través de su instancia compartida:

RestClient.shared()

Esta es la secuencia de “envío de solicitud” estándar que se muestra en el método fetchContactsForAccount(_:).
  1. Cree e inicialice una instancia RestRequest. RestClient ofrece una amplia variedad de métodos generadores con este fin. Nuestro ejemplo crea una solicitud de consulta SOQL, pero puede elegir cualquier método RestClient que se ajuste a sus fines.
  2. Envíe el objeto de solicitud a Salesforce. RestClient autentica automáticamente la solicitud con las credenciales de usuario actuales.
Examinemos el código.
  1. En Xcode, abra el archivo ContactsForAccountModel.swift.
  2. Busque el método fetchContactsForAccount(_:). La implementación lee algo parecido a lo siguiente:
    class ContactsForAccountModel: ObservableObject {
        @Published var contacts: [Contact] = []
        var account: Account?
        private var contactsCancellable: AnyCancellable?
        func fetchContactsForAccount(){
            guard let acct = self.account else {return}
            let request = RestClient.shared.request(forQuery: 
                "SELECT id, firstName, lastName, phone, 
                email, mailingStreet, mailingCity, 
                mailingState, mailingPostalCode 
                FROM Contact 
                WHERE AccountID = '\(acct.id)'", apiVersion: nil)
            contactsCancellable = RestClient.shared.publisher(for: request)
                .receive(on: RunLoop.main)
                .tryMap({ (response) -> Data in
                    response.asData()
                })
                .decode(type: ContactResponse.self, decoder: JSONDecoder())
                .map({ (record) -> [Contact] in
                    record.records
                })
                .catch( { error in
                    Just([])
                })
                .assign(to: \.contacts, on:self)
            }
        }
    }
Este método crea una solicitud REST, la envía a Salesforce y procesa la respuesta. Para crear el objeto de solicitud, usa la instancia compartida de RestClient. Puede ver esta llamada en la declaración larga que comienza con: 
let request = RestClient.shared.request(forQuery:... 
El objeto RestRequest generado contiene una solicitud REST preformateada basada en la cadena de SOQL proporcionada.

Cómo se envía la solicitud y la respuesta recibida son un poco menos obvios. Este ejemplo simplifica ambos pasos al aprovechar un publicador de Combine Swift de Mobile SDK, específicamente, el publicador RestClient. Cuando llama a este publicador, en efecto, solo le dice, "esta es mi solicitud". Luego, el publicador controla la llamada de red para enviar su solicitud a Salesforce y determinar la respuesta de la red antes de entregarla a su código en espera.

Puede ver la llamada al publicador en la línea que comienza con:

contactsCancellable = RestClient.shared.publisher(for: request)

Es posible que reconozca la secuencia de llamadas que aparece a continuación como una cadena de llamadas, lo cual es una construcción común y útil para los publicadores de Swift Combine. Esta cadena de llamadas controla la respuesta de red asincrónica como un objeto Future que eventualmente termina o falla. En cada una de las cadenas de llamada, la acción se realiza en el objeto predeterminado actual. Este objeto puede restablecerse con el valor de retorno de la llamada anterior en la cadena. Si la llamada de red fracasa o Salesforce devuelve un error, el procesamiento se instruye al bloque .catch

Para tener una idea detallada de cómo funciona la cadena de llamadas, a continuación, encontrará una lista ampliamente comentada de la secuencia.

// Use the RestClient publisher to send the request and return the raw REST response
contactsCancellable = RestClient.shared.publisher(for: request)
    // Receive the raw REST response object
    .receive(on: RunLoop.main)
    // Try to convert the raw REST response to Data
    // Throw an error in the event of failure
    .tryMap({ (response) -> Data in
        // Return the response as a Data byte buffer
        response.asData()
    })
    // Decode the Data object as JSON to produce an array
    // of Contacts formatted as a ContactResponse object
    .decode(type: ContactResponse.self, decoder: JSONDecoder())
    // Map the JSON array of Contacts
    .map({ (record) -> [Contact] in
        // Copy the Contact array to the records
        // member of ContactResponse
        record.records
    })
    // If an error is thrown, publish an empty array
    .catch( { error in
        Just([]) // Combine publisher that rescues a failed publisher
    })
    // Store the array of contacts in the model’s published contacts
    // property for use by ContactsForAccountListView
    .assign(to: \.contacts, on:self)
}

Otras opciones

Si examina otras clases de modelos en la aplicación de plantilla, verá que RestClient.shared.publisher no es el único medio para obtener datos de Salesforce. Por ejemplo, AccountsListModel usa dos otros publicadores:

  • Un publicador SmartStore
  • Un publicador Mobile Sync

En este punto, no se espera que conozca SmartStore y Mobile Sync, pero, en pocas palabras, son las dos funciones offline de Mobile SDK. SmartStore es una configuración de almacenamiento local que funciona como un repositorio offline para los registros de Salesforce. Debido a que este repositorio cifrado reside en el dispositivo móvil, SmartStore permite al cliente continuar trabajando incluso si la conectividad de la red falla. Mientras tanto, Mobile Sync se encarga de realizar las siguientes tareas complejas: 

  • Obtener registros de Salesforce
  • Almacenar los registros en sopas SmartStore (similar a las tablas de la base de datos)
  • Garantizar que los registros de SmartStore y los registros del servidor permanezcan sincronizados cuando el cliente descarga registros nuevos o carga cambios locales

Mobile SDK define a estos publicadores en extensiones de clase de Swift. Si quiere saber cómo ocurre este proceso en detalle, en Xcode puede hacer clic con el botón derecho del ratón en cualquiera de los vars publisher y seleccionar Jump to Definition. En ambos casos, el código es escaso: difiere de los métodos SmartStore o Mobile Sync para la funcionalidad real. Para obtener más información sobre estos publicadores, sus tecnologías subyacentes y otras formas de codificar las interacciones de la API de REST, siga los vínculos de Recursos. Lo más probable es que le guste utilizar estos publicadores elegantes y eficientes.

Comparta sus comentarios de Trailhead en la Ayuda de Salesforce.

Nos encantaría saber más sobre su experiencia con Trailhead. Ahora puede acceder al nuevo formulario de comentarios en cualquier momento en el sitio de Ayuda de Salesforce.

Más información Continuar a Compartir comentarios