Android-App
[AEM Headless as a Cloud Service]{class="badge informative"}
Beispielanwendungen eignen sich hervorragend, um die Headless-Funktionen von Adobe Experience Manager (AEM) zu erkunden. Diese Android-App zeigt, wie Inhalte mithilfe der GraphQL-APIs von AEM abgefragt werden können. Der AEM Headless-Client für Java wird verwendet, um GraphQL-Abfragen auszuführen und Daten Java-Objekten zuzuordnen, um die App zu unterstützen.
Sie finden den Quell-Code auf GitHub.
Voraussetzungen prerequisites
Folgende Tools sollten lokal installiert werden:
AEM-Anforderungen
Die Android-App kann mit den folgenden AEM-Bereitstellungsoptionen verwendet werden. Für alle Bereitstellungen muss die WKND-Site v3.0.0+ installiert werden.
Die Android-App ist für die Verbindung mit einer AEM Publish-Umgebung konzipiert, kann jedoch Inhalte von AEM Author beziehen, wenn die Authentifizierung in der Konfiguration der Android-App bereitgestellt wird.
Informationen zur Verwendung
-
Klonen Sie das Repository
adobe/aem-guides-wknd-graphql
:code language-shell $ git clone git@github.com:adobe/aem-guides-wknd-graphql.git
-
Starten Sie Android Studio und öffnen Sie den Ordner
android-app
. -
Ändern Sie die Datei
config.properties
unterapp/src/main/assets/config.properties
und aktualisieren SiecontentApi.endpoint
entsprechend Ihrer AEM-Zielumgebung:code language-plain contentApi.endpoint=https://publish-p123-e456.adobeaemcloud.com
Standardauthentifizierung
contentApi.user
undcontentApi.password
authentifizieren lokale AEM-Benutzende mit Zugriff auf WKND GraphQL-Inhalte.code language-plain contentApi.endpoint=https://author-p123-e456.adobeaemcloud.com contentApi.user=my-special-android-app-user contentApi.password=password123
-
Laden Sie ein virtuelles Android-Gerät (Minimum API 28) herunter.
-
Erstellen Sie die App und stellen Sie sie mit dem Android-Emulator bereit.
Verbinden mit AEM-Umgebungen
Wenn Sie eine Verbindung zu einer AEM-Autorenumgebung herstellen, ist eine Autorisierung erforderlich. AEMHeadlessClientBuilder bietet die Möglichkeit zur Nutzung der Token-basierten Authentifizierung. Um die Token-basierte Authentifizierung zu verwenden, aktualisieren Sie den Client-Builder in AdventureLoader.java
und AdventuresLoader.java
:
/* Comment out basicAuth
if (user != null && password != null) {
builder.basicAuth(user, password);
}
*/
// use token-authentication where `token` is a String representing the token
builder.tokenAuth(token)
Der Code
Nachstehend finden Sie eine kurze Zusammenfassung der wichtigen Dateien und des Codes für den Betrieb der App. Den vollständigen Code finden Sie auf GitHub.
Persistierte Abfragen
Gemäß den Best Practices für AEM Headless verwendet die iOS-Anwendung AEM GraphQL-persistierte Abfragen, um Adventure-Daten abzufragen. Die Anwendung verwendet zwei persistierte Abfragen:
- Die persistierte Abfrage
wknd/adventures-all
gibt alle Adventures in AEM mit einer gekürzten Reihe von Eigenschaften zurück. Diese persistierte Abfrage bestimmt die Erlebnisliste der ersten Ansicht.
# Retrieves a list of all adventures
{
adventureList {
items {
_path
slug
title
price
tripLength
primaryImage {
... on ImageRef {
_dynamicUrl
_path
}
}
}
}
}
- Die persistierte Abfrage
wknd/adventure-by-slug
gibt ein einzelnes Adventure durchslug
(eine benutzerdefinierte Eigenschaft, die ein Adventure eindeutig identifiziert) mit einer vollständigen Reihe von Eigenschaften zurück. Diese persistierte Abfrage ermöglicht Detailansichten des Adventures.
# Retrieves an adventure Content Fragment based on it's slug
# Example query variables:
# {"slug": "bali-surf-camp"}
# Technically returns an adventure list but since the the slug
# property is set to be unique in the CF Model, only a single CF is expected
query($slug: String!) {
adventureList(filter: {
slug: {
_expressions: [ { value: $slug } ]
}
}) {
items {
_path
title
slug
activity
adventureType
price
tripLength
groupSize
difficulty
price
primaryImage {
... on ImageRef {
_dynamicUrl
_path
}
}
description {
json
plaintext
}
itinerary {
json
plaintext
}
}
_references {
...on AdventureModel {
_path
slug
title
price
__typename
}
}
}
}
Durchführen einer GraphQL-persistierten Abfrage
Persistierte Abfragen von AEM werden über HTTP-GET ausgeführt und daher wird der AEM Headless-Client für Java verwendet, um persistierte GraphQL-Abfragen für AEM auszuführen und den Adventure-Inhalt in die App zu laden.
Jede persistierte Abfrage verfügt über eine entsprechende „Laderklasse“, die den AEM-HTTP-GET-Endpunkt asynchron aufruft und die Adventure-Daten unter Verwendung des benutzerdefinierten Datenmodells zurückgibt.
-
loader/AdventuresLoader.java
Ruft die Liste der Adventures auf dem Startbildschirm der App mithilfe der persistierten Abfrage
wknd-shared/adventures-all
ab. -
loader/AdventureLoader.java
Ruft ein einzelnes Adventure mithilfe der persistierten Abfrage
wknd-shared/adventure-by-slug
ab und wählt es über denslug
-Parameter aus.
//AdventuresLoader.java
public static final String PERSISTED_QUERY_NAME = "/wknd-shared/adventures-all";
...
AEMHeadlessClientBuilder builder = AEMHeadlessClient.builder().endpoint(config.getContentApiEndpoint());
// Optional authentication for basic auth
String user = config.getContentApiUser();
String password = config.getContentApiPassword();
if (user != null && password != null) {
builder.basicAuth(user, password);
}
AEMHeadlessClient client = builder.build();
// run a persistent query and get a response
GraphQlResponse response = client.runPersistedQuery(PERSISTED_QUERY_NAME);
GraphQL-Antwort-Datenmodelle data-models
Adventure.java
ist ein Java-POJO, das mit den JSON-Daten aus der GraphQL-Anfrage initialisiert wird und ein Adventure für die Ansichten der Android-App modelliert.
Ansichten
Die Android-App verwendet zwei Ansichten, um die Adventure-Daten in mobilen Erlebnissen darzustellen.
-
AdventureListFragment.java
Ruft
AdventuresLoader
auf und zeigt die zurückgegebenen Adventures in einer Liste an. -
AdventureDetailFragment.java
Ruft
AdventureLoader
mithilfe des über die Adventure-Auswahl in der AnsichtAdventureListFragment
übergebenenslug
-Parameters auf und zeigt die Details eines einzelnen Adventures an.
Remote-Bilder
loader/RemoteImagesCache.java
ist eine Dienstprogrammklasse, die bei der Vorbereitung von Remote-Bildern in einem Cache hilft, damit sie mit Elementen der Android-Benutzeroberfläche verwendet werden können. Der Adventure-Inhalt verweist über eine URL auf Bilder in AEM Assets, und diese Klasse wird zur Anzeige dieses Inhalts verwendet.