Stai visualizzando la documentazione di Apigee Edge.
Consulta la
documentazione di Apigee X. info
La policy JavaScript in Apigee Edge consente di aggiungere codice personalizzato che viene eseguito nel contesto di un flusso di proxy API. Ad esempio, il codice personalizzato nella policy JavaScript può essere utilizzato per:
- Recuperare e impostare le variabili di flusso
- Eseguire la logica personalizzata ed eseguire la gestione dei guasti
- Estrarre i dati dalle richieste o dalle risposte
- Modificare dinamicamente l'URL di destinazione del backend
- Aggiungere o rimuovere dinamicamente le intestazioni da una richiesta o una risposta
- Analizzare una risposta JSON
Client HTTP
Una funzionalità potente della policy 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 combinare le risposte in una singola API.
Codice JavaScript di esempio 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 che la richiesta HTTP effettiva venga completata.
Le richieste HTTP potrebbero richiedere da pochi secondi a pochi minuti. Dopo aver effettuato una richiesta HTTP, è importante sapere quando viene completata, in modo che la risposta alla richiesta possa essere elaborata. 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 finché la richiesta HTTP non viene completata e non viene restituita una risposta (esito positivo/negativo). A questo punto, la risposta di un servizio di backend o esterno può 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 sulle prestazioni.
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', response1.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.
- Chiama quindi
waitForComplete()per mettere in pausa l'esecuzione fino al completamento della richiesta.L'API
waitForComplete()fa sì che il thread che esegue il codice JavaScript venga bloccato finché il backend non completa l'elaborazione della richiesta e risponde.
Esiste un limite massimo al 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 simultanee che eseguono l'API waitForComplete() nel codice JavaScript, le richieste successive non andranno a buon fine e verrà visualizzato un messaggio di errore 500 Internal Server Error e "Timed out" anche prima del timeout della policy JavaScript.
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 e verrà visualizzato un messaggio di errore 500 Internal Server Error e 'Timed out' quando il numero di richieste simultanee che eseguono
waitForComplete()nel codice JavaScript supera il limite predefinito. - La diagnosi della causa del problema può essere complicata, poiché il codice JavaScript non va a buon fine e viene visualizzato un errore "Timed out" anche se il limite di tempo per la policy JavaScript specifica non è trascorso.
Best practice
Utilizza i callback nel client HTTP per semplificare il codice di callout e migliorare le prestazioni ed evitare 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 torna al pool. Poiché il thread non è più bloccato, è disponibile per gestire altre richieste. Una volta completata la richiesta HTTP e il callback è pronto per essere eseguito, verrà creata un'attività e aggiunta alla coda di attività. Uno dei thread del pool eseguirà il callback in base alla priorità del task.
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);