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
Vidéo de démonstration Trail Together
Vous souhaitez être guidé pas à pas par un expert pendant que vous travaillez sur cette étape ? Regardez cette vidéo qui fait partie de la série Trail Together.
(Ce clip commence à 16 min 05 s, au cas où vous voudriez revenir en arrière et regarder à nouveau le début de l’étape.)
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()
fetchContactsForAccount(_:)
:- 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éthodeRestClient
qui vous convient. - Envoyez l’objet de la requête à Salesforce.
RestClient
authentifie automatiquement la requête à l’aide des identifiants de l’utilisateur actif.
- Dans Xcode, ouvrez le fichier ContactsForAccountModel.swift.
- 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) } } }
RestClient
. Cet appel se trouve dans la longue instruction qui débute par : let request = RestClient.shared.request(forQuery:...
RestRequest
qui en résulte contient une requête REST prédéfinie qui dépend de la chaîne SOQL fournie.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 chiffré réside sur l’appareil mobile, SmartStore permet au client de continuer de 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
- Guides pour développeurs : Modèle Swift natif
- Guides pour développeurs : Traitement des requêtes REST
- Guides pour développeurs : Traitement des réponses REST
- Guides pour développeurs : Using SFRestRequest Methods
- Guides pour développeurs : Supported Operations
- Guides pour développeurs : REST API Developer Guide
- Trailhead : Concepts de base des API
- Lien externe : Centre de formation Postman