Norme JavaScript

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

Cosa

Questa policy ti consente di aggiungere codice JavaScript personalizzato che viene eseguito nel contesto di un flusso proxy API. Nel codice JavaScript personalizzato, puoi utilizzare gli oggetti, i metodi e le proprietà di Apigee Edge modello oggetto JavaScript. Il modello oggetto ti consente di ottenere, impostare e rimuovere le variabili nel contesto del flusso proxy. Puoi anche utilizzare le funzioni di crittografia di base fornite con il modello oggetto.

Informazioni

Esistono molti casi d'uso per la policy JavaScript. Ad esempio, puoi ottenere e impostare le variabili di flusso , eseguire logica personalizzata ed eseguire la gestione degli errori, estrarre dati da richieste o risposte, modificare dinamicamente l'URL di destinazione del backend e molto altro ancora. Questa policy ti consente di implementare un comportamento personalizzato non coperto da altre policy Edge standard. Infatti, puoi utilizzare una policy JavaScript per ottenere molti degli stessi comportamenti implementati da altre policy, come AssignMessage ed ExtractVariable.

Un caso d'uso che non consigliamo per la policy JavaScript è la registrazione. La policy Message Logging è molto più adatta per la registrazione su piattaforme di logging di terze parti come Splunk, Sumo e Loggly e migliora il rendimento del proxy API eseguendo la policy Message Logging in PostClientFlow, che viene eseguita dopo che la risposta è stata inviata al client.

La policy JavaScript ti consente di specificare un file di origine JavaScript da eseguire o puoi includere il codice JavaScript direttamente nella configurazione della policy con l'elemento <Source>. In entrambi i casi, il codice JavaScript viene eseguito quando viene eseguito il passaggio a cui è collegata la policy. Per l'opzione del file di origine, il codice sorgente viene sempre archiviato in una posizione standard all'interno del bundle proxy: apiproxy/resources/jsc. In alternativa, puoi anche archiviare il codice sorgente in un file di risorse a livello di ambiente o organizzazione. Per le istruzioni, vedi File di risorse. Puoi anche caricare JavaScript tramite l'editor proxy dell'interfaccia utente di Apigee.

I file di origine JavaScript devono sempre avere l'estensione .js.

Per la versione di JavaScript attualmente supportata, vedi Software e versioni supportati.

Video

Guarda un breve video per scoprire come creare un'estensione di policy personalizzata utilizzando la policy JavaScript.

Esempi

Riscrivere l'URL di destinazione

Ecco un caso d'uso comune: estrarre i dati dal corpo di una richiesta, memorizzarli in una variabile di flusso variabile e utilizzarli altrove nel flusso proxy. Supponiamo che tu abbia un'app in cui l'utente inserisce il proprio nome in un modulo HTML e lo invia. Vuoi che il proxy API estragga i dati del modulo e li aggiunga dinamicamente all'URL utilizzato per chiamare il servizio di backend. Come faresti in una policy JavaScript?

