Stai visualizzando la documentazione di Apigee e Apigee hybrid.
Visualizza la documentazione di
Apigee Edge.
Il criterio JavaScript consente di aggiungere codice personalizzato che viene eseguito nel contesto di un flusso del proxy API. Ad esempio, il codice personalizzato nella norma JavaScript può essere utilizzato per:
- Ottenere e impostare le variabili di flusso
- Esegui la logica personalizzata ed esegui la gestione degli errori
- Estrarre i dati dalle richieste o dalle risposte
- Modificare dinamicamente l'URL target di backend
- Aggiungere o rimuovere dinamicamente le intestazioni da una richiesta o una risposta
- Analizza una risposta JSON
Client HTTP
Una funzionalità potente del criterio JavaScript è il client HTTP.
Il client HTTP (o l'oggetto httpClient
) può essere utilizzato per effettuare una o più chiamate
a servizi di backend o esterni. Il client HTTP è particolarmente utile quando è necessario effettuare chiamate a più servizi esterni e unire le risposte in un'unica API.
Esempio di codice JavaScript che effettua una chiamata al backend con l'oggetto httpClient
var headers = {'X-SOME-HEADER' : 'some value' }; var myRequest = new Request("http://www.example.com","GET",headers); var exchange = httpClient.send(myRequest);
L'oggetto httpClient
espone due metodi, get
e send
(send
viene utilizzato nel codice campione riportato sopra) per effettuare richieste HTTP. Entrambi i metodi sono asincroni e restituiscono un oggetto exchange
prima del completamento della richiesta HTTP effettiva.
Le richieste HTTP possono richiedere da alcuni secondi a qualche minuto. Dopo aver inviato una richiesta HTTP, è importante sapere quando è stata completata, in modo da poter elaborare la risposta.
Uno dei modi più comuni per determinare quando la richiesta HTTP è completa è richiamare il metodo waitForComplete()
dell'oggetto exchange
.
waitForComplete()
Il metodo waitForComplete()
mette in pausa il thread fino al completamento della richiesta HTTP e alla restituzione di una risposta (successo/errore). La risposta di un servizio di backend o esterno può quindi essere elaborata.
Codice JavaScript di esempio con waitForComplete()
var headers = {'X-SOME-HEADER' : 'some value' }; var myRequest = new Request("http://www.example.com","GET",headers); var exchange = httpClient.send(myRequest); // Wait for the asynchronous GET request to finish exchange.waitForComplete(); // Get and Process the response if (exchange.isSuccess()) { var responseObj = exchange.getResponse().content.asJSON; return responseObj.access_token; } else if (exchange.isError()) { throw new Error(exchange.getError()); }
Antipattern
L'utilizzo di waitForComplete()
dopo l'invio di una richiesta HTTP nel codice JavaScript avrà implicazioni sul rendimento.
Considera il seguente codice JavaScript che chiama waitForComplete()
dopo l'invio di una richiesta HTTP.
Codice per sample.js
// Send the HTTP request var exchangeObj = httpClient.get("http://example.com"); // Wait until the request is completed exchangeObj.waitForComplete(); // Check if the request was successful if (exchangeObj.isSuccess()) { response = exchangeObj.getResponse(); context.setVariable('example.status', response.status); } else { error = exchangeObj.getError(); context.setVariable('example.error', 'Woops: ' + error); }
In questo esempio:
- Il codice JavaScript invia una richiesta HTTP a un'API di backend.
- Quindi chiama
waitForComplete()
per mettere in pausa l'esecuzione fino al completamento della richiesta.L'
waitForComplete()
API impedisce al thread che esegue il codice JavaScript di essere bloccato finché il backend non completa l'elaborazione della richiesta e non risponde.
Esiste un limite massimo per il numero di thread (30%) che possono eseguire contemporaneamente codice JavaScript su un processore di messaggi in qualsiasi momento. Una volta raggiunto questo limite, non saranno disponibili thread per eseguire il codice JavaScript. Pertanto, se sono presenti troppe richieste contemporaneamente
che eseguono l'API waitForComplete()
nel codice JavaScript, le richieste successive
non andranno a buon fine con un messaggio di errore 500 Internal Server Error
e Timed out
anche prima che il
criterio JavaScript scada.
In generale, questo scenario può verificarsi se il backend impiega molto tempo per elaborare le richieste o se il traffico è elevato.
Impatto
- Le richieste API non andranno a buon fine con
500 Internal Server Error
e con il messaggio di erroreTimed out
quando il numero di richieste simultanee che eseguonowaitForComplete()
nel codice JavaScript supera il limite predefinito. - La diagnosi della causa del problema può essere complicata perché JavaScript non va a buon fine con un errore
Timed out
anche se il limite di tempo per il criterio JavaScript specifico non è scaduto.
Best practice
Utilizza i callback nel client HTTP per semplificare il codice del callout e migliorare le prestazioni ed
evita di utilizzare waitForComplete()
nel codice JavaScript. Questo metodo garantisce che il thread che esegue JavaScript non venga bloccato fino al completamento della richiesta HTTP.
Quando viene utilizzato un callback, il thread invia le richieste HTTP nel codice JavaScript e ritorna al pool. Poiché il thread non è più bloccato, è disponibile per gestire altre richieste. Una volta completata la richiesta HTTP e quando il callback è pronto per essere eseguito, viene creata e aggiunta alla coda di attività un'attività. Uno dei thread del pool eseguirà il callback in base alla priorità dell'attività.
Codice JavaScript di esempio che utilizza i Callback in httpClient
function onComplete(response,error) { // Check if the HTTP request was successful if (response) { context.setVariable('example.status', response.status); } else { context.setVariable('example.error', 'Woops: ' + error); } } // Specify the callback Function as an argument httpClient.get("http://example.com", onComplete);