Criterio JavaScript

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

Cosa

Questo criterio 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à del modello a oggetti JavaScript di Apigee Edge. Il modello a oggetti consente di recuperare, impostare e rimuovere le variabili nel contesto del flusso proxy. Puoi anche utilizzare le funzioni crittografiche di base fornite con il modello a oggetti.

Informazioni

Il criterio JavaScript può essere utilizzato in molti casi d'uso. Ad esempio, puoi ottenere e impostare variabili di flusso, eseguire logiche personalizzate ed eseguire la gestione degli errori, estrarre dati da richieste o risposte, modificare dinamicamente l'URL di destinazione del backend e molto altro ancora. Questo criterio consente di implementare un comportamento personalizzato che non è coperto da altri criteri Edge standard. Infatti, è possibile utilizzare un criterio JavaScript per ottenere molti degli stessi comportamenti implementati da altri criteri, come AssegnaMessage ed ExtractVariable.

Un caso d'uso che non consigliamo per il criterio JavaScript è il logging. Il criterio di logging dei messaggi è molto più adatto per il logging su piattaforme di logging di terze parti come Splunk, Sumo e Loggly e consente di migliorare le prestazioni del proxy API eseguendo il criterio di logging dei messaggi in PostClientFlow, che viene eseguito dopo che la risposta è stata inviata al client.

Il criterio JavaScript consente di specificare un file di origine JavaScript da eseguire oppure di includere il codice JavaScript direttamente nella configurazione del criterio con l'elemento <Source>. In ogni caso, il codice JavaScript viene eseguito quando viene eseguito il passaggio a cui è associato il criterio. 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 di organizzazione. Per le istruzioni, consulta File di risorse. Puoi anche caricare il tuo codice JavaScript tramite l'editor proxy UI Apigee.

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

Consulta la pagina Software e versioni supportate per la versione attualmente supportata di JavaScript.

Video

Guarda un breve video per scoprire come creare un'estensione del criterio personalizzata utilizzando il criterio JavaScript.

Samples

Riscrivi l'URL di destinazione

Ecco un caso d'uso comune: estrarre i dati da un corpo di richiesta, memorizzarli in una variabile di flusso e utilizzare questa variabile di flusso 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 in modo dinamico all'URL utilizzato per chiamare il servizio di backend. Come si può eseguire questa operazione in un criterio JavsScript?

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

  1. Nella UI di Edge, apri il proxy che hai creato nell'editor proxy.
  2. Seleziona la scheda Sviluppo.
  3. Dal menu Nuovo, seleziona Nuovo script.
  4. Nella finestra di dialogo, seleziona JavaScript e assegna allo script un nome, ad esempio js-example.
  5. Incolla il codice seguente 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 del proxy. Viene utilizzato per ottenere costanti specifiche del flusso, per chiamare metodi get/set utili e per altre operazioni. Questa parte dell'oggetto fa parte del modello a oggetti JavaScript di Edge. Tieni inoltre presente che la variabile di flusso target.url è una variabile integrata di lettura/scrittura accessibile nel flusso Richiesta di destinazione. Quando impostiamo questa variabile con l'URL API, Edge effettua la chiamata di backend a quell'URL. Sostanzialmente abbiamo riscritto l'URL di destinazione originale, che era quello da te specificato al momento della creazione del 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. Dal menu Nuova norma, seleziona JavaScript.
  7. Assegna un nome al criterio, ad esempio target-rewrite. Accetta le impostazioni predefinite e salva il criterio.
  8. Se selezioni il pre-flusso dell'endpoint proxy nel navigatore, vedrai che il criterio è stato aggiunto a quel flusso.
  9. Nel riquadro di navigazione, seleziona l'icona Preflusso endpoint target.
  10. Dal menu di navigazione, trascina il criterio JavaScript sul lato Richiesta dell'endpoint di destinazione nell'editor del flusso.
  11. risparmia,
  12. Chiama l'API in questo modo, sostituendo il nome dell'organizzazione corretto e il nome del proxy in base alle esigenze:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example

Infine, diamo un'occhiata alla definizione XML del criterio JavaScript utilizzato in questo esempio. È importante notare che l'elemento <ResourceURL> viene utilizzato per specificare il file di origine JavaScript da eseguire. Lo stesso pattern viene utilizzato per qualsiasi file di origine JavaScript: jsc://filename.js. Se il codice JavaScript richiede l'inclusione, puoi utilizzare uno o più elementi <IncludeURL> per eseguire questa operazione, 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>

Recupera il valore della proprietà da JavaScript

Puoi aggiungere un elemento <Property> nella configurazione e poi 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 il tag di apertura e quello di chiusura) è il valore letterale che verrà ricevuto da JavaScript.

In JavaScript, puoi recuperare il valore della proprietà del criterio accedendo come proprietà dell'oggetto Properties, come indicato di seguito:

  • 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. In questo caso, il valore recuperato (un nome variabile) viene 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 per una discussione sulle tecniche di gestione degli errori che è possibile 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 del criterio 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 norma.

Attributo Descrizione Predefinito Presenza
timeLimit

Specifica il tempo massimo (in millisecondi) per l'esecuzione dello script. Ad esempio, se viene superato il limite di 200 ms, il criterio genera questo 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/A Obbligatorie

La tabella seguente descrive gli attributi comuni a tutti gli elementi principali dei criteri:

Attributo Descrizione Predefinito Presenza
name

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

Facoltativamente, utilizza l'elemento <DisplayName> per etichettare il criterio nell'editor proxy dell'interfaccia utente di gestione con un nome diverso in linguaggio naturale.