Nota: se vuoi provare questo esempio, presupponiamo che tu abbia creato un nuovo proxy nell'editor proxy. Quando lo crei, fornisci un URL del servizio di backend: http://www.example.com. In questo esempio, riscriveremo l'URL del backend in modo dinamico. Se non sai come creare un nuovo proxy, consulta il tutorial introduttivo. .

  1. Nell'interfaccia utente di Edge, apri il proxy che hai creato nell'editor proxy.
  2. Seleziona la scheda Sviluppa.
  3. Nel menu Nuovo, seleziona Nuovo script.
  4. Nella finestra di dialogo, seleziona JavaScript e assegna un nome allo script, ad esempio js-example.
  5. Incolla il seguente codice nell'editor di codice e salva il proxy. La cosa importante da notare è l'oggetto context. Questo oggetto è disponibile per il codice JavaScript in qualsiasi punto del flusso proxy. Viene utilizzato per ottenere costanti specifiche del flusso, chiamare metodi get/set utili e per altre operazioni. Questa parte dell'oggetto fa parte del modello oggetto JavaScript di Edge. Tieni presente, inoltre, che la variabile di flusso target.url è una variabile integrata di lettura/scrittura accessibile nel flusso della richiesta di destinazione. Quando impostiamo questa variabile con l'URL dell'API, Edge effettua la chiamata di backend a questo URL. Abbiamo essenzialmente riscritto l'URL di destinazione originale, ovvero quello che hai specificato quando hai creato il proxy (ad es. http://www.example.com).

    if (context.flow=="PROXY_REQ_FLOW") {
         var username = context.getVariable("request.formparam.user");
         context.setVariable("info.username", username);
    }
    
    
    if (context.flow=="TARGET_REQ_FLOW") {
         context.setVariable("request.verb", "GET");
         var name = context.getVariable("info.username");
         var url = "http://mocktarget.apigee.net/"
         context.setVariable("target.url", url + "?user=" + name);
    }
  6. Nel menu Nuova policy, seleziona JavaScript.
  7. Assegna un nome alla policy, ad esempio target-rewrite. Accetta i valori predefiniti e salva la policy.
  8. Se selezioni Preflow dell'endpoint proxy nel navigatore, vedrai che la policy è stata aggiunta a questo flusso.
  9. Nel navigatore, seleziona l'icona PreFlow dell'endpoint di destinazione.
  10. Dal navigatore, trascina la policy JavaScript sul lato della richiesta dell'endpoint di destinazione nell'editor di flusso.
  11. risparmia,
  12. Chiama l'API in questo modo, sostituendo il nome dell'organizzazione e il nome del proxy corretti, se necessario:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example

Un'ultima cosa: diamo un'occhiata alla definizione XML della policy JavaScript utilizzata in questo esempio. La cosa importante da notare è che l'elemento <ResourceURL> viene utilizzato per specificare il file di origine JavaScript da eseguire. Questo stesso pattern viene utilizzato per qualsiasi file di origine JavaScript: jsc://filename.js. Se il codice JavaScript richiede inclusioni, puoi utilizzare uno o più <IncludeURL> elementi per farlo come descritto più avanti in questo riferimento.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="target-rewrite">
    <DisplayName>target-rewrite</DisplayName>
    <Properties/>
    <ResourceURL>jsc://js-example.js</ResourceURL>
</Javascript>

Recuperare il valore della proprietà da JavaScript

Puoi aggiungere un <Property> elemento nella configurazione, quindi recuperare il valore dell'elemento con JavaScript in fase di runtime.

Utilizza l'attributo name dell'elemento per specificare il nome con cui accedere alla proprietà dal codice JavaScript. Il valore dell'elemento <Property> (il valore tra i tag di apertura e chiusura) è il valore letterale che verrà ricevuto da JavaScript.

In JavaScript, recupera il valore della proprietà della policy accedendovi come proprietà dell' Properties oggetto, come segue:

  • Configura la proprietà. Qui, il valore della proprietà è il nome della variabile response.status.code.
    <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="JavascriptURLRewrite">
        <DisplayName>JavascriptURLRewrite</DisplayName>
        <Properties>
            <Property name="source">response.status.code</Property>
        </Properties>
        <ResourceURL>jsc://JavascriptURLRewrite.js</ResourceURL>
    </Javascript>
  • Recupera la proprietà con JavaScript. Qui, il valore recuperato, ovvero il nome di una variabile, viene quindi utilizzato dalla funzione getVariable per recuperare il valore della variabile.
    var responseCode = properties.source; // Returns "response.status.code"
    var value = context.getVariable(responseCode); // Get the value of response.status.code
    context.setVariable("response.header.x-target-response-code", value);

Gestione degli errori

Per esempi e una discussione sulle tecniche di gestione degli errori che puoi utilizzare in un callout JavaScript, consulta questo post nella community di Apigee. I suggerimenti offerti nella community di Apigee sono solo a scopo informativo e non rappresentano necessariamente le best practice consigliate da Apigee.


Riferimento elemento

Il riferimento all'elemento descrive gli elementi e gli attributi della policy JavaScript.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Javascript async="false"
        continueOnError="false" enabled="true" timeLimit="200"
        name="JavaScript-1">
    <DisplayName>JavaScript 1</DisplayName>
    <Properties>
        <Property name="propName">propertyValue</Property>
    </Properties>
    <SSLInfo>
        <Enabled>trueFalse</Enabled>
        <ClientAuthEnabled>trueFalse</ClientAuthEnabled>
        <KeyStore>ref://keystoreRef</KeyStore>
        <KeyAlias>keyAlias</KeyAlias>
        <TrustStore>ref://truststoreRef</TrustStore>
    </SSLInfo>
    <IncludeURL>jsc://a-javascript-library-file</IncludeURL>
    <ResourceURL>jsc://my-javascript-source-file</ResourceURL>
    <Source>insert_js_code_here</Source>

</Javascript>

Attributi <Javascript>

<Javascript name="Javascript-1" enabled="true" continueOnError="false" async="false" timeLimit="200">

I seguenti attributi sono specifici di questa policy.

Attributo Descrizione Predefinito Presenza
timeLimit

Specifica il tempo massimo (in millisecondi) consentito per l'esecuzione dello script. Ad esempio, se viene superato un limite di 200 ms, la policy genera il seguente errore: Javascript.policy_name failed with error: Javascript runtime exceeded limit of 200ms.

Nota: per gli account di prova senza costi, il tempo di esecuzione è limitato a 200 ms.

N/D Obbligatorio

La tabella seguente descrive gli attributi comuni a tutti gli elementi principali del criterio:

Attributo Descrizione Predefinito Presenza
name

Il nome interno del criterio. Il valore dell'attributo name può Deve contenere lettere, numeri, spazi, trattini, trattini bassi e punti. Questo valore non può superare i 255 caratteri.

Se vuoi, puoi utilizzare l'elemento <DisplayName> per etichettare il criterio in l'editor proxy della UI di gestione con un nome diverso in linguaggio naturale.

N/D Obbligatorio
continueOnError

Imposta il valore su false per restituire un errore quando un criterio non viene eseguito. Si tratta di un comportamento previsto per la maggior parte dei criteri.

Imposta su true per fare in modo che l'esecuzione del flusso continui anche dopo un criterio non riesce.

falso Facoltativo
enabled

Imposta il valore su true per applicare il criterio.

Imposta false per disattivare il criterio. Il criterio non verrà applicata anche se rimane collegata a un flusso.

true Facoltativo
async

Questo attributo è obsoleto.

falso Deprecato

&lt;DisplayName&gt; elemento

Da utilizzare in aggiunta all'attributo name per etichettare il criterio in editor proxy della UI di gestione con un nome diverso e in linguaggio naturale.

<DisplayName>Policy Display Name</DisplayName>
Predefinito

N/D

Se ometti questo elemento, il valore dell'attributo name del criterio è in uso.

Presenza Facoltativo
Tipo Stringa

Elemento <IncludeURL>

Specifica un file di libreria JavaScript da caricare come dipendenza del file JavaScript principale specificato con l'elemento <ResourceURL> o <Source>. Gli script verranno valutati nell' ordine in cui sono elencati nella policy. Il codice può utilizzare gli oggetti, i metodi e le proprietà del modello oggetto JavaScript.

Includi più di una risorsa di dipendenza JavaScript con elementi <IncludeURL> aggiuntivi.

<IncludeURL>jsc://my-javascript-dependency.js</IncludeURL>
Predefinito: Nessuno
Presenza: Facoltativo
Tipo: Stringa

Esempio

Vedi l'esempio di base nella sezione Esempi.

Elemento <Property>

Specifica una proprietà a cui puoi accedere dal codice JavaScript in fase di runtime.

<Properties>
    <Property name="propName">propertyValue</Property>
</Properties>
Predefinito: Nessuno
Presenza: Facoltativo
Tipo: Stringa

Attributi

Attributo Descrizione Predefinito Presenza
nome

Specifica il nome della proprietà.

N/D Obbligatorio.

Esempio

Vedi l'esempio nella sezione Esempi.

Elemento <ResourceURL>

Specifica il file JavaScript principale che verrà eseguito nel flusso API. Puoi archiviare questo file nell'ambito del proxy API (in /apiproxy/resources/jsc nel bundle proxy API o nella sezione Script del riquadro Navigatore dell'editor proxy API) oppure negli ambiti dell'organizzazione o dell'ambiente per il riutilizzo in più proxy API, come descritto in File di risorse. Il codice può utilizzare gli oggetti, metodi e le proprietà del modello oggetto JavaScript.

