Antipattern: richiamare le chiamate API Apigee da un proxy API
Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Stai visualizzando la documentazione di Apigee e Apigee hybrid.
Visualizza la documentazione di
Apigee Edge.
Apigee dispone di una potente utility chiamata API Apigee che offre servizi come:
Deployment o annullamento del deployment di proxy API
Configurazione di host virtuali, keystore e truststore e così via
Creazione, eliminazione e aggiornamento di entità come mappe chiave/valore (KVM), prodotti API, app sviluppatore, sviluppatori, chiavi consumer e così via
Recupero delle informazioni su queste entità
Questi servizi sono resi accessibili tramite un componente chiamato Management Server nella
piattaforma Apigee. Questi servizi possono essere richiamati facilmente con l'aiuto di semplici chiamate API.
A volte potremmo dover utilizzare uno o più di questi servizi dai proxy API in fase di esecuzione. Questo accade perché entità come KVM, token di accesso OAuth, prodotti API, app per sviluppatori, sviluppatori, chiavi consumer e così via contengono informazioni utili sotto forma di coppie chiave-valore, attributi personalizzati o come parte del profilo.
Ad esempio, puoi memorizzare le seguenti informazioni in un KVM per renderlo più sicuro e accessibile in fase di esecuzione:
URL target di backend
Proprietà dell'ambiente
Le credenziali di sicurezza dei sistemi di backend o di terze parti
Analogamente, potresti voler ottenere l'elenco dei prodotti API o l'indirizzo email dello sviluppatore in fase di esecuzione.
Queste informazioni saranno disponibili nel profilo delle app dello sviluppatore.
Tutte queste informazioni possono essere utilizzate efficacemente in fase di esecuzione per attivare un comportamento dinamico nei criteri o nel codice personalizzato all'interno di Apigee.
Antipattern
Le API Apigee sono preferite e utili per le attività amministrative e non devono essere utilizzate per eseguire qualsiasi logica di runtime nel flusso dei proxy API. I motivi sono i seguenti:
L'utilizzo delle API Apigee per accedere a informazioni su entità come KVM, token di accesso OAuth o per qualsiasi altro scopo dai proxy API comporta la dipendenza dai server di gestione.
I server di gestione non fanno parte dei componenti di runtime di Apigee e, pertanto, potrebbero non essere
altamente disponibili.
Inoltre, il provisioning dei server di gestione potrebbe non essere eseguito all'interno della stessa rete o dello stesso data center e quindi potrebbe essere introdotta una latenza di rete in fase di esecuzione.
Le voci nei server di gestione vengono memorizzate nella cache per un periodo di tempo più lungo, pertanto potresti non essere in grado di visualizzare immediatamente i dati più recenti nei proxy API se esegui scritture e letture in un breve periodo di tempo.
Aumenta i hop di rete in fase di esecuzione.
Nell'esempio di codice seguente, la chiamata all'API Apigee viene effettuata tramite il codice JavaScript personalizzato per recuperare le informazioni dalla KVM:
Se il server di gestione non è disponibile, il codice JavaScript che richiama la chiamata all'API Apigee non va a buon fine. Di conseguenza, la richiesta API non va a buon fine.
Impatto
Introduce una dipendenza aggiuntiva dai server di gestione durante il runtime. Eventuali errori nei server di gestione influiranno sulle chiamate API.
Le credenziali utente per le API Apigee devono essere archiviate localmente o in un archivio sicuro come una KVM criptata.
Implicazioni sulle prestazioni dovute all'invocazione del servizio di gestione sulla rete.
I valori aggiornati potrebbero non essere visualizzati immediatamente a causa della scadenza più lunga della cache nei server di gestione.
Best practice
Esistono metodi più efficaci per recuperare informazioni da entità come KVM, prodotti API, app per sviluppatori, sviluppatori, chiavi consumer e così via in fase di esecuzione. Ecco alcuni esempi:
Utilizza una policy KeyValueMapOperations per accedere alle informazioni delle mappe KeyValue. Ecco un codice campione
che mostra come recuperare le informazioni dal KVM:
Per accedere alle informazioni su prodotti API, app per sviluppatori, sviluppatori, chiavi consumer e così via
nel proxy API, puoi eseguire una delle seguenti operazioni:
Se il flusso API Proxy ha un regolamento VerifyAPIKey, puoi accedere alle informazioni
utilizzando le variabili di flusso compilate nell'ambito di questo regolamento. Ecco un codice campione che mostra
come recuperare il nome e le informazioni create_by di un'app per sviluppatori utilizzando JavaScript:
<!--/antipatterns/examples/2-7.xml-->
print("Application Name ",context.getVariable(""verifyapikey.VerifyAPIKey.app.name"));print("Createdby:", context.getVariable("verifyapikey.VerifyAPIKey.app.created_by"));
Se il flusso del proxy API non ha un regolamento VerifyAPIKey, puoi accedere ai
profili dei prodotti API, delle app per sviluppatori e così via utilizzando i regolamenti AccessEntity e ExtractVariables:
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Difficile da capire","hardToUnderstand","thumb-down"],["Informazioni o codice di esempio errati","incorrectInformationOrSampleCode","thumb-down"],["Mancano le informazioni o gli esempi di cui ho bisogno","missingTheInformationSamplesINeed","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-09-05 UTC."],[[["\u003cp\u003eThe Apigee API is designed for administrative tasks and should not be used for runtime logic within API proxies, as it creates dependency on the Management Servers.\u003c/p\u003e\n"],["\u003cp\u003eRelying on Apigee APIs at runtime can cause performance issues and introduce network latencies because Management Servers are not part of the runtime components and may not be in the same network or data center.\u003c/p\u003e\n"],["\u003cp\u003eDirect calls to Management Servers can lead to outdated data being retrieved by API proxies due to longer caching periods, affecting data accuracy.\u003c/p\u003e\n"],["\u003cp\u003eFor accessing information at runtime, it is more effective to use policies like \u003ccode\u003eKeyValueMapOperations\u003c/code\u003e for KVM data or flow variables from the \u003ccode\u003eVerifyAPIKey\u003c/code\u003e policy for API products and developer app information, instead of calling the Apigee API.\u003c/p\u003e\n"],["\u003cp\u003eIf \u003ccode\u003eVerifyAPIKey\u003c/code\u003e policy is not in use, \u003ccode\u003eAccessEntity\u003c/code\u003e and \u003ccode\u003eExtractVariables\u003c/code\u003e policies are preferred for retrieving profiles of entities like developer apps during runtime, ensuring efficient access to needed information.\u003c/p\u003e\n"]]],[],null,["# Antipattern: Invoke Apigee API calls from an API proxy\n\n*You're viewing **Apigee** and **Apigee hybrid** documentation.\nView [Apigee Edge](https://docs.apigee.com/api-platform/antipatterns/invoking-management) documentation.*\n\nApigee has a powerful utility called the [Apigee API](/apigee/docs/reference/apis/apigee/rest) which offers services such as:\n\n- Deploying or undeploying API proxies\n- Configuring virtual hosts, keystores and truststores, and so on\n- Creating, deleting and updating entities such as key value maps (KVMs), API products, developer apps, developers, consumer keys, and so on\n- Retrieving information about these entities\n\nThese services are made accessible through a component called *Management Server* in the\nApigee platform. These services can be invoked easily with the help of simple API\ncalls.\n\nSometimes we may need to use one or more of these services from API proxies at runtime. This is\nbecause the entities such as KVMs, OAuth access tokens, API products, developer apps,\ndevelopers, consumer keys, and so on contain useful information in the form of key-value pairs, custom\nattributes or as part of its profile.\n\nFor instance, you can store the following information in a KVM to make it more secure and\naccessible at runtime:\n\n- Back-end target URLs\n- Environment properties\n- Security credentials of backend or third party systems\n\nSimilarly, you may want to get the list of API products or the developer's email address at runtime.\nThis information will be available as part of the developer apps profile.\n\nAll this information can be effectively used at runtime to enable dynamic behaviour in policies\nor custom code within Apigee.\n\nAntipattern\n-----------\n\nThe Apigee APIs are preferred and useful for administrative tasks and should not be used for\nperforming any runtime logic in API proxies flow. This is because:\n\n- Using Apigee APIs to access information about the entities such as KVMs, OAuth access tokens or for any other purpose from API proxies leads to dependency on Management Servers.\n- Management Servers are not a part of Apigee runtime components and therefore, they may not be highly available.\n- Management Servers also may not be provisioned within the same network or data center and may therefore introduce network latencies at runtime.\n- The entries in the Management Servers are cached for a longer period of time, so you may not be able to see the latest data immediately in the API proxies if you perform writes and reads in a short period of time.\n- Increases network hops at runtime.\n\nIn the code sample below, the Apigee API call is made via the custom JavaScript code to\nretrieve the information from the KVM: \n\n```gdscript\nvar response = httpClient.send('https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/keyvaluemaps')\n```\n\nIf the Management Server is unavailable, then the JavaScript code invoking the Apigee API\ncall fails. This subsequently causes the API request to fail.\n\nImpact\n------\n\n- Introduces additional dependency on Management Servers during runtime. Any failure in Management Servers will affect the API calls.\n- User credentials for Apigee APIs need to be stored either locally or in some secure store such as an encrypted KVM.\n- Performance implications owing to invoking the management service over the network.\n- May not see the updated values immediately due to longer cache expiration in Management Servers.\n\nBest practice\n-------------\n\nThere are more effective ways of retrieving information from entities such as KVMs, API\nproducts, developer apps, developers, consumer keys, and so on at runtime. Here are a few examples:\n\n- Use a [KeyValueMapOperations policy](/apigee/docs/api-platform/reference/policies/key-value-map-operations-policy) to access information from KVMs. Here's sample code that shows how to retrieve information from the KVM: \n\n ```verilog\n \u003c!-- /antipatterns/examples/2-6.xml --\u003e\n \u003cKeyValueMapOperations mapIdentifier=\"urlMap\" async=\"false\"\n continueOnError=\"false\" enabled=\"true\" name=\"GetURLKVM\"\u003e\n \u003cDisplayName\u003eGetURLKVM\u003c/DisplayName\u003e\n \u003cExpiryTimeInSecs\u003e86400\u003c/ExpiryTimeInSecs\u003e\n \u003cScope\u003eenvironment\u003c/Scope\u003e\n \u003cGet assignTo=\"urlHosti\" index=\"2\"\u003e\n \u003cKey\u003e\n \u003cParameter\u003eurlHost_1\u003c/Parameter\u003e\n \u003c/Key\u003e\n \u003c/Get\u003e\n \u003c/KeyValueMapOperations\u003e\n ```\n- To access information about API products, developer apps, developers, consumer keys, and so on in the API proxy, you can do either of the following:\n - If your API Proxy flow has a [VerifyAPIKey policy](/apigee/docs/api-platform/reference/policies/verify-api-key-policy), then you can access the information using the flow variables populated as part of this policy. Here is sample code that shows how to retrieve the name and created_by information of a Developer App using JavaScript: \n\n ```css+lasso\n \u003c!-- /antipatterns/examples/2-7.xml --\u003e\n print(\"Application Name \", context.getVariable(\"\"verifyapikey. VerifyAPIKey.app.name\"));\n print(\"Created by:\", context.getVariable(\"verifyapikey. VerifyAPIKey.app.created_by\"));\n ```\n - If your API Proxy flow doesn't have a [VerifyAPIKey policy](/apigee/docs/api-platform/reference/policies/verify-api-key-policy), then you can access the profiles of API products, developer apps, and so on using the `AccessEntity` and `ExtractVariables` policies:\n 1. Retrieve the profile of developer app with the [AccessEntity policy](/apigee/docs/api-platform/reference/policies/access-entity-policy): \n\n ```carbon\n \u003c!-- /antipatterns/examples/2-8.xml --\u003e\n \u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?\u003e\n \u003cAccessEntity async=\"false\" continueOnError=\"false\" enabled=\"true\" name=\"GetDeveloperApp\"\u003e\n \u003cDisplayName\u003eGetDeveloperApp\u003c/DisplayName\u003e\n \u003cEntityType value=\"app\"\u003e\u003c/EntityType\u003e\n \u003cEntityIdentifier ref=\"developer.app.name\" type=\"appname\"/\u003e\n \u003cSecondaryIdentifier ref=\"developer.id\" type=\"developerid\"/\u003e\n \u003c/AccessEntity\u003e\n ```\n 2. Extract the `appId` from developer app with the [ExtractVariables policy](/apigee/docs/api-platform/reference/policies/extract-variables-policy): \n\n ```gdscript\n \u003c!-- /antipatterns/examples/2-9.xml --\u003e\n \u003cExtractVariables name=\"Extract-Developer App-Info\"\u003e\n \u003c!--\n The source element points to the variable populated by AccessEntity policy.\n The format is \u003cpolicy-type\u003e.\u003cpolicy-name\u003e\n In this case, the variable contains the whole developer profile.\n --\u003e\n \u003cSource\u003eAccessEntity.GetDeveloperApp\"\u003c/Source\u003e\n \u003cVariablePrefix\u003edeveloperapp\u003c/VariablePrefix\u003e\n \u003cXMLPayload\u003e\n \u003cVariable name=\"appld\" type=\"string\"\u003e\n \u003c!-- You parse elements from the developer profile using XPath. --\u003e\n \u003cXPath\u003e/App/AppId\u003c/XPath\u003e\n \u003c/Variable\u003e\n \u003c/XMLPayload\u003e\n \u003c/ExtractVariables\u003e\n ```\n\nFurther reading\n---------------\n\n- [KeyValueMapOperations policy](/apigee/docs/api-platform/reference/policies/key-value-map-operations-policy)\n- [VerifyAPIKey policy](/apigee/docs/api-platform/reference/policies/verify-api-key-policy)\n- [AccessEntity policy](/apigee/docs/api-platform/reference/policies/access-entity-policy)"]]