[AEM Forms]{class="badge positive" title="S’applique à AEM Forms)."}
Intégration de l’API dans l’éditeur de règles
L’intégration de l’API dans l’éditeur de règles se trouve dans le programme des utilisateurs précoces. Vous pouvez écrire à aem-forms-ea@adobe.com depuis votre adresse e-mail officielle pour rejoindre le programme d’accès anticipé et demander l’accès à la fonctionnalité.
L’éditeur visuel de règles d’un Forms adaptatif prend en charge l’intégration directe d’API sans créer de modèle de données de formulaire. Vous pouvez vous connecter à un point d’entrée de l’API en saisissant l’URL de l’API (au format JSON) ou en important la configuration via une commande cURL. Une fois intégrée, l’action Invoke Service peut être utilisée pour appeler l’API.
Les champs de formulaire peuvent être mappés directement aux paramètres d’entrée définis dans la configuration de l’API. De même, les paramètres de sortie peuvent être mappés à des champs de formulaire à l’aide de l’option payload d’événement pour la réponse d’API correspondante.
En outre, l’éditeur visuel de règles vous permet de définir des gestionnaires succès et échec lors de l’appel d’un service. Les gestionnaires de succès spécifient les actions à exécuter après un appel API réussi, tandis que les gestionnaires d’échec définissent la manière dont le formulaire doit répondre lorsqu’une erreur se produit.
Comparaison : méthodes d’intégration d’API
Configuration d’intégration d’API
La capture d’écran ci-dessous affiche la fenêtre de configuration de l’intégration API :
Principales options de configuration
Configuration de l’intégration de l’API
- Importer depuis cURL : configurez votre intégration d’API en collant une commande cURL prête à l’emploi au lieu de saisir manuellement des détails tels que l’URL de l’API, la méthode HTTP, les en-têtes et les paramètres.
- Nom d’affichage : nom personnalisé du service API.
- URL de l’API : point d’entrée du service d’API.
- Sélectionner la méthode HTTP : méthode de requête HTTP utilisée pour appeler l’API.
- Type de contenu : définit le format de requête et de réponse.
- Chiffrement requis : (facultatif) lorsque cette option est sélectionnée, les payloads de requête et de réponse peuvent être chiffrées à l’aide de fonctions personnalisées dans function.js. Un champ Clé publique s’affiche. Collez votre clé publique dans ce champ avant d’enregistrer la configuration de l’intégration de l’API.
- Exécuter sur le client : lorsqu’il est activé, l’appel API est effectué à partir du client (navigateur) plutôt que du serveur.
Type d’authentification
- Options : aucune, de base, clé API.
Paramètres d’entrée
-
Charger le fichier JSON pour l’entrée : chargez un exemple de fichier JSON pour renseigner automatiquement les mappages d’entrée.
- Name : nom du paramètre d’entrée requis par l’API.
- Type : type de données de l’entrée (chaîne, nombre, valeur booléenne, etc.).
- In : emplacement du paramètre (requête, en-tête ou corps).
- Valeur par défaut : valeur préremplie si elle n’est pas fournie par l’utilisateur.
- Ajouter : option permettant d’ajouter des paramètres d’entrée supplémentaires.
Paramètres de sortie
-
Charger JSON pour Output : chargez un exemple de réponse d’API pour générer automatiquement des mappages.
- Name : nom du paramètre de sortie de la réponse de l’API.
- Type : type de données attendu du paramètre de sortie (chaîne, nombre, etc.).
- In : définit l’endroit où la valeur mappée est attendue.
- Ajouter/Supprimer : ajoutez de nouveaux mappages ou supprimez des mappages existants.
Cas pratique : remplir les champs Pays dans un formulaire de demande de visa
Scénario : Une agence gouvernementale fournit un formulaire de demande de visa en ligne avec les champs suivants :
- Nom Complet (Texte)
- Date de naissance (Date)
- Pays de nationalité (liste déroulante)
- Numéro De Passeport (Texte)
- Pays de délivrance du passeport (liste déroulante)
- Pays de destination (liste déroulante)
- Date prévue d’arrivée (date)
Au lieu de conserver une liste statique de pays, le formulaire récupère dynamiquement les informations de pays (continent, capitale, codes ISO Alpha, etc.) à l’aide de l’API getcounname :
https://secure.geonames.org/countryInfoJSON?username=aemforms
Cela garantit que les candidats voient toujours une liste actualisée et précise des pays tout en remplissant le formulaire.
Implémentation à l’aide de l’intégration d’API dans l’éditeur de règles
Vous pouvez intégrer une API sans créer de modèle de données de formulaire en cliquant sur le bouton Créer une intégration d’API dans l’éditeur de règles.
Un service d’API nommé getcontendname est configuré sous Configuration de l’intégration de l’API dans l’éditeur de règles :
- URL du point d’entrée de l’API →
https://secure.geonames.org/countryInfoJSON?username=aemforms - Méthode HTTP → GET
- Type de contenu → JSON
- Input →
usernametransmis en tant que paramètre de requête (aemforms). - Output → les champs de réponse tels que
continent,capital,countrynames,isoAlpha3etlanguagessont mappés aux champs de formulaire.
Dans le Formulaire de demande de visa, les trois champs déroulants Pays de citoyenneté, Pays de délivrance du passeport et Pays de destination sont liés à l’action Invoquer le service.
Lorsque le formulaire se charge, la fonction Invoquer le service récupère la liste des pays à partir de l’API. La réponse est ensuite mappée pour renseigner automatiquement les options de liste déroulante.
Par exemple, lorsque l’utilisateur ouvre Pays de citoyenneté, la liste des pays s’affiche de manière dynamique à partir de la réponse de l’API.
De même, les Pays d’émission du passeport et Pays de destination utilisent le même appel API, ce qui garantit des données cohérentes et à jour dans les trois champs.
Modifier une intégration d’API existante
Après avoir créé une intégration d’API, vous pouvez la mettre à jour à partir de l’éditeur de règles sans créer de nouvelle intégration. Lorsqu’une instruction Invoke Service fait référence à une intégration d’API, une option Modifier est disponible pour cette intégration.
Pour modifier une intégration d’API existante :
- Ouvrez la règle dans l’éditeur de règles qui contient une instruction Invoke Service.
- Dans l’instruction Invoke Service, sélectionnez l’intégration d’API à mettre à jour.
- Cliquez sur l’icône Modifier pour ouvrir la fenêtre Configuration de l’intégration de l’API.
- Mettez à jour l’URL d’API, les paramètres d’authentification, d’entrée et de sortie, ou d’autres paramètres, et enregistrez vos modifications.
Chiffrement et déchiffrement
Lorsque Chiffrement requis est sélectionné pour une intégration d’API, collez votre clé publique dans le champ Clé publique de la fenêtre de configuration de l’intégration d’API. L’éditeur de règles appelle chiffrer avant chaque requête sortante et déchiffrer après une réponse réussie. Si vous n’ajoutez pas de logique personnalisée dans function.js, les deux fonctions renvoient la payload inchangée.
Pour chiffrer et déchiffrer les données de requête et de réponse, ajoutez les fonctions chiffrer et déchiffrer à function.js :
- Ouvrez le fichier function.js pour votre formulaire adaptatif.
- Ajoutez une fonction encrypt pour transformer la requête (corps, en-têtes et options associées) avant l’appel API.
- Ajoutez une fonction decrypt pour transformer la réponse après un appel API réussi. La fonction decrypt reçoit la réponse chiffrée et originalRequest, qui inclut toutes les cryptoMetadata définies pendant le chiffrement.
- Enregistrez function.js, puis testez l’intégration à l’aide de Invoke Service dans l’éditeur de règles.
L’exemple de code suivant montre comment ajouter la fonction encrypt dans function.js :
function encrypt(payload) {
const { body, headers, options } = payload;
const { encryptedBody, encryptedKey } = await myRsaEncrypt(body);
return {
body: encryptedBody,
headers: { ...headers, 'X-Encrypted-Key': encryptedKey },
cryptoMetadata: { keyId: 'rsa-2048-v1' },
options
};
}
chiffrer (hook de payload de pré-requête)
La fonction encrypt reçoit un objet de payload avec body, headers, cryptoMetadata et options facultatifs. Elle renvoie une version modifiée de la même forme. Le champ options transfère les paramètres de l’API de récupération (par exemple, credentials: 'include') via le pipeline de requêtes. Les valeurs de options sont appliquées à l’appel fetch() sous-jacent. Le champ cryptoMetadata stocke les données à utiliser lors du déchiffrement. Tout ce que vous définissez dans cryptoMetadata pendant le chiffrement est conservé dans originalRequest.cryptoMetadata et mis à la disposition de la fonction decrypt ultérieurement. Malgré son nom, encrypt est un transformateur de pré-requête général. Vous pouvez l’utiliser pour modifier les en-têtes ou le corps de la requête, pas seulement pour le chiffrement cryptographique. L’implémentation par défaut renvoie la payload inchangée.
>>
L’exemple de code suivant illustre une fonction decrypt :
function decrypt(encryptedData, originalRequest) {
const { keyId } = originalRequest?.cryptoMetadata || {};
return await myRsaDecrypt(encryptedData, keyId);
}
déchiffrer (hook de réponse de post-requête)
La fonction decrypt s’exécute après une réponse réussie. Il reçoit le corps de la réponse et originalRequest. L’objet originalRequest comprend cryptoMetadata provenant de votre fonction encrypt, ainsi que url, method et d’autres métadonnées de requête. Il doit renvoyer le corps déchiffré de manière synchrone ou asynchrone. L’implémentation par défaut renvoie les données inchangées. La fonction decrypt s’exécute uniquement en cas de réponses réussies. Les réponses d’erreur n’appellent pas déchiffrer.
myRsaEncrypt et myRsaDecrypt par vos fonctions de chiffrement.Mise en œuvre du mécanisme de reprise en cas d’échec de l’API
Lorsqu’une requête d’API échoue, il est souvent utile de relancer la requête avant de signaler une erreur à l’utilisateur. Vous pouvez implémenter un mécanisme d’interrogation et de reprise en écrivant du code personnalisé dans le fichier function.js.
L’exemple suivant montre comment gérer les échecs d’API avec jusqu’à deux tentatives de reprise et un retour exponentiel entre les reprises :
/**
* Handles request retries with up to 2 retry attempts
* @param {function} requestFn - The request function to execute
* @return {Promise} A promise that resolves with the response or rejects after all retries
*/
function retryHandler(requestFn) {
const MAX_RETRIES = 2;
/**
* Attempts the request with retry metadata
* @param {number} retryCount - Current retry attempt count
* @return {Promise} The request promise
*/
function attemptRequest(retryCount = 0) {
// Include retry metadata if this is a retry
const requestOptions = retryCount > 0 ? {
headers: {
'X-Retry': 'true',
'X-Retry-Count': retryCount.toString(),
'X-Retry-Time': new Date().toISOString()
},
body: {
retry: true,
retryCount: retryCount,
timestamp: Date.now()
}
} : undefined;
return requestFn(requestOptions)
.then(function(response) {
if (response && response.status >= 400) {
console.warn('Request failed with status ' + response.status);
throw new Error('Request failed with status ' + response.status);
}
return response;
})
.catch(function(error) {
console.warn('Request attempt ' + (retryCount + 1) + ' failed:', error.message);
// Retry if max attempts not reached
if (retryCount < MAX_RETRIES) {
console.log('Retrying request, attempt ' + (retryCount + 2) + ' of ' + (MAX_RETRIES + 1));
// Exponential backoff delay: 1s, 2s, 4s...
const delay = Math.pow(2, retryCount) * 1000;
return new Promise(function(resolve) {
setTimeout(resolve, delay);
}).then(function() {
return attemptRequest(retryCount + 1);
});
} else {
// All retries exhausted
console.error('All retry attempts failed. Final error:', error.message);
throw new Error('Request failed after ' + (MAX_RETRIES + 1) + ' attempts: ' + error.message);
}
});
}
// Start the first attempt
return attemptRequest(0);
}
Dans le code ci-dessus, la fonction retryHandler gère les requêtes d’API avec des reprises automatiques en cas d’échec. Il prend une fonction de requête (requestFn) et tente de soumettre la requête jusqu’à deux fois, en ajoutant des métadonnées pour chaque nouvelle tentative.
Questions fréquentes
-
Dois-je créer un modèle de données de formulaire pour intégrer une API dans le Forms adaptatif ?
Non. Avec l’éditeur visuel de règles, vous pouvez directement intégrer des API à l’aide de l’option Créer une intégration d’API sans créer de modèle de données de formulaire. Cette approche est idéale pour les cas d’utilisation légers ou spécifiques aux formulaires. -
Puis-je sécuriser les appels API effectués à partir de l’éditeur de règles ?
Oui. La configuration de l’intégration d’API fournit des options d’authentification telles que De base et Clé API. Vous pouvez également sélectionner Chiffrement requis et ajouter une logique chiffrer et déchiffrer personnalisée dans function.js. Pour obtenir des étapes de configuration et des exemples, voir Chiffrement et déchiffrement.