Przeglądasz dokumentację Apigee Edge.
Przejdź do
Dokumentacja Apigee X. informacje.
Polityka JavaScript w Apigee Edge umożliwia dodawanie kodu niestandardowego, który jest wykonywany w kontekście przepływu proxy interfejsu API. Niestandardowy kod w zasadach JavaScript może na przykład służyć do:
- Pobieranie i ustawianie zmiennych przepływu
- Wykonaj niestandardową logikę i usuń błędy
- Wyodrębnianie danych z żądań lub odpowiedzi
- Dynamiczne edytowanie docelowego adresu URL backendu
- Dynamiczne dodawanie i usuwanie nagłówków z żądania lub odpowiedzi
- Analizowanie odpowiedzi JSON
Klient HTTP
Zaawansowaną funkcją zasad JavaScriptu jest klient HTTP. Klient HTTP (lub obiekt httpClient
) może być używany do wykonywania jednego lub wielu wywołań backendu bądź usług zewnętrznych. Klient HTTP jest szczególnie przydatny, gdy trzeba wykonać wywołania do wielu zewnętrznych usług i złożyć odpowiedzi w jednym interfejsie API.
Przykładowy kod JavaScript wywołujący backend z obiektem 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
używany w powyższym przykładowym kodzie) do wysyłania żądań HTTP. Obie metody są asynchroniczne i zwracają obiekt exchange
, zanim zostanie zakończone rzeczywiste żądanie HTTP.
Realizacja żądań HTTP może potrwać od kilku sekund do kilku minut. Po zgłoszeniu żądania HTTP trzeba znać moment jego zakończenia, by móc przetworzyć odpowiedź. Jednym z najczęstszych sposobów określenia, kiedy żądanie HTTP jest realizacja żądania, jest wywołanie metody waitForComplete()
obiektu exchange
.
waitForComplete()
Metoda waitForComplete()
wstrzymuje wątek do czasu zakończenia żądania HTTP i zwrócenia odpowiedzi (sukces/niepowodzenie). Następnie może być przetworzona odpowiedź z backendu lub usługi zewnętrznej.
Przykładowy kod JavaScript z funkcją 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()); }
Antywzór
Użycie metody waitForComplete()
po wysłaniu żądania HTTP w kodzie JavaScript będzie miało wpływ na wydajność.
Przeanalizuj poniższy kod JavaScript, który wywołuje funkcję waitForComplete()
po wysłaniu żądania HTTP.
Kod pliku 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 interfejsu API backendu.
- Następnie wywołuje metodę
waitForComplete()
, aby wstrzymać wykonanie do momentu zakończenia żądania.Interfejs API
waitForComplete()
powoduje zablokowanie wątku wykonującego kod JavaScript do czasu zakończenia przetwarzania żądania przez backend i odpowiedzi.
Istnieje górny limit liczby wątków (30%), które mogą w dowolnym momencie wykonywać kod JavaScript w procesorze wiadomości. Po osiągnięciu tego limitu nie będzie już żadnych wątków dostępnych do wykonania kodu JavaScript. Jeśli więc interfejs API waitForComplete()
w kodzie JavaScript jest wykonywany zbyt wiele równoczesnych żądań, kolejne żądania będą kończyć się niepowodzeniem z komunikatem 500 Wewnętrzny błąd serwera i „Przekroczono limit czasu”. nawet przed upływem limitu czasu zasady JavaScript.
Ogólnie ten scenariusz może wystąpić, jeśli przetwarzanie żądań w backendzie zajmuje dużo czasu lub jeśli istnieje duży ruch.
Wpływ
- Żądania do interfejsu API zakończą się niepowodzeniem i wyświetli się 500 Wewnętrzny błąd serwera i komunikat o błędzie „Przekroczono limit czasu”. gdy liczba równoczesnych żądań wykonanych
waitForComplete()
w kodzie JavaScript przekracza wstępnie zdefiniowany limit. - Zdiagnozowanie przyczyny problemu może być trudne, ponieważ kod JavaScript kończy się niepowodzeniem i wyświetlany jest komunikat „Upłynął limit czasu”. mimo że limit czasu dla określonej zasady JavaScriptu jeszcze nie minął.
Sprawdzona metoda
Aby uprościć kod ramki i poprawić wydajność, użyj wywołań zwrotnych w kliencie HTTP. Unikaj też stosowania w kodzie JavaScript parametru waitForComplete()
. Zapewnia ona, że wątek wykonujący kod JavaScript nie zostanie zablokowany, dopóki żądanie HTTP nie zostanie ukończone.
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 zostanie utworzone zadanie, które zostanie dodane do kolejki zadań. Jeden z wątków z puli wykona wywołanie zwrotne na podstawie priorytetu zadania.
Przykładowy kod JavaScript z wywołaniami zwrotnymi 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);