Le applicazioni di esempio sono un ottimo modo per esplorare le funzionalità headless di Adobe Experience Manager (AEM). Questa applicazione Android illustra come eseguire query sul contenuto utilizzando le API GraphQL di AEM. La Client AEM headless per Java viene utilizzato per eseguire le query GraphQL e mappare i dati su oggetti Java per alimentare l'app.
Visualizza la codice sorgente su GitHub
È necessario installare localmente i seguenti strumenti:
L’applicazione Android funziona con le seguenti opzioni di distribuzione AEM. Tutte le implementazioni richiedono l’ Sito WKND v2.0.0+ da installare.
L'applicazione Android è progettata per connettersi a un Pubblicazione AEM ambiente, tuttavia può sorgente di contenuto da AEM Author se l’autenticazione è fornita nella configurazione dell’applicazione Android.
Clona il adobe/aem-guides-wknd-graphql
archivio:
$ git clone git@github.com:adobe/aem-guides-wknd-graphql.git
Launch Android Studio e apri la cartella android-app
Modificare il file config.properties
a app/src/main/assets/config.properties
e aggiorna contentApi.endpoint
per far corrispondere l’ambiente AEM di destinazione:
contentApi.endpoint=http://10.0.2.2:4503
Autenticazione di base
La contentApi.user
e contentApi.password
autentica un utente AEM locale con accesso al contenuto WKND GraphQL.
contentApi.endpoint=http://10.0.2.2:4502
contentApi.user=admin
contentApi.password=admin
Scaricare un Dispositivo virtuale Android (API minima 28).
Crea e distribuisci l’app utilizzando l’emulatore Android.
10.0.2.2
è un alias IP speciale per localhost quando si utilizza la creazione dell'emulatore 10.0.2.2:4502
equivale a localhost:4502
. Se ci si connette a un ambiente di pubblicazione AEM (consigliato), non è necessaria alcuna autorizzazione e contentAPi.user
e contentApi.password
può essere lasciato vuoto.
Connessione a un ambiente di authoring AEM autorizzazione è obbligatorio. Per impostazione predefinita, l’applicazione è configurata per utilizzare l’autenticazione di base con un nome utente e una password di admin:admin
. La AEMHeadlessClientBuilder consente di utilizzare autenticazione basata su token. Per utilizzare il generatore client di aggiornamento dell’autenticazione basato su token in AdventureLoader.java
e 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)
Di seguito è riportato un breve riepilogo dei file importanti e del codice utilizzati per alimentare l'applicazione. Il codice completo è disponibile all'indirizzo GitHub.
Seguendo AEM best practice headless, l’applicazione iOS utilizza query persistenti AEM GraphQL per eseguire query sui dati di avventura. L'applicazione utilizza due query persistenti:
wknd/adventures-all
query persistente, che restituisce tutte le avventure in AEM con un set abbreviato di proprietà. Questa query persistente guida l'elenco di avventura della visualizzazione iniziale.# Retrieves a list of all adventures
{
adventureList {
items {
_path
slug
title
price
tripLength
primaryImage {
... on ImageRef {
_path
mimeType
width
height
}
}
}
}
}
wknd/adventure-by-slug
query persistente, che restituisce una singola avventura per slug
(proprietà personalizzata che identifica in modo univoco un’avventura) con un set completo di proprietà. Questa query persistente potenzia le visualizzazioni dei dettagli dell’avventura.# 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 {
_path
mimeType
width
height
}
}
description {
json
plaintext
}
itinerary {
json
plaintext
}
}
_references {
...on AdventureModel {
_path
slug
title
price
__typename
}
}
}
}
Le query persistenti AEM vengono eseguite su HTTP GET e quindi, il Client AEM headless per Java viene utilizzato per eseguire le query GraphQL persistenti rispetto a AEM e caricare il contenuto dell’avventura nell’app.
Ogni query persistente ha una classe corrispondente "loader", che chiama in modo asincrono il punto finale AEM HTTP GET e restituisce i dati dell’avventura utilizzando il valore personalizzato definito modello dati.
loader/AdventuresLoader.java
Recupera l'elenco delle Avventure nella schermata iniziale dell'applicazione utilizzando wknd-shared/adventures-all
query persistente.
loader/AdventureLoader.java
Recupera una singola avventura selezionandola tramite il slug
utilizzando wknd-shared/adventure-by-slug
query persistente.
//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);
Adventure.java
è un POJO Java inizializzato con i dati JSON della richiesta GraphQL e modella un’avventura da utilizzare nelle visualizzazioni dell’applicazione Android.
L’applicazione Android utilizza due visualizzazioni per presentare i dati dell’avventura nell’esperienza mobile.
AdventureListFragment.java
Richiama il AdventuresLoader
e visualizza le avventure restituite in un elenco.
AdventureDetailFragment.java
Richiama il AdventureLoader
utilizzando slug
Param passato attraverso la selezione dell'avventura sul AdventureListFragment
visualizza e visualizza i dettagli di una singola avventura.
loader/RemoteImagesCache.java
è una classe di utilità che aiuta a preparare le immagini remote in una cache in modo che possano essere utilizzate con gli elementi dell'interfaccia utente Android. Il contenuto dell’avventura fa riferimento alle immagini in AEM Assets tramite un URL e questa classe viene utilizzata per visualizzare tale contenuto.