Skip to main content

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()

Hier wird die standardmäßige Sequenz "Anforderung senden" in der fetchContactsForAccount(_:)-Methode demonstriert.
  1. 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 beliebige RestClient-Methode wählen, die Ihre Zwecke erfüllt.
  2. Senden Sie das Anforderungsobjekt an Salesforce. RestClient authentifiziert die Anforderung automatisch mit den Anmeldedaten des aktuellen Benutzers.
Lassen Sie uns den Code näher betrachten.
  1. Öffnen Sie in Xcode die Datei "ContactsForAccountModel.swift".
  2. 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)
            }
        }
    }
Diese Methode erstellt eine REST-Anforderung, lässt sie an Salesforce senden und verarbeitet die Antwort. Um das Objekt der Anforderung zu erstellen, verwendet sie die freigegebene RestClient-Instanz. Sie können diesen Aufruf in der langen Anweisung sehen, die so beginnt: 
let request = RestClient.shared.request(forQuery:... 
Das resultierende RestRequest-Objekt enthält eine vorformatierte REST-Anforderung, die auf der angegebenen SOQL-Zeichenfolge basiert.

Wie die Anforderung gesendet und die Antwort empfangen wird, ist etwas weniger offensichtlich. Dieses Beispiel vereinfacht diese beiden Schritte, indem es die Vorteile des Swift Combine-Publishers im Mobile SDK nutzt – genauer gesagt, des 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!

Teilen Sie Ihr Trailhead-Feedback über die Salesforce-Hilfe.

Wir würden uns sehr freuen, von Ihren Erfahrungen mit Trailhead zu hören: Sie können jetzt jederzeit über die Salesforce-Hilfe auf das neue Feedback-Formular zugreifen.

Weitere Infos Weiter zu "Feedback teilen"