Integrering av klientprogram
I föregående kapitel skapade och uppdaterade du beständiga frågor med GraphiQL Explorer.
I det här kapitlet beskrivs de olika stegen för att integrera de beständiga frågorna med WKND-klientprogrammet (även WKND App) med HTTP GET-begäranden i befintliga React-komponenter. Det är också en valfri utmaning att använda dina AEM Headless-kunskaper och kodningskunskaper för att förbättra WKND-klientapplikationen.
Förutsättningar prerequisites
Det här dokumentet är en del av en självstudiekurs i flera delar. Se till att föregående kapitel har fyllts i innan du fortsätter med det här kapitlet. WKND-klientprogrammet ansluter till AEM publiceringstjänst, så det är viktigt att du har publicerat följande till AEM publiceringstjänst.
- Projektkonfigurationer
- GraphQL slutpunkter
- Modeller för innehållsfragment
- Skapat innehåll
- GraphQL beständiga frågor
Skärmbilderna IDE i det här kapitlet kommer från Visual Studio-kod
Kapitel 1-4 Lösningspaket (valfritt) solution-package
Det finns ett lösningspaket som slutför stegen i AEM-gränssnittet för kapitel 1-4. Det här paketet behövs inte om de föregående kapitlen har slutförts.
- Hämta Advanced-GraphQL-Tutorial-Solution-Package-1.2.zip.
- I AEM går du till Verktyg > Distribution > Paket för att komma åt Pakethanteraren.
- Ladda upp och installera det paket (zip-fil) som laddats ned i föregående steg.
- Replikera paketet till tjänsten AEM Publish
Mål objectives
I den här självstudiekursen får du lära dig hur du integrerar begäranden om beständiga frågor i exempelappen WKND GraphQL React med AEM Headless Client för JavaScript.
Klona och kör exempelklientprogrammet clone-client-app
För att snabba upp självstudiekursen finns en React JS-app med startfunktion.
-
Klona databasen adobe/aem-guides-wknd-graphql:
code language-shell $ git clone git@github.com:adobe/aem-guides-wknd-graphql.git -
Redigera filen
aem-guides-wknd-graphql/advanced-tutorial/.env.developmentoch ställ inREACT_APP_HOST_URIså att den pekar på AEM målpubliceringstjänst.Uppdatera autentiseringsmetoden om du ansluter till en författarinstans.
code language-plain # Server namespace REACT_APP_HOST_URI=https://publish-pxx-eyy.adobeaemcloud.com #AUTH (Choose one method) # Authentication methods: 'service-token', 'dev-token', 'basic' or leave blank to use no authentication REACT_APP_AUTH_METHOD= # For Bearer auth, use DEV token (dev-token) from Cloud console REACT_APP_DEV_TOKEN= # For Service toke auth, provide path to service token file (download file from Cloud console) REACT_APP_SERVICE_TOKEN=auth/service-token.json # For Basic auth, use AEM ['user','pass'] pair (eg for Local AEM Author instance) REACT_APP_BASIC_AUTH_USER= REACT_APP_BASIC_AUTH_PASS=
note note NOTE Ovanstående instruktioner är att ansluta React-appen till AEM Publish-tjänsten, men om du vill ansluta till AEM Author-tjänsten får du en lokal utvecklingstoken för AEM as a Cloud Service-målmiljön. Det går också att ansluta appen till en lokal författarinstans med AEMaaCS SDK med grundläggande autentisering. -
Öppna en terminal och kör kommandona:
code language-shell $ cd aem-guides-wknd-graphql/advanced-tutorial $ npm install $ npm start -
Ett nytt webbläsarfönster ska läsas in på http://localhost:3000
-
Tryck på Camping > Yosemite Backpackaging för att visa Yosemite Backpackaging-äventyrsinformation.
-
Öppna webbläsarens utvecklarverktyg och granska
XHR-begäran
Du bör se
GETbegäranden till GraphQL-slutpunkten med projektkonfigurationsnamn (wknd-shared), beständigt frågenamn (adventure-by-slug), variabelnamn (slug), värde (yosemite-backpacking) och specialteckenkodningar.
http://localhost:3000 och INTE mot AEM Publish Service kan du gå igenom under värddatorn från den grundläggande självstudiekursen.Granska koden
I den grundläggande självstudiekursen - Bygg en React-app där AEM GraphQL API:er används har vi granskat och förbättrat några viktiga filer så att vi får expertis. Granska nyckelfilerna innan du förbättrar WKND-appen.
Granska Adventures-reaktionskomponent
Huvudvyn i appen WKND React är listan över alla annonser och du kan filtrera dessa annonser baserat på aktivitetstyp som Camping, Cycling. Den här vyn återges av komponenten Adventures. Nedan finns de viktigaste implementeringsdetaljerna:
-
src/components/Adventures.jsanroparuseAllAdventures(adventureActivity)-kroken och häradventureActivity-argumentet är aktivitetstyp. -
Koppeln
useAllAdventures(adventureActivity)definieras i filensrc/api/usePersistedQueries.js. Baserat på värdetadventureActivityavgör det vilken beständig fråga som ska anropas. Om värdet inte är null anropaswknd-shared/adventures-by-activity, annars får alla tillgängliga äventyrwknd-shared/adventures-all. -
Haken använder huvudfunktionen
fetchPersistedQuery(..)som delegerar frågekörningen tillAEMHeadlessviaaemHeadlessClient.js. -
Haken returnerar bara relevanta data från AEM GraphQL-svaret på
response.data?.adventureList?.items, vilket gör att komponenterna i vynAdventureskan vara agnostiska för de överordnade JSON-strukturerna. -
Vid slutförd frågekörning lägger renderingsfunktionen
AdventureListItem(..)frånAdventures.jstill HTML-element för att visa informationen Bild, Trip Length, Price och Title.
Granska AdventureDetail-reaktionskomponent
Reaktionskomponenten AdventureDetail återger informationen om äventyret. Nedan finns de viktigaste implementeringsdetaljerna:
-
Argumentet
src/components/AdventureDetail.jsanroparuseAdventureBySlug(slug)-krok och härslugär frågeparameter. -
Precis som ovan definieras kroken
useAdventureBySlug(slug)i filensrc/api/usePersistedQueries.js. Den anroparwknd-shared/adventure-by-slugbeständig fråga genom delegering tillAEMHeadlessviaaemHeadlessClient.js. -
När frågan har körts lägger återgivningsfunktionen
AdventureDetailRender(..)frånAdventureDetail.jstill HTML-element för att visa Adventure-informationen.
Förbättra koden
Använd adventure-details-by-slug beständig fråga
I det föregående kapitlet skapade vi den adventure-details-by-slug beständiga frågan, som innehåller ytterligare Adventure-information som location, instructorTeam och administrator. Låt oss ersätta adventure-by-slug med adventure-details-by-slug beständig fråga för att återge denna ytterligare information.
-
Öppna
src/api/usePersistedQueries.js. -
Leta reda på funktionen
useAdventureBySlug()och uppdatera frågan som
...
// Call the AEM GraphQL persisted query named "wknd-shared/adventure-details-by-slug" with parameters
response = await fetchPersistedQuery(
"wknd-shared/adventure-details-by-slug",
queryParameters
);
...
Visa ytterligare information
-
Om du vill visa ytterligare äventyrsinformation öppnar du
src/components/AdventureDetail.js -
Leta reda på funktionen
AdventureDetailRender(..)och uppdatera returfunktionen somcode language-javascript ... return (<> <h1 className="adventure-detail-title">{title}</h1> <div className="adventure-detail-info"> <LocationInfo {...location} /> ... <Location {...location} /> <Administrator {...administrator} /> <InstructorTeam {...instructorTeam} /> </div> </>); ... -
Definiera även motsvarande återgivningsfunktioner:
LocationInfo
code language-javascript function LocationInfo({name}) { if (!name) { return null; } return ( <> <div className="adventure-detail-info-label">Location</div> <div className="adventure-detail-info-description">{name}</div> </> ); }Plats
code language-javascript function Location({ contactInfo }) { if (!contactInfo) { return null; } return ( <> <div className='adventure-detail-location'> <h2>Where we meet</h2> <hr /> <div className="adventure-detail-addtional-info">Phone:{contactInfo.phone}</div> <div className="adventure-detail-addtional-info">Email:{contactInfo.email}</div> </div> </>); }InstructorTeam
code language-javascript function InstructorTeam({ _metadata }) { if (!_metadata) { return null; } return ( <> <div className='adventure-detail-team'> <h2>Instruction Team</h2> <hr /> <div className="adventure-detail-addtional-info">Team Name: {_metadata.stringMetadata[0].value}</div> </div> </>); }Administratör
code language-javascript function Administrator({ fullName, contactInfo }) { if (!fullName || !contactInfo) { return null; } return ( <> <div className='adventure-detail-administrator'> <h2>Administrator</h2> <hr /> <div className="adventure-detail-addtional-info">Name: {fullName}</div> <div className="adventure-detail-addtional-info">Phone: {contactInfo.phone}</div> <div className="adventure-detail-addtional-info">Email: {contactInfo.email}</div> </div> </>); }
Definiera nya format
-
Öppna
src/components/AdventureDetail.scssoch lägg till följande klassdefinitionercode language-css .adventure-detail-administrator, .adventure-detail-team, .adventure-detail-location { margin-top: 1em; width: 100%; float: right; } .adventure-detail-addtional-info { padding: 10px 0px 5px 0px; text-transform: uppercase; }
När du har slutfört förbättringarna ovan ser WKND-appen ut så här nedan och webbläsarens utvecklarverktyg visar adventure-details-by-slug beständiga frågeanrop.
Utökad utmaning (valfritt)
I huvudvyn i appen WKND React kan du filtrera dessa annonser baserat på aktivitetstyp som Camping, Cycling. WKND:s affärsteam vill dock ha en extra Location-baserad filtreringsfunktion. Kraven är
- I huvudvyn för WKND-programmet lägger du till filterikonen Plats i det övre vänstra eller högra hörnet.
- Om du klickar på Plats-filtreringsikonen visas en lista med platser.
- Om du klickar på ett önskat platsalternativ i listan visas endast matchande annonser.
- Om det bara finns en matchande Adventure visas Adventure Details-vyn.
Grattis
Grattis! Du har nu slutfört integreringen och implementeringen av de beständiga frågorna i WKND-exempelappen.