N/A Obbligatorie
continueOnError

Impostalo su false per restituire un errore in caso di errore di un criterio. Questo è il comportamento previsto per la maggior parte dei criteri.

Imposta su true per fare in modo che l'esecuzione del flusso continui anche in caso di errore di un criterio.

false Facoltativo
enabled

Imposta il criterio su true per applicare il criterio.

Impostala su false per disattivare il criterio. Il criterio non verrà applicato anche se rimane associato a un flusso.

true Facoltativo
async

Questo attributo è obsoleto.

false Deprecata

Elemento <DisplayName>

Utilizzalo in aggiunta all'attributo name per etichettare il criterio nell'editor proxy dell'interfaccia utente di gestione con un nome diverso in linguaggio naturale.

<DisplayName>Policy Display Name</DisplayName>
Predefinito

N/A

Se ometti questo elemento, viene utilizzato il valore dell'attributo name del criterio.

Presenza Facoltativo
Tipo Stringa

Elemento <IncludeURL>

Specifica un file della libreria JavaScript da caricare come dipendenza dal file JavaScript principale specificato con l'elemento <ResourceURL> o <Source>. Gli script verranno valutati nell'ordine in cui sono elencati nel criterio. Il codice può utilizzare gli oggetti, i metodi e le proprietà del modello a oggetti 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

Consulta l'esempio di base nella sezione Samples (Campioni).

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/A Obbligatorio.

Esempio

Guarda l'esempio nella sezione Samples.

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 pacchetto del proxy API o nella sezione Script del riquadro di navigazione dell'editor del proxy API) oppure nell'ambito dell'organizzazione o dell'ambiente per il riutilizzo in più proxy API, come descritto in File di risorse. Il codice può utilizzare gli oggetti, i metodi e le proprietà del modello a oggetti JavaScript.

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

Esempio

Consulta l'esempio di base nella sezione Samples (Campioni).

Elemento <Source>

Consente di inserire JavaScript direttamente nella configurazione XML del criterio. Il codice JavaScript inserito viene eseguito quando il criterio viene eseguito nel flusso API.

Predefinito: Nessuno
Presenza: È obbligatorio specificare <ResourceURL> o <Source>. Se <ResourceURL> e <Source> sono entrambi presenti, il valore <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 client HTTP create dal criterio 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

Il processo di configurazione di TLS per un client HTTP è lo stesso utilizzato per configurare TLS per un endpoint/TargetServer. Per ulteriori informazioni, consulta Configurazione di TLS da Edge al backend.

Note sull'utilizzo

Un criterio JavaScript non contiene codice effettivo. Invece, un criterio 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 includerlo nella directory /resources/jsc nei proxy API che sviluppi localmente.

Debug del codice del criterio JavaScript

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

Per visualizzare le istruzioni di stampa in Trace:

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

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

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

Variabili di flusso

Questo criterio non compila alcuna variabile per impostazione predefinita; tuttavia, puoi impostare (e ottenere) variabili di flusso nel codice JavaScript chiamando i metodi nell'oggetto di contesto. Uno schema tipico ha il seguente aspetto:

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

L'oggetto di contesto fa parte del modello a oggetti JavaScript di Apigee Edge.

Messaggi di errore

Questa sezione descrive i codici e i messaggi di errore restituiti e le variabili di errore impostate da Edge quando questo criterio attiva un errore. Queste informazioni sono importanti per sapere se stai sviluppando regole di errore per la gestione degli errori. Per scoprire di più, consulta gli articoli Cosa devi sapere sugli errori relativi alle norme e Gestione degli errori.

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. I tipi di errori più comuni sono RangeError, ReferenceError, SyntaxError, TypeError ed URIError.
steps.javascript.ScriptExecutionFailedLineNumber 500 Si è verificato un errore nel codice JavaScript. Consulta la stringa dell'errore per i dettagli. N/A
steps.javascript.ScriptSecurityError 500 Si è verificato un errore di sicurezza durante l'esecuzione di JavaScript. Consulta la stringa di errore per i dettagli. N/A

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 riesce.
InvalidResourceUrlReference Se gli elementi <ResourceURL> o <IncludeURL> fanno riferimento a un file JavaScript che non esiste, il deployment del proxy API non riesce. Il file di origine di riferimento deve esistere a livello di organizzazione, proxy API o ambiente.
WrongResourceType Questo errore si verifica durante il deployment se gli elementi <ResourceURL> o <IncludeURL> del criterio JavaScript fanno riferimento a un qualsiasi tipo di risorsa diverso da jsc (file JavaScript).
NoResourceURLOrSource Il deployment del criterio JavaScript può avere esito negativo con questo errore se l'elemento <ResourceURL> non viene dichiarato o se l'URL della risorsa non è definito all'interno di questo elemento. L'elemento <ResourceURL> è obbligatorio. In alternativa, viene dichiarato l'elemento <IncludeURL>, 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 questo criterio attiva un errore in fase di runtime. Per maggiori informazioni, consulta la sezione Cosa devi sapere sugli errori dei criteri.

Variabili Dove Esempio
fault.name="fault_name" fault_name è il nome dell'errore, come indicato nella tabella Errori di runtime riportata sopra. Il nome del guasto è 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 criterio è definito da uno schema XML (.xsd). Come riferimento, gli schemi dei criteri sono disponibili su GitHub.

Argomenti correlati

Articoli della community Apigee

Puoi trovare questi articoli correlati nella community di Apigee: