Zugriff auf Salesforce-Daten über REST-APIs
Lernziele
Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
- Stellen einer REST-Anforderung mit der RestClient-Schnittstelle
- Empfangen der REST-Antwort von Salesforce
- Verwenden des Mobile SDK zum Verarbeiten der REST-Antwort
Mit Trail Together einem Dozenten folgen
Möchten Sie bei diesem Schritt einem Experten folgen? Schauen Sie sich dieses Video an, das Teil der Reihe "Trail Together" ist.
(Dieser Clip beginnt bei Minute 16:05, für den Fall, dass Sie zurückspringen und den Anfang des Schritts noch einmal sehen möchten.)
Senden von REST-Anforderungen
In Ihren benutzerdefinierten Ansichten greifen Sie über die Salesforce-API auf Salesforce-Organisationsdaten zu. Werfen wir einen genaueren Blick darauf, wie Sie die Salesforce-API in Mobile SDK-Swift-Anwendungen aufrufen.
Verwenden des RestClient-Publishers
Um auf Salesforce-Daten zuzugreifen, senden Sie REST-Anforderungen an Salesforce und empfangen die Antworten in Ihrer Anwendung. Wie werden Netzwerkanforderungen programmiert, gesendet und ihre Antworten verarbeitet?
SwiftUI-Anwendungen verwenden eine View-Model-Architektur. Eine View-Klasse definiert Bildschirmlayouts in SwiftUI und ruft zur Laufzeit eine zugehörige Model-Klasse für die Daten auf, die ihre Schnittstellen auffüllen. Im Swift-Vorlagenprojekt im Mobile SDK befinden sich die Model-Klassen im Projektordner "Models". Die Datei "ContactsForAccountModel.swift" definiert beispielsweise den Code, der eine Liste der Kontakte für einen Account anfordert. Wenn die Antwort eingeht, verarbeitet die ContactsForAccountModel
-Klasse die zurückgegebenen Datensätze, um eine Liste der Kontaktinformationen an die ContactsForAccountListView
-Klasse zu senden.
RestClient
ist Ihr Einstiegspunkt in alle REST-Services. Mobile SDK-Anwendungen verwenden RestClient-Methoden zum Erstellen und Senden von REST-Anforderungen. Sie greifen stets nur über ihre gemeinsame Instanz auf diese Klasse zu:
RestClient.shared()
fetchContactsForAccount(_:)
-Methode demonstriert.- Erstellen und initialisieren Sie eine
RestRequest
-Instanz.RestClient
bietet zu diesem Zweck eine umfassende Palette von Factory-Methoden. In unserem Beispiel wird eine SOQL-Abfrageanforderung erstellt, Sie können jedoch jede beliebigeRestClient
-Methode wählen, die Ihre Zwecke erfüllt. - Senden Sie das Anforderungsobjekt an Salesforce.
RestClient
authentifiziert die Anforderung automatisch mit den Anmeldedaten des aktuellen Benutzers.
- Öffnen Sie in Xcode die Datei "ContactsForAccountModel.swift".
- Suchen Sie die
fetchContactsForAccount(_:)
-Methode. Die Implementierung sieht in etwa so aus: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
-Instanz. Sie können diesen Aufruf in der langen Anweisung sehen, die so beginnt: let request = RestClient.shared.request(forQuery:...
RestRequest
-Objekt enthält eine vorformatierte REST-Anforderung, die auf der angegebenen SOQL-Zeichenfolge basiert.RestClient
-Publishers. Wenn Sie diesen Publisher aufrufen, teilen Sie ihm im Grunde nur mit: "Hier ist meine Anforderung". Der Publisher verarbeitet dann den Netzwerkaufruf, um Ihre Anforderung an Salesforce zu senden, und bearbeitet die Netzwerkantwort, bevor er sie an Ihren wartenden Code zurückliefert.Sie sehen den Aufruf des Publishers in der Zeile, die so beginnt:
contactsCancellable = RestClient.shared.publisher(for: request)
Die nachfolgende Abfolge von Aufrufen erkennen Sie ggf. als Aufrufkette, die eine gängige und nützliche Konstruktion für Swift Combine-Publisher ist. Diese Aufrufkette behandelt die asynchrone Netzwerkantwort als Future
-Objekt, das schließlich entweder beendet wird oder fehlschlägt. In jeder der Aufrufketten wird die Aktion auf das aktuelle Standardobjekt angewendet. Dieses Objekt kann durch den Rückgabewert des vorherigen Aufrufs in der Kette zurückgesetzt werden. Wenn der Netzwerkaufruf fehlgeschlagen ist oder Salesforce einen Fehler zurückgegeben hat, wird die Verarbeitung an den .catch
-Block weitergegeben.
Um einen detaillierten Eindruck davon zu bekommen, wie die Aufrufkette funktioniert, finden Sie hier eine großzügig kommentierte Auflistung der Sequenz.
// 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) }
Weitere Optionen
Wenn Sie sich andere Model-Klassen in der Vorlagenanwendung ansehen, können Sie erkennen, dass RestClient.shared.publisher
nicht die einzige Möglichkeit ist, Salesforce-Daten abzurufen. AccountsListModel
verwendet z. B. zwei andere Publisher:
- Einen SmartStore-Publisher
- Einen Mobile Sync-Publisher
An dieser Stelle wird nicht erwartet, dass Sie über SmartStore und Mobile Sync Bescheid wissen. Einfach ausgedrückt, handelt es sich dabei um die beiden Offline-Funktionen des Mobile SDK. SmartStore ist ein lokal eingerichtetes Speichersystem, das als Offline-Repository für Salesforce-Datensätze dient. Da sich dieses verschlüsselte Repository auf dem mobilen Gerät befindet, kann der Kunde mit SmartStore auch dann weiterarbeiten, wenn keine Netzwerkverbindung besteht. Mobile Sync übernimmt die folgenden Aufgaben:
- Abrufen von Salesforce-Datensätzen
- Speichern der Datensätze in SmartStore-Soups (vergleichbar mit Datenbanktabellen)
- Sicherstellen, dass SmartStore- und Serverdatensätze synchron bleiben, wenn der Kunde neue Datensätze herunterlädt oder lokale Änderungen hochlädt
Das Mobile SDK definiert diese Publisher in Swift-Klassenerweiterungen. Wenn Sie neugierig sind, wie das Ganze funktioniert, können Sie in Xcode mit der rechten Maustaste auf eine der Publisher
-Varianten klicken und Jump to Definition (Zur Definition springen) auswählen. In beiden Fällen ist der Code spärlich. Für die eigentliche Funktionalität wird auf die SmartStore- oder Mobile Sync-Methoden verwiesen. Um mehr über diese Publisher, die zugrunde liegenden Technologien und andere Möglichkeiten zur Programmierung von REST-API-Interaktionen zu erfahren, folgen Sie den Links unter "Ressourcen". Die Chancen stehen gut, dass Sie die eleganten, effizienten Publisher gerne nutzen werden!
Ressourcen
- Entwicklerhandbuch: Native Swift-Vorlage
- Entwicklerhandbuch: Verarbeiten von REST-Anforderungen
- Entwicklerhandbuch: Verarbeiten von REST-Antworten
- Entwicklerhandbuch: Verwenden von SFRestRequest-Methoden
- Entwicklerhandbuch: Unterstützte Vorgänge
- Entwicklerhandbuch: REST-API – Entwicklerhandbuch
- Trailhead: API-Grundlagen
- Externer Link: Schulungscenter für Postman