Zugriff auf Salesforce-Daten über REST-APIs
Lernziele
Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
- Instanziieren einer REST-Anforderung mit der RestClient-Klasse
- Ausgeben einer asynchronen REST-Anforderung mit den Klassen RestClient und RestRequest
- Empfangen und Verarbeiten einer REST-Antwort mit der RestResponse-Klasse
Verwenden von REST APIs
Wenn Sie soweit sind, dass Sie in Ihrer Anwendung auf die Salesforce-Daten zugreifen können, rufen Sie Salesforce REST APIs auf. REST APIs sind in der Regel auf einer niedrigen Ebene angesiedelt, auf der ein Entwickler über rudimentäre Netzwerkaufrufe manuell darauf zugreifen kann. Das brauchen Sie jedoch nicht zu tun – Sie haben ja das Mobile SDK, das den Wust von Arbeit für Sie erledigt.
Hier eine Übersicht der Klassen, die REST API-Aufrufe verarbeiten. All diese Klassen sind im com.salesforce.androidsdk.rest-Paket zu Hause.
- ClientManager: Dient als Factory für RestClient-Instanzen. Verarbeitet darüber hinaus Account-Anmeldungen und Handshakes mit dem Salesforce-Server.
-
RestClient: Verwaltet das Protokoll für das Senden von REST-API-Anforderungen an den Salesforce-Server.
Erstellen Sie keine Instanzen von RestClient direkt. Rufen Sie stattdessen die ClientManager.getRestClient()-Methode auf.
-
RestRequest: Stellt REST-API-Anforderungen dar, die anhand der von Ihnen bereitgestellten Daten formatiert wurden. Dient auch als Factory für Instanzen von sich selbst.
- RestResponse: Enthält den Inhalt der Antwort im angeforderten Format. Die RestRequest-Klasse erstellt RestResponse-Instanzen und gibt sie über Ihre Implementierung der RestClient.AsyncRequestCallback-Schnittstelle an Ihre Anwendung zurück.
Das folgende animierte Diagramm zeigt den Flow in Aktion.
- Die Anwendung ruft eine statische Methode in der RestRequest-Klasse auf, um eine konfigurierte RestRequest-Instanz zu erstellen.
- Die Anwendung übergibt die neue RestRequest-Instanz und eine Instanz der AsyncRequestCallback-Schnittstelle an die RestClient.sendAsync()-Methode.
- Das Mobile SDK sendet die REST-Anforderung, die im RestRequest-Objekt angegeben wurde, an den Salesforce-Cloud-Service.
- Salesforce verarbeitet die Anforderung und gibt eine JSON-Antwort an die Anwendung zurück.
- Das Mobile SDK packt die JSON-Antwort in ein neues RestResponse-Objekt.
- Das Mobile SDK übergibt das neue RestResponse-Objekt an die AsyncRequestCallback-Implementierung der Anwendung weiter, wo es genutzt werden kann.
Noch wach? Gehen wir doch mal über die begriffliche Ebene hinaus und schauen uns diese Informationen bei der Arbeit in der Praxis Ihrer Anwendung an.
Die sendRequest()-Methode
- Erweitern Sie in Android Studio im Fenster "Project" .
- Doppelklicken Sie auf MainActivityMainActivity.
- Suchen Sie nach der Methode onFetchContactsClick. Beachten Sie, dass diese unscheinbare Methode eine sendRequest()-Methode mit einer SOQL-Anweisung aufruft.
public void onFetchContactsClick(View v) throws UnsupportedEncodingException { sendRequest("SELECT Name FROM Contact"); }
- Klicken Sie mit der rechten Maustaste auf "sendRequest" und wählen Sie aus. Wie Sie feststellen können, ist sendRequest() eine private Methode in Ihrer MainActivity-Klasse. Gut, dass diese Ihnen gehört, denn wir wollen sie später ändern.
- client – eine private, auf die Klasse begrenzte Instanz von RestClient. Dieses Objekt wird während der Initialisierung der Anwendung automatisch instanziiert.
- restRequest – eine neue RestRequest-Instanz.
- RestRequest.getRequestForQuery() – eine statische RestRequest-Factory-Methode, aus der die RestRequest-Instanz hervorgeht.
- AsyncRequestCallback – die Implementierung der Oberfläche mit den REST-Antwortrückmeldungen für Ihre Anwendung.
Erstellen der REST-Anforderung
RestRequest restRequest = RestRequest.getRequestForQuery( getString(R.string.api_version), soql);
Senden der REST-Anforderung
client.sendAsync(restRequest, new AsyncRequestCallback() { ...
Das Präfix "async" wird hier immer noch angezeigt. Das muss wohl irgendeine Bedeutung haben, oder? Wenn Sie eine Anforderung asynchron senden, bedeutet dies, dass der Code Ihrer Anwendung keine Pause einlegt, um auf die Antwort zu warten. Sobald die Antwort eintrifft, ruft das Mobile SDK eine Ihrer Rückmeldungsmethoden auf, und die Anwendung setzt jeden laufenden Prozess aus, um die Antwort zu verarbeiten. Wenn die Ausführung Ihres Codes auf dem Haupt- (UI-) Thread erfolgt, müssen Sie die Anforderungen asynchron senden.
Erfassen und Verarbeiten der REST-Antwort
@Override public void onSuccess(RestRequest request, final RestResponse result) { result.consumeQuietly(); // consume before going back to main thread runOnUiThread(new Runnable() { @Override public void run() { try { listAdapter.clear(); JSONArray records = result.asJSONObject().getJSONArray("records"); for (int i = 0; i < records.length(); i++) { listAdapter.add( records.getJSONObject(i).getString("Name")); } } catch (Exception e) { onError(e); } } }); }
@Override public void onError(Exception exception) { runOnUiThread((new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, MainActivity.this.getString(R.string.sf__generic_error, exception.toString()), Toast.LENGTH_LONG).show(); } }); }