Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. Informacje
W tym temacie omawiamy obiektowy model JavaScriptu Apigee Edge. Zapoznaj się z tym modelem, jeśli zamierzasz używać zasady dotyczącej JavaScriptu do dodawania niestandardowego kodu JavaScript do serwera proxy interfejsu API.
Informacje o modelu obiektów Edge JavaScript
Model obiektów JavaScript Apigee Edge definiuje obiekty z powiązanymi właściwościami, które są dostępne dla kodu JavaScript uruchamianego w procesie serwera proxy Apigee Edge. Za pomocą zasady JavaScriptu możesz dołączać ten niestandardowy kod do procesu serwera proxy interfejsu API.
Obiekty zdefiniowane przez ten model mają zakres w procesie serwera proxy interfejsu API, co oznacza, że niektóre obiekty i właściwości są dostępne tylko w określonych punktach przepływu. Przy uruchamianiu JavaScriptu tworzony jest zakres jego wykonania. W tym zakresie tworzone są te odwołania do obiektów:
- context (Kontekst): obiekt zapewniający dostęp do kontekstu wiadomości.
- żądanie: skrót umożliwiający dostęp do obiektu żądania.
- response: skrót umożliwiający dostęp do obiektu żądania.
- crypto: udostępnia różne funkcje haszujące
- print: funkcja wysyłająca dane wyjściowe.
- properties: umożliwia dostęp w trybie odczytu do właściwości konfiguracji zasady.
Obiekt kontekstu
Obiekt context
ma zakres globalny. Jest dostępny wszędzie w obrębie procesu serwera proxy interfejsu API. Ma 4 obiekty podrzędne: proxyRequest
, proxyResponse
, targetRequest
, targetResponse
. Te obiekty podrzędne są ograniczone do żądań i odpowiedzi dotyczących otoczenia: żądania i odpowiedzi serwera proxy lub żądań docelowych i odpowiedzi. Jeśli na przykład zasada JavaScript jest wykonywana w punkcie końcowym serwera proxy w ramach procesu, zakres obejmuje obiekty context.proxyRequest
i context.proxyResponse
. Jeśli JavaScript działa w przepływie docelowym, zakres obejmuje obiekty context.targetRequest
i context.targetResponse
.
Obiekt context
ma też właściwości i metody opisane szczegółowo w tym temacie. Na przykład ten przykładowy kod JavaScript korzysta z właściwości context.flow
i wywołuje metody get/setVariable()
na stronie context
.
if (context.flow=="PROXY_REQ_FLOW") { var username = context.getVariable("request.formparam.user"); context.setVariable("USER.name", username); }
Te metody wchodzą w bezpośrednie interakcje ze zmiennymi przepływu.
Wartość właściwości context.flow
to bieżący zakres przepływu. W przepływie żądań serwera proxy jest on ustawiony na stałą PROXY_REQ_FLOW
. W docelowym przepływie odpowiedzi jest on ustawiony na TARGET_RESP_FLOW
. Ta stała przydaje się podczas wykonywania kodu zależnego od zakresu. Metoda getter pozwala uzyskać zmienne przepływu, a seter umożliwia ustawienie zmiennych przepływu. Zmienne te są ogólnie dostępne w procesie serwera proxy i mogą być wykorzystywane przez inne zasady.
Więcej informacji i przykłady znajdziesz poniżej w sekcji Dokumentacja obiektów kontekstu.
Obiekt kryptograficzny
Obiekt kryptograficzny dodaje obiektową obsługę JavaScriptu do podstawowej, wysoko wydajnej metody kryptograficznej. Więcej informacji i przykłady znajdziesz poniżej w dokumentacji obiektów kryptograficznych.
Obiekty żądań i odpowiedzi
Obiekty request
i response
to skrót odnoszący się do żądania i odpowiedzi na temat otoczenia, czyli żądania i odpowiedzi serwera proxy lub docelowego żądania i odpowiedzi. Obiekty, do których odwołują się te zmienne, zależą od kontekstu, w którym wykonywana jest zasada JavaScript. Jeśli kod JavaScript działa w przepływie punktu końcowego serwera proxy, zmienne żądania i odpowiedzi odwołują się do sekcji context.proxyRequest
i context.proxyResponse
. Jeśli JavaScript działa w przepływie docelowym, zmienne odwołują się do context.targetRequest
i context.targetResponse
.
Funkcjaprint()
Model obiektów JavaScript zawiera funkcję print()
, której możesz używać do przekazywania danych debugowania do narzędzia Edge Trace. Przeczytaj sekcję Debugowanie za pomocą instrukcji JavaScript Print().
Obiekt właściwości
Gdy w konfiguracji zasad używasz elementu properties
.
Jeśli na przykład Twoja konfiguracja JavaScript zawiera:
<Javascript name='JS-1' > <Properties> <Property name="number">8675309</Property> <Property name="firstname">Jenny</Property> </Properties> <ResourceURL>jsc://my-code.js</ResourceURL> </Javascript>
Następnie w my-code.js
możesz:
print(properties.firstname); // prints Jenny print(properties.number); // 8675309
W praktyce konfiguracja może pozwolić na odmienne zachowanie kodu w różnych środowiskach, w różnych momentach lub z dowolnego powodu.
Na przykład ten zapis określa „nazwę zmiennej” i styl danych wyjściowych, do których JavaScript powinien przekazywać informacje:
<Javascript name='JS-2' > <Properties> <Property name="output">my_output_variable</Property> <Property name="prettyPrint">true</Property> </Properties> <ResourceURL>jsc://emit-results.js</ResourceURL> </Javascript>Następnie w interfejsie
emit-results.js
kod może wyglądać tak:
var result = { prop1: "something", prop2 : "something else" } ; if (properties.prettyPrint == "true") { context.setVariable(properties.output, JSON.stringify(result, null, 2)); } else { context.setVariable(properties.output, JSON.stringify(result)); }
odwołanie do obiektów kryptograficznych
Obiekt kryptograficzny umożliwia wykonywanie podstawowych funkcji szyfrowania kryptograficznego w JavaScripcie.
Obiekt kryptograficzny ma zakres globalny. Jest dostępny wszędzie w obrębie procesu serwera proxy interfejsu API. Krypto pozwala pracować z tymi obiektami skrótu:
- SHA-1
- SHA256
- SHA512
- MD5
Praca z obiektami SHA-1
Możesz tworzyć obiekty SHA-1, aktualizować je i konwertować na wartości szesnastkowe i base64.
Tworzenie nowego obiektu SHA-1
var _sha1 = crypto.getSHA1();
Aktualizowanie obiektu SHA-1
Składnia
_sha1.update(value);
Parametry
- wartość – (ciąg znaków) dowolna wartość ciągu znaków.
Przykład
Zaktualizuj obiekt SHA-1:
_sha1.update("salt_value"); _sha1.update("some text");
Zwracanie obiektu SHA-1 jako ciągu szesnastkowego
var _hashed_token = _sha1.digest();
Zwracanie obiektu SHA-1 jako ciągu base64
var _hashed_token = _sha1.digest64();
Praca z obiektami SHA-256
Możesz tworzyć obiekty SHA-256, aktualizować je i konwertować na wartości szesnastkowe i base64.
Tworzenie nowego obiektu SHA-256
var _sha256 = crypto.getSHA256();
Aktualizowanie obiektu SHA-256
Składnia
_sha256.update(value);
Parametry
- wartość – (ciąg znaków) dowolna wartość ciągu znaków.
Przykład
Zaktualizuj obiekt SHA-256:
_sha256.update("salt_value"); _sha256.update("some text");
Zwracanie obiektu SHA-256 jako ciągu szesnastkowego
var _hashed_token = _sha256.digest();
Zwracanie obiektu SHA-256 jako ciągu base64
var _hashed_token = _sha256.digest64();
Praca z obiektami SHA-512
Możesz tworzyć obiekty SHA-512, aktualizować je i konwertować na wartości szesnastkowe i base64.
Tworzenie nowego obiektu SHA-512
var _sha512 = crypto.getSHA512();
Aktualizowanie obiektu SHA-512
Składnia
_sha512.update(value);
Parametry
- wartość – (ciąg znaków) dowolna wartość ciągu znaków.
Przykład
Zaktualizuj obiekt SHA-512:
_sha512.update("salt_value"); _sha512.update("some text");
Zwracanie obiektu SHA-512 jako ciągu szesnastkowego
var _hashed_token = _sha512.digest();
Zwracanie obiektu SHA-512 jako ciągu base64
var _hashed_token = _sha512.digest64();
Praca z obiektami MD5
Możesz tworzyć obiekty MD5, aktualizować je i konwertować na wartości szesnastkowe i base64.
Tworzenie nowego obiektu MD5
var _md5 = crypto.getMD5();
Aktualizowanie obiektu MD5
Składnia
_md5.update(value);
Parametry
- wartość – (ciąg znaków) dowolna wartość ciągu znaków.
Przykład
Aktualizowanie obiektu MD5:
_md5.update("salt_value"); _md5.update("some text");
Zwracanie obiektu MD5 jako ciągu szesnastkowego
var _hashed_token = _md5.digest();
Zwracanie obiektu MD5 jako ciągu base64
var _hashed_token = _md5.digest64();
Obsługa daty i godziny kryptografii
Obiekt kryptograficzny obsługuje wzorce formatowania daty i godziny.
crypto.dateFormat()
Zwraca datę w formacie ciągu znaków.
Składnia
crypto.dateFormat(format, [timezone], [time])
Parametry
- format – (ciąg znaków) Podstawowa implementacja tego parametru to java.text.SimpleDateFormat. Na przykład: „rrrr-MM-DD HH:mm:ss.SSS”.
- timezone – (ciąg znaków, opcjonalnie) podstawową implementacją tego parametru jest java.util.TimeZone. Ten parametr ma postać sameDefault: UTC
- time – (liczba, opcjonalnie) uniksowa wartość sygnatury czasowej do sformatowania. Domyślnie: bieżący czas
Przykłady
Sprawdzanie aktualnej godziny (z dokładnością do milisekund):
var _now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS');
Sprawdź aktualną godzinę według czasu pacyficznego:
var _pst = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST');
Oblicz wartość za dziesięć sekund od teraz:
var _timeNow = Number(context.getVariable('system.timestamp')); var ten_seconds = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);
Dodatkowe przykłady. Zapoznaj się też z dokumentacją java.text.SimpleDateFormat.
var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Użyj metody getHash(), aby uzyskać jeden z obsługiwanych obiektów skrótu
Przykłady
var _hash1 = crypto.getHash('MD5'); var _hash2 = crypto.getHash('SHA-1'); var _hash3 = crypto.getHash('SHA-256'); var _hash4 = crypto.getHash('SHA-512');
Sample z kryptowalutami
try { //get values to use with hash functions var salt = context.getVariable("salt") || 'SomeHardCodedSalt'; var host = context.getVariable("request.header.Host"); var unhashed_token = ""; var _timeNow = Number(context.getVariable('system.timestamp')); var now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow); unhashed_token = "|" + now + "|" + host //generate a hash with the unhashedToken: var sha512 = crypto.getSHA512(); sha512.update(salt); sha512.update(unhashed_token); //convert to base64 var base64_token = sha512.digest64(); // set headers context.setVariable("request.header.now", now); context.setVariable("request.header.token", base64_token); } catch(e) { throw 'Error in Javascript'; }
Dokumentacja obiektu kontekstu
- podsumowanie obiektu kontekstu,
- metody obiektów kontekstu
- właściwości obiektu kontekstu,
- obiekty podrzędne kontekstu,
W przypadku każdej transakcji żądania/odpowiedzi wykonywanej przez serwer proxy interfejsu API tworzony jest obiekt context
. Obiekt context
ujawnia metody pobierania, ustawiania i usuwania zmiennych związanych z każdą transakcją.
Zmienne definiują właściwości specyficzne dla transakcji. Pora dnia, język klienta wysyłającego żądanie, klient użytkownika wysyłającego żądanie i adres URL usługi docelowej to przykłady zmiennych dostępne w interfejsie context
. Dlatego właściwość context
przydaje się do budowania logiki, która korzysta z tych właściwości do wykonywania niestandardowych działań.
Zapoznaj się z informacjami o odniesieniu do zmiennych przepływu i wyodrębnianiu zmiennych.
Podsumowanie obiektu kontekstu
Ta tabela zawiera krótki opis obiektu kontekstu i jego elementów podrzędnych oraz zawiera listę właściwości, które są z nimi powiązane.
Nazwa | Opis | Właściwości |
---|---|---|
context |
Otoka kontekstu potoku przetwarzania wiadomości oraz przepływów żądań i odpowiedzi wykonywanych przez ProxyEndpoint i docelowy punkt końcowy. | przepływ, sesja |
context. proxyRequest |
Obiekt reprezentujący wiadomość przychodzącą do punktu końcowego ProxyEndpoint (z aplikacji wysyłającej żądanie do serwera proxy interfejsu API) | nagłówki, parametry zapytania, metoda, treść, adres url |
context. targetRequest |
Obiekt reprezentujący wiadomość wychodzącego żądania z docelowego punktu końcowego (z serwera proxy interfejsu API do usługi backendu). | nagłówki, parametry zapytania, metoda, treść, adres url |
context. targetResponse |
Obiekt reprezentujący przychodzącą odpowiedź docelową (z usługi backendu do serwera proxy interfejsu API) | nagłówki, treść, stan |
context. proxyResponse |
Obiekt reprezentujący wiadomość wychodzącą odpowiedź serwera proxy (z serwera proxy interfejsu API do aplikacji wysyłającej żądanie) | nagłówki, treść, stan |
context.flow |
Nazwa bieżącego procesu. | Więcej informacji znajdziesz poniżej w sekcji context.flow. |
context.session |
Mapa par nazwa/wartość, której można używać do przekazywania obiektów między 2 różnymi krokami wykonywanych w tym samym kontekście. Na przykład: context.session['key'] = 123 . |
Więcej informacji o tym, kiedy i kiedy nie należy używać tego obiektu, znajdziesz w tej dyskusji w społeczności Apigee. |
Metody obiektów kontekstu
context.getVariable()
Pobiera wartość wstępnie zdefiniowanej lub niestandardowej zmiennej.
Składnia
context.getVariable("variable-name");
Przykład
Aby uzyskać wartość na bieżący rok:
var year = context.getVariable('system.time.year');
context.setVariable()
Ustawia wartość zmiennej niestandardowej lub wstępnie zdefiniowanych zmiennych.
Składnia
context.setVariable("variable-name", value);
Przykład
Częstym przypadkiem ustawiania zmiennej jest dynamiczne zapisywanie docelowego adresu URL przez serwer proxy interfejsu API. Poniższy kod JavaScript pobiera wartość zmiennej o nazwie USER.name
, dołącza tę wartość jako parametr zapytania do adresu URL http://mocktarget.apigee.net?user=
, a potem ustawia tę wartość we wstępnie zdefiniowanej wartości target.url
.
context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));
context.removeVariable()
Usuwa zmienną z kontekstu.
Składnia
context.removeVariable('variable-name');
Właściwości obiektu kontekstu
Właściwość flow
to ciąg znaków, który identyfikuje bieżący przepływ serwera proxy interfejsu API. Ta właściwość służy do wskazywania przepływu, do którego jest dołączony JavaScript. Obsługiwane wartości to:
PROXY_REQ_FLOW
PROXY_RESP_FLOW
TARGET_REQ_FLOW
TARGET_RESP_FLOW
Każda nazwa przepływu obejmuje przepływ PreFlow, PostFlow i dowolne przepływy warunkowe zdefiniowane w elementach ProxyEndpoints lub TargetEndpoints.
Ta opcjonalna właściwość jest przydatna, gdy typowy JavaScript jest wykonywany w więcej niż jednym procesie, ale może działać różnie w zależności od przepływu pracy. Używaj właściwości Flow w przypadku modułów JavaScript przeznaczonych do ponownego wykorzystania na wielu serwerach proxy interfejsu API, w których kod jest wymagany do sprawdzenia bieżącego przepływu przed wykonaniem logiki.
Przykład
Ustaw nagłówek HTTP tylko w procesie targetRequest:
if (context.flow=="TARGET_REQ_FLOW") { context.targetRequest.headers['TARGET-HEADER-X']='foo'; }
Ustaw treść tylko w procesie proxyResponse:
if (context.flow=="PROXY_RESP_FLOW") { context.proxyResponse.content='bar'; }
Mapa par nazwa/wartość, której można używać do przekazywania obiektów między 2 zasadami wykonującymi w tym samym kontekście wiadomości.
Przykład
Ustaw wartość w sesji:
context.session['key'] = 123;
Uzyskanie korzyści z sesji:
var value = context.session['key']; // 123
Podrzędne obiekty kontekstu
Jak pokazano poniżej, pełny proces serwera proxy interfejsu API obejmuje 4 etapy, z których każda ma powiązany obiekt wiadomości będący obiektem podrzędnym obiektu kontekstu:
context.proxyRequest
: wiadomość przychodząca z żądania od klienta wysyłającego żądanie.context.targetRequest
: wiadomość wychodzącego żądania wysłana do usługi backendu.context.proxyResponse
: wiadomość wychodząca z odpowiedzią została zwrócona do klienta, który wysłał żądanie.context.targetResponse
: wiadomość przychodzącego żądania odebrana z usługi backendu.
W tych sekcjach opisujemy metody i właściwości tych obiektów:
context.*Żądanie obiektów podrzędnych
W przypadku każdej transakcji HTTP wykonywanej przez serwer proxy interfejsu API tworzone są 2 obiekty wiadomości żądania: jeden inbound (żądanie od klienta) i jeden inbound (żądanie wygenerowane przez serwer proxy interfejsu API i przesłane do miejsca docelowego backendu).
Obiekt context
zawiera obiekty podrzędne reprezentujące te komunikaty żądań: context.proxyRequest
i context.targetRequest
. Te obiekty umożliwiają dostęp do właściwości w przepływie żądania, które są w zakresie podczas wykonywania kodu JavaScript.
Uwaga: aby uzyskać dostęp do tych właściwości w przepływie żądania, możesz też użyć obiektu request
skrótu. Obiekt request
odwołuje się do context.proxyRequest
lub context.targetRequest
, w zależności od tego, w którym miejscu w procesie wykonuje się kod JavaScript.
kontekst.*Zażądaj właściwości obiektu podrzędnego
nazwa usługi, | Opis |
---|---|
url |
Właściwość Pełny adres URL żądania składa się z tych właściwości:
Podczas pobierania parametru
|
Przykłady: context.targetRequest.url = 'http://www.example.com/path?q1=1' context.targetRequest.protocol ='https'; |
|
headers |
Nagłówki żądań HTTP jako mapowanie obiektu |
Przykłady: W przypadku tego żądania HTTP: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5ZTen skrypt JavaScript: context.proxyRequest.headers['Content-Type']; context.proxyRequest.headers['Authorization']; zwróci następujące wartości application/json Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z |
|
queryParams |
Parametry zapytania dotyczącego wiadomości żądania jako mapowanie obiektu |
Przykłady: "?city=PaloAlto&city=NewYork" można uzyskać jako: context.proxyRequest.queryParams['city']; // == 'PaloAlto' context.proxyRequest.queryParams['city'][0] // == 'PaloAlto' context.proxyRequest.queryParams['city'][1]; // == 'NewYork' context.proxyRequest.queryParams['city'].length(); // == 2 |
|
method |
Czasownik HTTP ( |
Przykłady: W przypadku tego żądania: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z Następujący kod JavaScript: context.proxyRequest.method; zwróci następującą wartość POST |
|
body |
Treść (ładunek) wiadomości żądania HTTP. Treść żądania zawiera te elementy:
|
Przykłady: W przypadku treści XML: <customer number='1'> <name>Fred<name/> <customer/> Aby uzyskać dostęp do elementów obiektu XML w ten sposób: var name = context.targetRequest.body.asXML.name; Aby uzyskać dostęp do atrybutów XML, użyj notacji var number = context.targetRequest.body.asXML.@number; W przypadku treści żądania JSON: { "a": 1 , "b" : "2" } var a = context.proxyRequest.body.asJSON.a; // == 1 var b = context.proxyRequest.body.asJSON.b; // == 2 Aby odczytać parametry formularza: "vehicle=Car&vehicle=Truck" v0 = context.proxyRequest.body.asForm['vehicle'][0]; v1 = context.proxyRequest.body.asForm['vehicle'][1]; |
context.*Obiekty podrzędne odpowiedzi
Dla każdej transakcji HTTP wykonywanej przez serwer proxy interfejsu API tworzone są 2 obiekty wiadomości z odpowiedzią: jeden inbound (odpowiedź z usługi backendu) i jeden inbound (odpowiedź odesłana do klienta).
Obiekt kontekstu zawiera obiekty podrzędne reprezentujące te komunikaty z odpowiedziami: context.proxyResponse
i context.targetResponse
. Te obiekty umożliwiają dostęp do właściwości w przepływie odpowiedzi, który jest w zakresie podczas wykonywania kodu JavaScript.
Uwaga: aby uzyskać dostęp do tych właściwości z poziomu przepływu odpowiedzi, możesz też użyć obiektu response
skrótu. Obiekt response
odwołuje się do context.proxyResponse
lub context.targetResponse
, w zależności od tego, w którym miejscu w procesie wykonuje się kod JavaScript.
kontekst.*Właściwości obiektu odpowiedzi
nazwa usługi, | Opis |
---|---|
headers |
Nagłówki HTTP wiadomości z odpowiedzią jako mapowanie obiektu |
Przykład: var cookie = context.targetResponse.headers['Set-Cookie']; |
|
status |
Kod stanu z komunikatem o stanie właściwością. Jako właściwości dostępne są zarówno kod stanu, jak i komunikat o stanie. |
Przykład: var status = context.targetResponse.status.code; // 200 var msg = context.targetResponse.status.message; // "OK" |
|
content |
Treść HTTP (zawartość ładunku) komunikatu z odpowiedzią. Treść odpowiedzi ma następujących członków: context.targetResponse.content.asXML; context.targetResponse.content.asJSON; |
Korzystanie z notacji .asXML
Istnieje przydatna metoda przeglądania dokumentów XML z zastosowaniem notacji .asXML
.
Z tej sekcji dowiesz się, jak używać tego zapisu i czym różni się on od request.content
i context.proxyRequest.content
.
Na przykład:
request.content.asXML
lub
context.proxyRequest.content.asXML
Zarówno formy *.content
, jak i *.content.asXML
mogą być używane w kontekście ciągu znaków, a JavaScript spowoduje, że staną się one ciągami tekstowymi. W poprzednim przypadku (*.content
) ciąg znaków zawiera wszystkie deklaracje i komentarze XML. W drugim przypadku (*.content.asXML
) ciąg znaków z wyniku jest usuwany z deklaracji i komentarzy.
Przykład
msg.content:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error> <!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->
msg.content.asXML:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error>
Ponadto możesz poruszać się po hierarchii XML za pomocą formularza .asXML
, określając nazwy elementów i atrybutów. Nie można przemierzyć hierarchii, korzystając z innej składni.
Debugowanie za pomocą instrukcji JavaScript „print()”
Jeśli do wykonywania niestandardowego kodu JavaScript używasz zasady JavaScript, pamiętaj, że do narzędzia do śledzenia możesz użyć funkcji Print(), aby przekazywać informacje debugowania. Ta funkcja jest dostępna bezpośrednio w modelu obiektowym JavaScript. Na przykład:
if (context.flow=="PROXY_REQ_FLOW") { print("In proxy request flow"); var username = context.getVariable("request.queryparam.user"); print("Got query param: " + username); context.setVariable("USER.name", username); print("Set query param: " + context.getVariable("USER.name")); } if (context.flow=="TARGET_REQ_FLOW") { print("In target request flow"); var username = context.getVariable("USER.name"); var url = "http://mocktarget.apigee.net/user?" context.setVariable("target.url", url + "user=" + username); print("callout to URL: ", context.getVariable("target.url")); }
Aby wyświetlić dane wyjściowe, wybierz Dane wyjściowe ze wszystkich transakcji u dołu okna śledzenia. Dane wyjściowe możesz też znaleźć we właściwości logu czasu o nazwie stepExecution-stdout
.
Tworzenie objaśnień JavaScript za pomocą protokołu httpClient
httpClient
umożliwia wykonywanie wielu równoległych, asynchronicznych żądań HTTP wysyłanych do dowolnego adresu URL z poziomu niestandardowego kodu JavaScriptu wykonywanego w ramach procesu proxy interfejsu API.
Obiekt httpClient
jest wyświetlany przez obiektowy model JavaScript Apigee Edge.
httpClient – informacje
Obiekt httpClient
jest dostępny dla niestandardowego kodu JavaScript uruchomionego w Apigee Edge przez model obiektowy JavaScript. Aby dołączyć niestandardowy kod JavaScript do serwera proxy interfejsu API, użyj zasady dotyczącej JavaScriptu. Gdy zasada jest uruchamiana, niestandardowy kod JavaScript jest uruchamiany.
Obiekt httpClient
przydaje się do tworzenia usług złożonych lub mashupów. Możesz na przykład skonsolidować wiele wywołań backendu w jedną metodę interfejsu API.
Ten obiekt jest często używany jako alternatywa dla zasady ServiceCallout.
Oto podstawowy wzorzec użytkowania. Utwórz instancję obiektu żądania, przypisz do niego adres URL (na przykład do usługi backendu, którą chcesz wywołać) i wywołaj httpClient.send
z tym obiektem żądania.
var myRequest = new Request(); myRequest.url = "http://www.example.com"; var exchangeObj = httpClient.send(myRequest);
Dokumentacja httpClient
Klient HTTP udostępnia 2 metody: get()
i send()
.
httpClient.get()
Wygodna metoda obsługi prostych żądań HTTP GET
, która nie obsługuje nagłówków HTTP.
Wykorzystanie
var exchangeObj = httpClient.get(url);
Zwroty
Metoda zwraca obiekt exchange
. Ten obiekt nie ma właściwości i udostępnia te metody:
isError()
: (wartość logiczna) zwraca wartośćtrue
, jeśli httpClient nie może połączyć się z serwerem. Kody stanu HTTP4xx
i5xx
dają wynikisError()
false
, ponieważ połączenie zostało nawiązane i zwrócono prawidłowy kod odpowiedzi. JeśliisError()
zwraca wartośćtrue
, wywołanie metodygetResponse()
zwraca wartośćundefined
kodu JavaScript.isSuccess()
: (wartość logiczna) zwraca wartośćtrue
, jeśli wysyłanie się zakończyło i zakończyło się powodzeniem.isComplete()
: (wartość logiczna) zwraca wartośćtrue
, jeśli żądanie zostało zrealizowane.waitForComplete()
: wstrzymuje wątek do momentu zakończenia żądania (w wyniku powodzenia lub błędu).getResponse()
: (obiekt) zwraca obiekt odpowiedzi, jeśli operacjahttpClient.send()
zakończyła się powodzeniem. Zwrócony obiekt ma takie same metody i właściwości jak obiekt context.proxyResponse. Zobacz podsumowanie obiektu kontekstu.getError()
: (ciąg znaków) jeśli wywołaniehttpClient.send()
spowodowało błąd, zwraca komunikat o błędzie jako ciąg znaków.
Przykład
Wyślij w pełni skonfigurowany obiekt Request zawierający właściwości żądania HTTP. Użyj nieblokowego wywołania zwrotnego do przetworzenia odpowiedzi.
// Add the required the headers for making a specific API request var headers = {'X-SOME-HEADER' : 'some value' }; // Make a GET API request along with headers var myRequest = new Request("http://www.example.com","GET",headers); // Define the callback function and process the response from the GET API request 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(myRequest, onComplete);
Korzystanie z zasady JavaScriptu
Użyj zasady JavaScript, aby dołączyć niestandardowy kod JavaScript do procesu serwera proxy. Zobacz zasady dotyczące JavaScriptu.
Powiązane artykuły
- Zasady dotyczące JavaScriptu
- Obiektowy model JavaScript
- Podstawowe przykłady i instrukcje znajdziesz w artykule o serwerach proxy interfejsu Programming API z JavaScriptem.
- Praktyczne przykłady kodu JavaScript znajdziesz w przykładach Apigee Edge na GitHubie.
Artykuły na temat społeczności Apigee
Zapoznaj się z tymi artykułami w społeczności Apigee: