Créer une application React avec les OpenAPI de diffusion de fragments de contenu AEM
Dans ce chapitre, vous découvrirez comment la diffusion de fragments de contenu AEM avec des API OpenAPI peut améliorer l’expérience des applications externes.
Une application React simple est utilisée pour demander et afficher du contenu Équipe et Personne exposé par la diffusion de fragments de contenu AEM avec les API OpenAPI. L’utilisation de React n’est pas vraiment importante, et l’application externe consommatrice peut être écrite dans n’importe quel framework pour n’importe quelle plateforme, à condition qu’elle puisse envoyer des requêtes HTTP à AEM as a Cloud Service.
Prérequis
Nous partons du principe que les étapes décrites dans les parties précédentes de ce tutoriel en plusieurs parties ont été terminées.
Les logiciels suivants doivent être installés :
Objectifs
Découvrez comment :
- Téléchargez et démarrez l’exemple d’application React.
- Appelez la diffusion de fragments de contenu AEM avec les API OpenAPI pour obtenir la liste des équipes et des membres référencés.
- Appelez la diffusion de fragments de contenu AEM avec les API OpenAPI pour récupérer les détails d’un membre de l’équipe.
Configurer CORS sur AEM as a Cloud Service
Cet exemple d’application React s’exécute localement (sur http://localhost:3000
) et se connecte à la diffusion de fragments de contenu AEM du service de publication AEM avec les API OpenAPI. Pour autoriser cette connexion, CORS (partage de ressources entre origines multiples) doit être configuré sur le service de publication (ou d’aperçu) AEM.
Proxy CORS local
Pour le développement, vous pouvez également exécuter un proxy CORS local qui installe une connexion CORS à AEM.
$ npm install --global lcp
$ lcp --proxyUrl https://publish-p<PROGRAM_ID>-e<ENVIRONMENT_ID>.adobeaemcloud.com
Mettez à jour la valeur --proxyUrl
vers votre URL de publication (ou de prévisualisation) AEM.
Une fois le proxy CORS local en cours d’exécution, accédez aux API de diffusion de fragments de contenu d’AEM à l’adresse http://localhost:8010/proxy
pour éviter les problèmes CORS.
Clonez l’exemple d’application React
Un exemple d’application React qui fait l’objet d’un bouchon est implémenté avec le code requis pour interagir avec la diffusion de fragments de contenu AEM avec les API OpenAPI et afficher les données de l’équipe et de la personne obtenues de leur part.
L’exemple de code source de l’application React est disponible sur Github.com.
Pour obtenir l’application React :
-
Clonez l’exemple d’application React OpenAPI WKND à partir de Github.com à partir de la balise
headless_open-api_basic
.code language-shell $ cd ~/Code $ git clone git@github.com:adobe/aem-tutorials.git $ cd aem-tutorials $ git fetch --tags $ git tag $ git checkout tags/headless_open-api_basic
-
Accédez au fichier
headless/open-api/basic
et ouvrez-le dans votre IDE.code language-shell $ cd ~/Code/aem-tutorials/headless/open-api/basic $ code .
-
Mettez à jour
.env
pour vous connecter au service de publication AEM as a Cloud Service, car c’est là que nos fragments de contenu sont publiés. Cela peut pointer vers le service d’aperçu AEM si vous souhaitez tester l’application avec le service d’aperçu AEM (et les fragments de contenu y sont publiés).code language-none # AEM Publish (or Preview) service that provides Content Fragments REACT_APP_HOST_URI=https://publish-p123-e456.adobeaemcloud.com
Lors de l’utilisation du proxy CORS local, définissez
REACT_APP_HOST_URI
surhttp://localhost:8010/proxy
.code language-none # AEM Publish (or Preview) service that provides Content Fragments REACT_APP_HOST_URI=http://localhost:8010/proxy
-
Démarrer l’application React
code language-shell $ cd ~/Code/aem-tutorials/headless/open-api/basic $ npm install $ npm start
-
L’application React démarre en mode de développement le http://localhost:3000/. Les modifications apportées à l’application React tout au long du tutoriel sont répercutées immédiatement dans le navigateur web.
> // Tâche : implémentez ceci en suivant les étapes du tutoriel AEM Headless.
> // *****************************
Anatomie de l’application React
L’exemple d’application React comporte trois parties principales qui doivent être mises à jour.
- Le fichier
.env
contient l’URL du service de publication AEM (ou de prévisualisation). - La
src/components/Teams.js
affiche une liste des équipes et de leurs membres. - La
src/components/Person.js
affiche les détails d’un seul membre de l’équipe.
Implémenter la fonctionnalité Équipes
Développez la fonctionnalité pour afficher les équipes et leurs membres sur la vue principale de l’application React. Cette fonctionnalité requiert :
- Un nouveau hook personnalisé React useEffect qui appelle l’API List all Content Fragments via une requête de récupération, puis obtient la valeur
fullName
de chaqueteamMember
à afficher.
Une fois l’opération terminée, la vue principale de l’application est renseignée avec les données de l’équipe provenant d’AEM.
-
Ouvrez
src/components/Teams.js
. -
Implémentez le composant Équipes pour récupérer la liste des équipes à partir de Répertorier toutes les API de fragments de contenu et effectuer le rendu du contenu des équipes. Elle se compose des étapes suivantes :
-
Créez un hook
useEffect
qui appelle l’API AEM Liste de tous les fragments de contenu et stocke les données dans l’état du composant React. -
Pour chaque Équipe fragment de contenu renvoyé, appelez l’API Obtenir un fragment de contenu pour récupérer les détails complets de l’équipe, y compris ses membres et leurs
fullNames
. -
Restituer les données des équipes à l’aide de la fonction
Team
code language-javascript import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import "./Teams.scss"; function Teams() { // The teams folder is the only folder-tree that is allowed to contain Team Content Fragments. const TEAMS_FOLDER = '/content/dam/my-project/en/teams'; // State to store the teams data const [teams, setTeams] = useState(null); useEffect(() => { /** * Fetches all teams and their associated member details * This is a two-step process: * 1. First, get all team content fragments from the specified folder * 2. Then, for each team, fetch the full details including hydrated references to get the team member names */ const fetchData = async () => { try { // Step 1: Fetch all teams from the teams folder const response = await fetch( `${process.env.REACT_APP_HOST_URI}/adobe/contentFragments?path=${TEAMS_FOLDER}` ); const allTeams = (await response.json()).items || []; // Step 2: Fetch detailed information for each team with hydrated references const hydratedTeams = []; for (const team of allTeams) { const hydratedTeamResponse = await fetch( `${process.env.REACT_APP_HOST_URI}/adobe/contentFragments/${team.id}?references=direct-hydrated` ); hydratedTeams.push(await hydratedTeamResponse.json()); } setTeams(hydratedTeams); } catch (error) { console.error("Error fetching content fragments:", error); } }; fetchData(); }, [TEAMS_FOLDER]); // Show loading state while teams data is being fetched if (!teams) { return <div>Loading teams...</div>; } // Render the teams return ( <div className="teams"> {teams.map((team, index) => { return ( <Team key={index} {..team} /> ); })} </div> ); } /** * Team component - renders a single team with its details and members * @param {string} fields - The authorable fields * @param {Object} references - Hydrated references containing member details such as fullName */ function Team({ fields, references, path }) { if (!fields.title || !fields.teamMembers) { return null; } return ( <div className="team"> <h2 className="team__title">{fields.title}</h2> {/* Render description as HTML using dangerouslySetInnerHTML */} <p className="team__description" dangerouslySetInnerHTML={{ __html: fields.description.value }} /> <div> <h4 className="team__members-title">Members</h4> <ul className="team__members"> {/* Render each team member as a link to their detail page */} {fields.teamMembers.map((teamMember, index) => { return ( <li key={index} className="team__member"> <Link to={`/person/${teamMember}`}> {/* Display the full name from the hydrated reference */} {references[teamMember].value.fields.fullName} </Link> </li> ); })} </ul> </div> </div> ); } export default Teams;
Implémenter la fonctionnalité de personne
Lorsque la fonctionnalité Équipesterminée, implémentez la fonctionnalité permettant de gérer l’affichage sur les détails d’un ou d’une membre de l’équipe, ou d’une personne.
Pour ce faire :
-
Ouvrez
src/components/Person.js
. -
Dans le composant React
Person
, analysez le paramètre d’itinéraireid
. Notez que les Itinéraires de l’application React ont été précédemment configurés pour accepter le paramètre d’URLid
(voir/src/App.js
). -
Récupérez les données de personne d’AEM à l’aide de l’API Get Content Fragment.
code language-javascript import "./Person.scss"; import { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; /** * Person component - displays detailed information about a single person * Fetches person data from AEM using the ID from the URL parameters */ function Person() { // Get the person ID from the URL parameter const { id } = useParams(); // State to store the person data const [person, setPerson] = useState(null); useEffect(() => { /** * Fetches person data from AEM Content Fragment Delivery API * Uses the ID from URL parameters to get the specific person's details */ const fetchData = async () => { try { /* Hydrate references for access to profilePicture asset path */ const response = await fetch( `${process.env.REACT_APP_HOST_URI}/adobe/contentFragments/${id}?references=direct-hydrated` ); const json = await response.json(); setPerson(json || null); } catch (error) { console.error("Error fetching person data:", error); } }; fetchData(); }, [id]); // Re-fetch when ID changes // Show loading state while person data is being fetched if (!person) { return <div>Loading person...</div>; } return ( <div className="person"> {/* Person profile image - Look up the profilePicture reference in the references object */} <img className="person__image" src={process.env.REACT_APP_HOST_URI + person.references[person.fields.profilePicture].value.path} alt={person.fields.fullName} /> {/* Display person's occupations */} <div className="person__occupations"> {person.fields.occupation.map((occupation, index) => { return ( <span key={index} className="person__occupation"> {occupation} </span> ); })} </div> {/* Person's main content: name and biography */} <div className="person__content"> <h1 className="person__full-name">{person.fields.fullName}</h1> {/* Render biography as HTML content */} <div className="person__biography" dangerouslySetInnerHTML={{ __html: person.fields.biographyText.value }} /> </div> </div> ); } export default Person;
Obtenir le code terminé
Le code source complet de ce chapitre est disponible sur Github.com.
$ git fetch --tags
$ git tag
$ git checkout tags/headless_open-api_basic_4-end
Essayer l’application
Vérifiez l’application http://localhost:3000/ et cliquez sur les liens Membre de l’équipe. Vous pouvez également ajouter d’autres équipes et/ou membres à l’équipe Alpha en ajoutant des fragments de contenu dans le service de création AEM et en les publiant.
Ce qui se passe.
Ouvrez la console Outils de développement > Réseau du navigateur et Filtrer pour récupérer /adobe/contentFragments
requêtes lorsque vous interagissez avec l’application React.
Félicitations !
Félicitations. Vous avez créé une application React pour utiliser et afficher des fragments de contenu à partir de la diffusion de fragments de contenu AEM avec les API OpenAPI.