Norme JavaScript

Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione Documentazione di Apigee X.
Informazioni

Cosa

Questo criterio consente di aggiungere codice JavaScript personalizzato che viene eseguito nel contesto di un'API flusso proxy. Nel codice JavaScript personalizzato, puoi utilizzare gli oggetti, i metodi e le proprietà il modello a oggetti JavaScript di Apigee Edge. Il modello a oggetti consente di ottenere, impostare e rimuovere variabili nel contesto del flusso proxy. Tu può anche utilizzare le funzioni crittografiche di base fornite con il modello a oggetti.

Informazioni

Esistono molti casi d'uso per il criterio JavaScript. Ad esempio, puoi ottenere e impostare il flusso variabili, eseguire logica personalizzata e gestire gli errori, estrarre i dati dalle richieste le risposte, modificare dinamicamente l'URL di destinazione del backend e altro ancora. Questo criterio consente di implementare un comportamento personalizzato che non sia coperto da altri criteri Edge standard. Infatti, è possibile usare un criterio JavaScript per ottenere molti degli stessi comportamenti implementati da altri criteri, comeAssignMessage 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, puoi migliorare le prestazioni del proxy API eseguendo il criterio di logging dei messaggi in PostClientFlow, che viene eseguita dopo che la risposta è stata inviata al client.

Il criterio JavaScript consente di specificare un file di origine JavaScript da eseguire o puoi includere il codice JavaScript direttamente nella configurazione del criterio con <Source> . In ogni caso, il codice JavaScript viene eseguito quando viene eseguito il passaggio a cui è associato il criterio. Per l'opzione File sorgente, il codice sorgente è sempre archiviato in un posizione standard all'interno del bundle proxy: apiproxy/resources/jsc. In alternativa, puoi anche e archiviare il codice sorgente in un file di risorse a livello di ambiente o organizzazione. Per istruzioni, vedi File di risorse. Puoi e caricare il codice JavaScript tramite l'editor proxy della UI di Apigee.

I file sorgente JavaScript devono avere sempre un'estensione .js.

Vedi Software supportati e versioni supportate per la versione attualmente supportata di JavaScript.

Video

Guarda un breve video per imparare a creare un'estensione di una norma personalizzata utilizzando JavaScript .

Esempi

Riscrivi l'URL di destinazione

Ecco un caso d'uso comune: estrazione dei dati dal corpo di una richiesta, archiviazione in un flusso utilizzando la variabile di flusso altrove nel flusso proxy. Supponiamo che tu abbia un'app dove l'utente inserisce il proprio nome in un modulo HTML e lo invia. Vuoi che il proxy API estrarre i dati del modulo e aggiungerli dinamicamente all'URL utilizzato per chiamare il servizio di backend. Come lo faresti in una norma JavsScript?

Nota: per provare questo esempio, supponiamo che tu abbia creato una nuova proxy nell'editor proxy. Quando lo crei, assegnagli l'URL del servizio di backend: http://www.example.com. Per questo esempio riscriveremo dinamicamente l'URL di backend. Se non sai come creare un nuovo proxy, consulta il 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 un nome allo script, ad esempio js-example.
  5. Incolla il seguente codice nell'editor di codice e salva il proxy. La cosa importante è l'oggetto context. Questo oggetto è disponibile per il codice JavaScript in qualsiasi punto del flusso del proxy. È usata per ottenere costanti specifiche del flusso, per richiamare get/set e per altre operazioni. Questa parte dell'oggetto fa parte Modello a oggetti JavaScript. Tieni presente che che la variabile di flusso target.url è una variabile integrata di lettura/scrittura che è accessibile nel flusso di richiesta target. Se impostiamo la variabile con l'URL dell'API, Edge effettua la chiamata di backend a quell'URL. Fondamentalmente abbiamo riscritto l'URL di destinazione originale, ovvero il valore 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 flusso di pre-flusso degli endpoint proxy nel Navigatore, vedrai che il criterio a quel flusso.
  9. Nel riquadro di navigazione, seleziona l'icona PreFlow endpoint di destinazione.
  10. Dal Navigatore, trascina il criterio JavaScript sul lato Richiesta della finestra Endpoint nell'editor del flusso.
  11. risparmia,
  12. Chiama l'API in questo modo, sostituendo il nome corretto dell'organizzazione e il nome del proxy con appropriato:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example

Infine, esaminiamo la definizione XML del criterio JavaScript utilizzato in in questo esempio. È importante notare che il <ResourceURL> viene utilizzato per specificare il file sorgente JavaScript da eseguire. Viene usato lo stesso pattern per qualsiasi file sorgente JavaScript: jsc://filename.js. Se utilizzi codice JavaScript richiede, puoi utilizzare uno o più elementi <IncludeURL> 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 elemento <Property> nella configurazione, quindi recuperare il valore con JavaScript in fase di esecuzione.

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

In JavaScript, puoi recuperare il valore della proprietà del criterio accedendo come proprietà del metodo Oggetto Properties, come nell'esempio seguente:

  • 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, ossia 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 una callout JavaScript; consulta questo post nella community di Apigee. I suggerimenti offerti nella community di Apigee sono destinati informazioni e non rappresentano necessariamente le best practice consigliate da Apigee.


Riferimento elemento

Il riferimento agli elementi 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>

&lt;Javascript&gt; Attributi

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

Gli attributi riportati di seguito sono specifici di questo criterio.

Attributo Descrizione Predefinito Presenza
timeLimit

Specifica il tempo massimo (in millisecondi) che lo script può eseguire eseguire il deployment. Ad esempio, se viene superato un limite di 200 ms, il criterio 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

&lt;IncludeURL&gt; elemento

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 nelle norme. Il codice può utilizzare oggetti, metodi del modello a oggetti JavaScript.

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

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

Esempio

Consulta l'esempio di base nella sezione Samples.

&lt;Property&gt; elemento

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

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

Attributi

Attributo Descrizione Predefinito Presenza
nome

Specifica il nome della proprietà.

N/D Obbligatorio.

Esempio

Guarda l'esempio nella sezione Samples.

&lt;ResourceURL&gt; elemento

Specifica il file JavaScript principale che verrà eseguito nel flusso dell'API. Puoi archiviare questo file nell'ambito del proxy API (in /apiproxy/resources/jsc nel bundle proxy API o sezione Script del riquadro di navigazione dell'editor proxy API) o a livello di organizzazione Ambiti di ambiente da riutilizzare in più proxy API, come descritto in File di risorse. Il codice può utilizzare gli oggetti, metodi e proprietà del modello a oggetti JavaScript.

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

Esempio

Consulta l'esempio di base nella sezione Samples.

&lt;Source&gt; elemento

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

Predefinita: Nessuno
Presenza: È obbligatorio specificare <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>

&lt;SSLInfo&gt; elemento

Specifica le proprietà utilizzate per configurare TLS per tutte le istanze del 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>
Predefinita: 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. Vedi Configurazione di TLS da Edge al backend per ulteriori informazioni.

Note sull'utilizzo

Un criterio JavaScript non contiene codice effettivo. Un criterio JavaScript fa invece riferimento a un "resource" JavaScript e definisce il passaggio nel flusso dell'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 restituire le informazioni di debug alla transazione nello strumento Trace. Per dettagli ed esempi, vedi Debug con JavaScript print().

Per visualizzare le istruzioni di stampa in Trace:

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

  4. Gli estratti conto cartacei verranno visualizzati in questo riquadro.

Puoi utilizzare la funzione Print() per inviare le informazioni di debug allo strumento Traccia. Questa funzione è disponibile direttamente attraverso il modello a oggetti JavaScript. Per maggiori dettagli, consulta "Eseguire il debug di JavaScript con stampa() ".

Variabili di flusso

Questo criterio non compila le variabili per impostazione predefinita. ma puoi impostare (e ottenere) il flusso nel tuo codice JavaScript richiamando metodi sull'oggetto di contesto. Un modello tipico ha il seguente aspetto:

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

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

Messaggi di errore

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Cause Fix
steps.javascript.ScriptExecutionFailed 500 The JavaScript policy can throw many different types of ScriptExecutionFailed errors. Commonly seen types of errors include RangeError, ReferenceError, SyntaxError, TypeError, and URIError.
steps.javascript.ScriptExecutionFailedLineNumber 500 An error occurred in the JavaScript code. See the fault string for details. N/A
steps.javascript.ScriptSecurityError 500 A security error occurred when the JavaScript executed. See the fault string for details. N/A

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name Cause Fix
InvalidResourceUrlFormat If the format of the resource URL specified within the <ResourceURL> or the <IncludeURL> element of the JavaScript policy is invalid, then the deployment of the API proxy fails.
InvalidResourceUrlReference If the <ResourceURL> or the <IncludeURL> elements refer to a JavaScript file that does not exist, then the deployment of the API proxy fails. The referenced source file must exist either the API proxy, environment, or organization level.
WrongResourceType This error occurs during deployment if the <ResourceURL> or the <IncludeURL> elements of the JavaScript policy refer to any resource type other than jsc (JavaScript file).
NoResourceURLOrSource The deployment of the JavaScript policy can fail with this error if the <ResourceURL> element is not declared or if the resource URL is not defined within this element. <ResourceURL> element is a mandatory element. Or, The <IncludeURL> element is declared but the resource URL is not defined within this element. The <IncludeURL> element is optional but if declared, the resource URL must be specified within the <IncludeURL> element.

Fault variables

These variables are set when this policy triggers an error at runtime. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "ScriptExecutionFailed"
javascript.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. javascript.JavaScript-1.failed = true

Example error response

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

Example fault rule

<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, consulta gli schemi dei criteri sono disponibili su GitHub.

Argomenti correlati

Articoli della community Apigee

Puoi trovare questi articoli correlati sulla piattaforma Apigee Community: