Wyświetlasz dokumentację Apigee Edge.
Przejdź do
dokumentacji Apigee X. info
Zasady JavaScript w Apigee Edge umożliwiają dodawanie niestandardowego kodu, który jest wykonywany w kontekście przepływu proxy interfejsu API. Na przykład niestandardowy kod w zasadach JavaScript może służyć do:
- pobierania i ustawiania zmiennych przepływu,
- wykonywania niestandardowej logiki i obsługi błędów,
- wyodrębniania danych z żądań lub odpowiedzi,
- dynamicznego edytowania docelowego adresu URL backendu,
- dynamicznego dodawania lub usuwania nagłówków z żądania lub odpowiedzi,
- parsowania odpowiedzi JSON.
Klient HTTP
Zaawansowaną funkcją zasad JavaScript jest klient HTTP. Klient HTTP (lub obiekt httpClient) może służyć do wykonywania jednego lub wielu wywołań usług backendu lub usług zewnętrznych. Klient HTTP jest szczególnie przydatny, gdy trzeba wykonywać wywołania do wielu usług zewnętrznych i łączyć odpowiedzi w jednym interfejsie API.
Przykładowy kod JavaScript, który wywołuje backend za pomocą obiektu httpClient
var headers = {'X-SOME-HEADER' : 'some value' };
var myRequest = new Request("http://www.example.com","GET",headers);
var exchange = httpClient.send(myRequest);
Obiekt httpClient udostępnia 2 metody: get i send (send jest używana w powyższym przykładowym kodzie) do wysyłania żądań HTTP. Obie metody są asynchroniczne i zwracają obiekt exchange przed zakończeniem rzeczywistego żądania HTTP.
Żądania HTTP mogą trwać od kilku sekund do kilku minut. Po wysłaniu żądania HTTP ważne jest, aby wiedzieć, kiedy zostanie ono zakończone, aby można było przetworzyć odpowiedź na to żądanie. Jednym z najczęstszych sposobów określania, kiedy żądanie HTTP zostanie zakończone, jest wywołanie metody waitForComplete() obiektu exchange.
waitForComplete()
Metoda waitForComplete() wstrzymuje wątek do momentu zakończenia żądania HTTP i zwrócenia odpowiedzi (powodzenie/niepowodzenie). Następnie można przetworzyć odpowiedź z backendu lub usługi zewnętrznej.
Przykładowy kod JavaScript z 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());
}
Antywzorzec
Użycie waitForComplete() po wysłaniu żądania HTTP w kodzie JavaScript będzie miało wpływ na wydajność.
Rozważmy ten kod JavaScript, który wywołuje waitForComplete() po wysłaniu żądania HTTP.
Kod 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);
}
W tym przykładzie:
- Kod JavaScript wysyła żądanie HTTP do backendu API.
- Następnie wywołuje
waitForComplete(), aby wstrzymać wykonanie do momentu zakończenia żądania.Interfejs API
waitForComplete()powoduje zablokowanie wątku, który wykonuje kod JavaScript, do momentu, aż backend zakończy przetwarzanie żądania i odpowie.
Liczba wątków, które mogą jednocześnie wykonywać kod JavaScript w procesorze komunikatów, jest ograniczona do 30%. Po osiągnięciu tego limitu nie będzie dostępnych żadnych wątków do wykonania kodu JavaScript. Jeśli więc zbyt wiele jednoczesnych żądań wykonuje interfejs API waitForComplete() w kodzie JavaScript, kolejne żądania zakończą się niepowodzeniem i wyświetli się komunikat o błędzie 500 Internal Server Error oraz „Timed out” (Przekroczono limit czasu), zanim upłynie limit czasu zasad JavaScript.
Ogólnie rzecz biorąc, ten scenariusz może wystąpić, jeśli backend długo przetwarza żądania lub występuje duży ruch.
Wpływ
- Żądania API zakończą się niepowodzeniem i wyświetli się komunikat o błędzie 500 Internal Server Error oraz „Timed out” (Przekroczono limit czasu), gdy liczba jednoczesnych żądań wykonujących
waitForComplete()w kodzie JavaScript przekroczy wstępnie zdefiniowany limit. - Zdiagnozowanie przyczyny problemu może być trudne, ponieważ JavaScript kończy się niepowodzeniem z powodu błędu „Timed out” (Przekroczono limit czasu), mimo że nie upłynął limit czasu dla konkretnych zasad JavaScript.
Sprawdzona metoda
Aby usprawnić kod wywołania i zwiększyć wydajność, używaj wywołań zwrotnych w kliencie HTTP i unikaj używania waitForComplete() w kodzie JavaScript. Ta metoda zapewnia, że wątek wykonujący JavaScript nie zostanie zablokowany do momentu zakończenia żądania HTTP.
Gdy używane jest wywołanie zwrotne, wątek wysyła żądania HTTP w kodzie JavaScript i wraca do puli. Ponieważ wątek nie jest już zablokowany, może obsługiwać inne żądania. Po zakończeniu żądania HTTP i przygotowaniu wywołania zwrotnego do wykonania zostanie utworzone zadanie i dodane do kolejki zadań. Jeden z wątków z puli wykona wywołanie zwrotne na podstawie priorytetu zadania.
Przykładowy kod JavaScript używający wywołań zwrotnych w 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);