<ResourceURL>jsc://my-javascript.js</ResourceURL>
Predefinito: Nessuno
Presenza: È necessario <ResourceURL> o <Source>. Se <ResourceURL> e <Source> sono entrambi presenti <ResourceURL> viene ignorato.
Tipo: Stringa

Esempio

Vedi l'esempio di base nella sezione Esempi.

Elemento <Source>

Ti consente di inserire JavaScript direttamente nella configurazione XML della policy. Il codice JavaScript inserito viene eseguito quando la policy viene eseguita nel flusso API.

Predefinito: Nessuno
Presenza: È necessario <ResourceURL> o <Source>. Se <ResourceURL> e <Source> sono entrambi presenti <ResourceURL> viene ignorato.
Tipo: Stringa

Esempio

<Javascript name='JS-ParseJsonHeaderFullString' timeLimit='200' >
  <Properties>
    <Property name='inboundHeaderName'>specialheader</Property>
    <Property name='outboundVariableName'>json_stringified</Property>
  </Properties>
  <Source>
var varname = 'request.header.' + properties.inboundHeaderName + '.values.string';
var h = context.getVariable(varname);
if (h) {
  h = JSON.parse(h);
  h.augmented = (new Date()).valueOf();
  var v = JSON.stringify(h, null, 2) + '\n';
  // further indent
  var r = new RegExp('^(\S*)','mg');
  v= v.replace(r,'    $1');
  context.setVariable(properties.outboundVariableName, v);
}
  </Source>
</Javascript>

Elemento <SSLInfo>

Specifica le proprietà utilizzate per configurare TLS per tutte le istanze del client HTTP create dalla policy JavaScript.

    <SSLInfo>
        <Enabled>trueFalse</Enabled>
        <ClientAuthEnabled>trueFalse</ClientAuthEnabled>
        <KeyStore>ref://keystoreRef</KeyStore>
        <KeyAlias>keyAlias</KeyAlias>
        <TrustStore>ref://truststoreRef</TrustStore>
    </SSLInfo>
Predefinito: Nessuno
Presenza: Facoltativo
Tipo: Stringa

La procedura di configurazione di TLS per un client HTTP è la stessa che utilizzi per configurare TLS per un TargetEndpoint/TargetServer. Per ulteriori informazioni, vedi Configurare TLS da Edge al backend.

Note sull'utilizzo

Una policy JavaScript non contiene codice effettivo. Al contrario, una policy JavaScript fa riferimento a una "risorsa" JavaScript e definisce il passaggio nel flusso API in cui viene eseguito JavaScript. Puoi caricare lo script tramite l'editor proxy dell'interfaccia utente di gestione oppure puoi includerlo nella /resources/jsc directory nei proxy API che sviluppi localmente.

Eseguire il debug del codice della policy JavaScript

Utilizza la funzione print() per generare informazioni di debug nel riquadro di output della transazione nello strumento Trace. Per dettagli ed esempi, vedi Eseguire il debug con le istruzioni print() di JavaScript.

Per visualizzare le istruzioni di stampa in Trace:

  1. Apri lo strumento Trace e avvia una sessione di traccia per un proxy che contiene la policy JavaScript.
  2. Chiama il proxy.
  3. Nello strumento Trace, fai clic su Output da tutte le transazioni per aprire il riquadro di output.

  4. Le istruzioni di stampa verranno visualizzate in questo riquadro.

Puoi utilizzare la funzione print() per generare informazioni di debug nello strumento Trace. Questa funzione è disponibile direttamente tramite il modello oggetto JavaScript. Per maggiori dettagli, vedi "Eseguire il debug di JavaScript con le istruzioni print() statements".

Variabili di flusso

Per impostazione predefinita, questa policy non popola alcuna variabile; tuttavia, puoi impostare (e ottenere) le variabili di flusso nel codice JavaScript chiamando i metodi sull'oggetto context. Un pattern tipico è il seguente:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"))

L'oggetto context fa parte del modello oggetto JavaScript di Apigee Edge.

Messaggi di errore

Questa sezione descrive i codici e i messaggi di errore restituiti, nonché le variabili di errore. impostate da Edge quando questo criterio attiva un errore. È importante conoscere queste informazioni se stai sviluppando regole di errore per gestire gli errori. Per saperne di più, consulta Cosa devi sapere sugli errori relativi ai criteri e sulla gestione di errore.

Errori di runtime

Questi errori possono verificarsi quando il criterio viene eseguito.

Codice di errore Stato HTTP Causa Correggi
steps.javascript.ScriptExecutionFailed 500 Il criterio JavaScript può generare molti tipi diversi di errori ScriptExecutionFailed. Normalmente i tipi di errori riscontrati includono RangeError, ReferenceError, SyntaxError: TypeError e URIError.
steps.javascript.ScriptExecutionFailedLineNumber 500 Si è verificato un errore nel codice JavaScript. Consulta la stringa di errore per i dettagli. N/D
steps.javascript.ScriptSecurityError 500 Si è verificato un errore di sicurezza durante l'esecuzione di JavaScript. Vedi la stringa di errore per i dettagli. N/D

Errori di deployment

Questi errori possono verificarsi quando esegui il deployment di un proxy contenente questo criterio.

Nome errore Causa Correggi
InvalidResourceUrlFormat Se il formato dell'URL della risorsa specificato nell'elemento <ResourceURL> o <IncludeURL> del criterio JavaScript non è valido, il deployment del proxy API non va a buon fine.
InvalidResourceUrlReference Se gli elementi <ResourceURL> o <IncludeURL> fare riferimento a un file JavaScript che non esiste, il deployment del proxy API non va a buon fine. Il file di origine a cui viene fatto riferimento deve esistere a livello di organizzazione, proxy API o ambiente.
WrongResourceType Questo errore si verifica durante il deployment se <ResourceURL> o <IncludeURL> del criterio JavaScript fanno riferimento a qualsiasi tipo di risorsa diverso da jsc (file JavaScript).
NoResourceURLOrSource Il deployment del criterio JavaScript può non riuscire con questo errore se <ResourceURL> non viene dichiarato o l'URL della risorsa non è definito all'interno di questo elemento. L'elemento <ResourceURL> è obbligatorio. Oppure, l'elemento <IncludeURL> viene dichiarato ma l'URL della risorsa non è definito all'interno di questo elemento. L'elemento <IncludeURL> è facoltativo ma se dichiarato, l'URL della risorsa deve essere specificato all'interno dell'elemento <IncludeURL>.

Variabili di errore

Queste variabili vengono impostate quando il criterio attiva un errore in fase di runtime. Per ulteriori informazioni, consulta Cosa che devi conoscere sugli errori relativi alle norme.

Variabili Dove Esempio
fault.name="fault_name" fault_name è il nome dell'errore, come elencato nella precedente tabella Errori di runtime. Il nome dell'errore è l'ultima parte del codice di errore. fault.name Matches "ScriptExecutionFailed"
javascript.policy_name.failed policy_name è il nome specificato dall'utente del criterio che ha generato l'errore. javascript.JavaScript-1.failed = true

Esempio di risposta di errore

{
  "fault": {
    "faultstring": "Execution of SetResponse failed with error: Javascript runtime error: "ReferenceError: "status" is not defined. (setresponse.js:6)\"",
    "detail": {
      "errorcode": "steps.javascript.ScriptExecutionFailed"
    }
  }
}

Esempio di regola di errore

<FaultRule name="JavaScript Policy Faults">
    <Step>
        <Name>AM-CustomErrorResponse</Name>
        <Condition>(fault.name Matches "ScriptExecutionFailed") </Condition>
    </Step>
    <Condition>(javascript.JavaScript-1.failed = true) </Condition>
</FaultRule>

Schema

Ogni tipo di policy è definito da uno schema XML (.xsd). Per riferimento, gli schemi delle policy sono disponibili su GitHub.

Argomenti correlati

Articoli della community di Apigee

Puoi trovare questi articoli correlati nella community di Apigee: