Accès aux données Salesforce à l'aide des API REST

Objectifs de formation

Une fois cette unité terminée, vous pourrez :

  • Générer une requête REST à l’aide de l’interface RestClient
  • Recevoir la réponse REST de Salesforce
  • Utiliser le kit de développement mobile pour traiter la réponse REST

Envoi de requêtes REST

Dans vos vues personnalisées, vous accédez aux données de l’organisation Salesforce par le biais de l’API Salesforce. Examinons de plus près la manière d’appeler l’API Salesforce dans les applications Swift issues du kit de développement mobile.

Utilisation de l’éditeur RestClient

Le processus d’accès aux données Salesforce implique que vous envoyiez des requêtes REST à Salesforce et receviez les réponses à celles-ci dans votre application. Alors, comment coder les requêtes réseau, les envoyer et traiter leurs réponses ?

Les applications SwiftUI utilisent une architecture de type modèle-vue. Une classe de vue définit les présentations d’écran dans SwiftUI et, au moment de l’exécution, appelle une classe de modèle associée correspondant aux données apparaissant dans leurs interfaces. Dans le projet modèle Swift du kit de développement mobile, les classes de modèle se trouvent dans le dossier de projet Modèles. Par exemple, le fichier ContactsForAccountModel.swift définit le code qui demande une liste de contacts pour un compte donné. Lorsque la réponse arrive, la classe ContactsForAccountModel traite les enregistrements renvoyés pour transmettre une liste d’informations de contact à la classe ContactsForAccountListView

RestClient constitue votre point d’entrée vers tous les services REST. Les applications issues du kit de développement mobile utilisent des méthodes RestClient pour élaborer et envoyer des demandes REST. Vous accédez toujours à cette classe uniquement via son instance partagée :

RestClient.shared()

Voici la séquence d’envoi de requêtes (« send request ») standard figurant dans la méthode fetchContactsForAccount(_:) :
  1. Créez et initialisez une instance RestRequest. RestClient propose à cette fin un large choix de méthodes de fabrique. Notre exemple crée une requête SOQL, mais vous pouvez sélectionner la méthode RestClient qui vous convient.
  2. Envoyez l’objet de la requête à Salesforce. RestClient authentifie automatiquement la requête à l’aide des identifiants de l’utilisateur actif.
Examinons le code.
  1. Dans Xcode, ouvrez le fichier ContactsForAccountModel.swift.
  2. Recherchez la méthode fetchContactsForAccount(_:). L’implémentation lit un code semblable à :
    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)
            }
        }
    }
Cette méthode crée une requête REST, la fait envoyer à Salesforce et traite la réponse. Pour créer l’objet de requête, elle utilise l’instance partagée RestClient. Cet appel se trouve dans la longue instruction qui débute par : 
let request = RestClient.shared.request(forQuery:... 
L’objet RestRequest qui en résulte contient une requête REST prédéfinie qui dépend de la chaîne SOQL fournie.

La manière dont la requête est envoyée et la réponse reçue est un peu moins évidente. Cet exemple simplifie ces deux étapes en utilisant un éditeur Combine Swift du kit de développement mobile, à savoir l’éditeur RestClient. Lorsque vous appelez cet éditeur, vous lui présentez simplement votre requête. L’éditeur gère ensuite l’appel réseau pour envoyer votre requête à Salesforce et traite la réponse du réseau avant de la renvoyer à votre code en attente.

L’appel de l’éditeur se trouve dans la ligne qui commence par :

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

Vous reconnaîtrez peut-être que la séquence d’appels qui suit est une chaîne d’appels. Il s’agit d’une construction courante et utile pour les éditeurs Combine Swift. Cette chaîne d’appels traite la réponse réseau asynchrone comme un objet de type Future, qui aboutit ou échoue. Dans chacune des chaînes d’appels, l’action est exécutée sur l’objet par défaut actuel. Cet objet peut être réinitialisé par la valeur renvoyée par l’appel précédent dans la chaîne. Si l’appel réseau a échoué ou si Salesforce a renvoyé une erreur, le traitement s’arrête au bloc .catch

Pour mieux comprendre le fonctionnement de la chaîne d’appels, voici la séquence détaillée et commentée.

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

Autres options

Si vous vous intéressez à d’autres classes de modèle dans l’application modèle, vous pourrez constater que RestClient.shared.publisher n’est pas le seul moyen d’obtenir des données Salesforce. Par exemple, AccountsListModel emploie deux autres éditeurs :

  • Un éditeur SmartStore
  • Un éditeur Mobile Sync

Vous n’êtes pas censé connaître SmartStore et Mobile Sync à ce stade, mais pour faire simple, il s’agit des deux fonctionnalités hors ligne du kit de développement mobile. SmartStore est une configuration de stockage local qui sert de référentiel hors ligne pour les enregistrements Salesforce. Étant donné que ce référentiel crypté réside sur l’appareil mobile, SmartStore permet au client de continuer à travailler même en cas d’impossibilité de se connecter au réseau. Mobile Sync joue quant à lui un rôle très important, en : 

  • procédant à l’obtention des enregistrements Salesforce ;
  • stockant les enregistrements dans des soupes SmartStore (qui s’apparentent aux tableaux des bases de données) ;
  • s’assurant que les enregistrements SmartStore et du serveur restent synchronisés lorsque le client télécharge de nouveaux enregistrements ou apporte des modifications locales.

Le kit de développement mobile définit ces éditeurs dans des extensions de classe Swift. Si vous souhaitez voir comment cela fonctionne de manière concrète, rendez-vous dans Xcode et cliquez avec le bouton droit de la souris sur l’une des variables publisher, puis sélectionnez Accéder à la définition. Dans les deux cas, le code est peu fourni puisqu’il s’appuie sur les méthodes SmartStore ou Mobile Sync pour mettre en œuvre les fonctionnalités. Pour en savoir plus sur ces éditeurs, leurs technologies sous-jacentes et d’autres manières de coder les interactions de l’API REST, consultez les liens figurant dans la section Ressources. Vous serez très certainement ravi d’utiliser ces éditeurs élégants et efficaces !

  • Ressources
Formez-vous gratuitement !
Créez un compte pour continuer.
Qu’est-ce que vous y gagnez ?
  • Obtenez des recommandations personnalisées pour vos objectifs de carrière
  • Mettez en pratique vos compétences grâce à des défis pratiques et à des questionnaires
  • Suivez et partagez vos progrès avec des employeurs
  • Découvrez des opportunités de mentorat et de carrière