Model obiektu JavaScript

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

W tym temacie omawiamy model obiektów w JavaScripcie w Apigee Edge. Jeśli zamierzasz użyć zasady JavaScript do dodania niestandardowego kodu JavaScript do serwera proxy interfejsu API, musisz dobrze poznać ten model.

Informacje o modelu obiektów JavaScript na serwerach brzegowych

Model obiektów JavaScript Apigee Edge definiuje obiekty z powiązanymi właściwościami, które są dostępne dla kodu JavaScript wykonywanego w ramach przepływu proxy Apigee Edge. Aby dołączyć ten niestandardowy kod do przepływu proxy interfejsu API, użyj zasady JavaScript.

Obiekty zdefiniowane przez ten model mają zakres w przepływie proxy interfejsu API, co oznacza, że niektóre obiekty i właściwości są dostępne tylko w określonych punktach przepływu. Gdy wykonywany jest kod JavaScript, tworzony jest zakres wykonania. W tym zakresie tworzone są te odwołania do obiektów:

  • context: obiekt, który zapewnia dostęp do kontekstu wiadomości;
  • request: 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 szyfrowania.
  • print: funkcja do emitowania danych wyjściowych.
  • properties: umożliwia dostęp z możliwością odczytu do właściwości konfiguracji w zasadach.

Obiekt kontekstu

Obiekt context ma zakres globalny. Jest dostępny wszędzie w przepływie serwera proxy interfejsu API. Ma 4 obiekty podrzędne: proxyRequest, proxyResponse, targetRequesttargetResponse. Te obiekty podrzędne są ograniczone do żądania i odpowiedzi dotyczących środowiska, czyli żądania i odpowiedzi serwera proxy lub żądania i odpowiedzi docelowych. Jeśli na przykład zasady JavaScript są wykonywane w części przepływu punktu końcowego serwera proxy, obiekty context.proxyRequestcontext.proxyResponse są w zakresie. Jeśli kod JavaScript jest uruchamiany w przepływie docelowym, obiekty context.targetRequestcontext.targetResponse są w zakresie.

Obiekt context ma też właściwości i metody, które zostały szczegółowo opisane w tym temacie. Na przykład ten kod JavaScript używa właściwości context.flow i wywołuje metody get/setVariable()context.

if (context.flow=="PROXY_REQ_FLOW") {
     var username = context.getVariable("request.formparam.user");
     context.setVariable("USER.name", username);
}

Te metody wchodzą w bezpośrednią interakcję ze zmiennymi przepływu. Wartość właściwości context.flow to bieżący zakres przepływu. W przepływie żądania serwera proxy jest ustawiona na stałą wartość PROXY_REQ_FLOW. Jeśli w przepływie odpowiedzi docelowej jest ustawiona wartość TARGET_RESP_FLOW. Ta stała jest przydatna do wykonywania kodu w określonym zakresie. Funkcja pobierająca umożliwia uzyskiwanie zmiennych przepływu, a funkcja ustawiająca – ustawianie zmiennych przepływu. Te zmienne są zwykle dostępne w przepływie serwera proxy i mogą być używane przez inne zasady.

Więcej informacji i przykłady znajdziesz w dokumentacji referencyjnej dotyczącej obiektu kontekstu poniżej.

Obiekt crypto

Obiekt crypto dodaje do modelu obiektów w JavaScripcie podstawową, wydajną obsługę kryptografii. Więcej informacji i przykładów znajdziesz w dokumentacji referencyjnej dotyczącej obiektów kryptograficznych poniżej.

Obiekty żądania i odpowiedzi

Obiekty requestresponse to skrócone odwołania do żądania i odpowiedzi w kontekście, czyli żądania i odpowiedzi serwera proxy lub żądania i odpowiedzi docelowej. Obiekty, do których odwołują się te zmienne, zależą od kontekstu, w którym wykonywana jest zasada JavaScript. Jeśli JavaScript jest uruchamiany w przepływie punktu końcowego proxy, zmienne żądania i odpowiedzi odnoszą się do context.proxyRequestcontext.proxyResponse. Jeśli JavaScript jest uruchamiany w przepływie docelowym, zmienne odnoszą się do context.targetRequestcontext.targetResponse.

Model obiektów JavaScript zawiera funkcję print(), której możesz użyć do wyświetlania informacji debugowania w narzędziu Edge Trace. Zobacz Debugowanie za pomocą instrukcji JavaScript print().

Obiekt właściwości

Jeśli w konfiguracji zasad używasz elementu , kod JavaScript może uzyskać dostęp do wartości tych właściwości za pomocą zmiennej properties.

Jeśli na przykład konfiguracja JavaScriptu 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 sprawić, że kod będzie działać inaczej w różnych środowiskach, w różnych momentach lub z dowolnego innego powodu.

Na przykład poniższy kod określa „nazwę zmiennej” i styl danych wyjściowych, do których JavaScript ma przesyłać 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>
emit-results.js kod może wykonać te czynności:
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));
}

Dokumentacja obiektu crypto

Obiekt crypto umożliwia wykonywanie podstawowych funkcji kryptograficznego haszowania w JavaScript.

Obiekt crypto ma zakres globalny. Jest dostępny wszędzie w przepływie serwera proxy interfejsu API. Moduł Crypto umożliwia pracę 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

  • value – (String) dowolna wartość w formie ciągu znaków.

Przykład

Aktualizowanie obiektu SHA-1:

_sha1.update("salt_value");

_sha1.update("some text");

Zwróć obiekt SHA-1 jako ciąg szesnastkowy

var _hashed_token = _sha1.digest();

Zwróć obiekt SHA-1 jako ciąg tekstowy w formacie base64

var _hashed_token = _sha1.digest64();

Praca z obiektami SHA-256

Możesz tworzyć obiekty SHA-256, aktualizować je i przekształcać w wartości szesnastkowe i base64.

Tworzenie nowego obiektu SHA-256

var _sha256 = crypto.getSHA256();

Aktualizowanie obiektu SHA-256

Składnia

_sha256.update(value);

Parametry

  • value – (String) dowolna wartość w formie ciągu znaków.

Przykład

Aktualizowanie obiektu SHA-256:

_sha256.update("salt_value");

_sha256.update("some text");

Zwróć obiekt SHA-256 jako ciąg szesnastkowy

var _hashed_token = _sha256.digest();

Zwróć obiekt SHA-256 jako ciąg znaków 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.

Utwórz nowy obiekt SHA-512

var _sha512 = crypto.getSHA512();

Aktualizowanie obiektu SHA-512

Składnia

_sha512.update(value);

Parametry

  • value – (String) dowolna wartość w formie 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();

Zwróć obiekt SHA-512 jako ciąg tekstowy w formacie 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.

Utwórz nowy obiekt MD5

var _md5 = crypto.getMD5();

Aktualizowanie obiektu MD5

Składnia

_md5.update(value);

Parametry

  • value – (String) dowolna wartość w formie ciągu znaków.

Przykład

Aby zaktualizować obiekt MD5:

_md5.update("salt_value");

_md5.update("some text");

Zwracanie obiektu MD5 jako ciągu szesnastkowego

var _hashed_token = _md5.digest();

Zwróć obiekt MD5 jako ciąg znaków base64

var _hashed_token = _md5.digest64();

Obsługa daty i godziny w kryptografii

Obiekt kryptograficzny obsługuje wzorce formatowania daty i godziny.

crypto.dateFormat()

Zwraca datę w formacie ciągu tekstowego.

Składnia

crypto.dateFormat(format, [timezone], [time])

Parametry

  • format – (String) podstawowa implementacja tego parametru to java.text.SimpleDateFormat. Na przykład: „rrrr-MM-DD GG:mm:ss.SSS”
  • timezone – (String, opcjonalny) Podstawowa implementacja tego parametru to java.util.TimeZone. Ten parametr jest taki sam. Wartość domyślna: UTC
  • time – (liczba, opcjonalnie) wartość sygnatury czasowej w formacie czasu uniksowego do sformatowania. Domyślnie: bieżący czas

Przykłady

Pobierz bieżący czas z dokładnością do milisekund:

var _now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS');

Sprawdź aktualną godzinę w strefie czasu pacyficznego:

var _pst = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST');

Pobierz wartość za 10 sekund:

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 funkcji getHash(), aby uzyskać dowolny 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');

Próbka z kryptowalutą

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

Dla każdej transakcji żądania/odpowiedzi wykonywanej przez proxy interfejsu API tworzony jest obiekt context. Obiekt context udostępnia metody pobierania, ustawiania i usuwania zmiennych związanych z każdą transakcją.

Zmienne definiują właściwości związane z transakcją. Pora dnia, lokalizacja klienta wysyłającego żądanie, ciąg tekstowy User-Agent klienta wysyłającego żądanie i adres URL usługi docelowej to przykłady zmiennych dostępnych w context. Dlatego warunek context jest przydatny do tworzenia logiki, która opiera się na tych właściwościach w celu wykonywania niestandardowych działań.

Zapoznaj się z dokumentacją zmiennych przepływu i zasadami dotyczącymi wyodrębniania zmiennych.

podsumowanie obiektu context

Ta tabela zawiera krótki opis obiektu kontekstu i jego elementów podrzędnych oraz listę właściwości powiązanych z każdym z nich.

Nazwa Opis Właściwości
context Obiekt opakowujący kontekst potoku przetwarzania wiadomości oraz żądanie i odpowiedź. Przepływy wykonywane przez ProxyEndpoint i TargetEndpoint. przepływ, sesja
context.proxyRequest Obiekt reprezentujący przychodzącą wiadomość żądania do ProxyEndpoint (z aplikacji wysyłającej żądanie do proxy interfejsu API). nagłówki, parametry zapytania, metoda, treść, adres URL
context.targetRequest Obiekt reprezentujący wychodzącą wiadomość żądania z elementu TargetEndpoint (z proxy interfejsu API do usługi backendu). nagłówki, parametry zapytania, metoda, treść, adres URL
context.targetResponse Obiekt reprezentujący przychodzącą wiadomość odpowiedzi docelowej (z usługi backendu do proxy interfejsu API). nagłówki, treść, stan,
context.proxyResponse Obiekt reprezentujący komunikat odpowiedzi proxy połączeń wychodzących (z proxy interfejsu API do aplikacji wysyłającej żądanie). nagłówki, treść, stan,
context.flow Nazwa bieżącej automatyzacji. Zobacz context.flow poniżej.
context.session Mapa par nazwa/wartość, której możesz używać do przekazywania obiektów między 2 różnymi krokami wykonywanymi w tym samym kontekście. Przykład: context.session['key'] = 123. Więcej informacji o tym, kiedy używać tego obiektu, a kiedy nie, znajdziesz w tej dyskusji na forum społeczności Apigee.

metody obiektu context

context.getVariable()

Pobiera wartość wstępnie zdefiniowanej lub niestandardowej zmiennej.

Składnia

context.getVariable("variable-name");

Przykład

Aby uzyskać wartość za bieżący rok:

var year = context.getVariable('system.time.year');

context.setVariable()

Ustawia wartość zmiennej niestandardowej lub dowolnej zmiennej z możliwością zapisu zdefiniowanej wstępnie.

Składnia

context.setVariable("variable-name", value);

Przykład

Typowy scenariusz ustawiania zmiennej to sytuacja, w której proxy interfejsu API musi dynamicznie zapisywać docelowy adres URL. Poniższy kod JavaScript pobiera wartość zmiennej o nazwie USER.name, dołącza ją jako parametr zapytania do adresu URL http://mocktarget.apigee.net?user=, a następnie ustawia predefiniowaną zmienną target.url na tę wartość.

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,

context.flow

Właściwość flow to ciąg tekstowy, który identyfikuje bieżący przepływ proxy interfejsu API. Ta właściwość służy do wskazywania przepływu, do którego jest dołączony kod 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 wstępny, przepływ końcowy i wszystkie przepływy warunkowe zdefiniowane w punktach końcowych proxy lub punktach końcowych docelowych.

Ta opcjonalna właściwość jest przydatna, gdy wspólny kod JavaScript jest wykonywany w więcej niż 1 automatyzacji, ale może się różnić w zależności od automatyzacji, w której jest wykonywany. Użyj właściwości Flow w przypadku modułów JavaScript, które mają być ponownie używane w wielu serwerach proxy interfejsu API, w których kod musi sprawdzać bieżący przepływ przed wykonaniem logiki.

Przykład

Ustaw nagłówek HTTP tylko w przypadku przepływu targetRequest:

if (context.flow=="TARGET_REQ_FLOW") {
     context.targetRequest.headers['TARGET-HEADER-X']='foo';
}

Ustaw treść tylko w przepływie proxyResponse:

if (context.flow=="PROXY_RESP_FLOW") {
     context.proxyResponse.content='bar';
}

context.session

Mapa par nazwa/wartość, która może służyć do przekazywania obiektów między 2 zasadami wykonywanymi w tym samym kontekście wiadomości.

Przykład

Ustaw wartość w sesji:

context.session['key']  = 123;

Pobierz wartość z sesji:

var value = context.session['key']; // 123

węzły podrzędne obiektu kontekstu,

Jak widać poniżej, kompletny przepływ proxy interfejsu API obejmuje 4 różne fazy, z których każda ma powiązany obiekt wiadomości będący elementem podrzędnym obiektu kontekstu:

  • context.proxyRequest: Wiadomość z żądaniem przychodzącym otrzymana od klienta wysyłającego żądanie.
  • context.targetRequest: wiadomość z żądaniem wychodzącym wysłana do usługi backendu.
  • context.proxyResponse: wychodząca wiadomość z odpowiedzią zwrócona do klienta wysyłającego żądanie.
  • context.targetResponse: Wiadomość z żądaniem przychodzącym otrzymana z usługi backendu.

W sekcjach poniżej opisujemy metody i właściwości tych obiektów:

context.*Request child objects

W przypadku każdej transakcji HTTP wykonywanej w proxy API tworzone są 2 obiekty wiadomości żądania: 1 przychodzący (żądanie od klienta) i 1 wychodzący (żądanie wygenerowane przez proxy API i przesłane do docelowego backendu).

Obiekt context ma obiekty podrzędne, które reprezentują te wiadomości z żądaniem: context.proxyRequestcontext.targetRequest. Te obiekty umożliwiają dostęp do właściwości w przepływie żądania, który jest w zakresie, gdy wykonywany jest kod JavaScript.

Uwaga: w przepływie żądania możesz też użyć obiektu shorthand request, aby uzyskać dostęp do tych właściwości. Obiekt request odnosi się do context.proxyRequest lub context.targetRequest w zależności od tego, w którym miejscu przepływu wykonywany jest kod JavaScript.

context.*Request child object properties

Nazwa usługi Opis
url

Właściwość url to wygodna właściwość do odczytu i zapisu, która łączy schemat, host, port, ścieżkę i parametry zapytania dla elementu targetRequest.

Pełny adres URL żądania składa się z tych właściwości:

  • protokół: protokół adresu URL (np. HTTP, HTTPS);
  • port: port (np. :80, :443);
  • host: host adresu URL (np. www.example.com);
  • ścieżka: ścieżka identyfikatora URI (np. /v1/mocktarget);

Podczas pobierania url zwracany jest adres URL w tym formacie:

protocol://host:port/path?queryParams

Przykłady:

context.targetRequest.url = 'http://www.example.com/path?q1=1'
context.targetRequest.protocol ='https';
headers

Nagłówki żądań HTTP jako mapowanie String => List

Przykłady:

W przypadku tego żądania HTTP:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
 Ten kod JavaScript:
context.proxyRequest.headers['Content-Type'];
context.proxyRequest.headers['Authorization'];

zwróci te wartości:

application/json
Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
queryParams

Parametry zapytania wiadomości żądania jako mapowanie String => List.

Przykłady:

"?city=PaloAlto&city=NewYork"

można uzyskać dostęp w postaci:

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 (GET, POST, PUT, DELETE, PATCH itp.) powiązany z żądaniem.

Przykłady:

W przypadku tej prośby:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z

Ten kod JavaScript:

context.proxyRequest.method;

zwróci tę wartość:

POST
body

Treść wiadomości (ładunek) żądania HTTP.

Treść żądania zawiera te elementy:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

Przykłady:

W przypadku treści XML:

<customer number='1'>
<name>Fred<name/>
<customer/>

Aby uzyskać dostęp do elementów obiektu XML, wykonaj te czynności:

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 w formacie 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.*Response child objects

W przypadku każdej transakcji HTTP wykonywanej w serwerze proxy interfejsu API tworzone są 2 obiekty wiadomości odpowiedzi: 1 przychodzący (odpowiedź z usługi backendu) i 1 wychodzący (odpowiedź wysyłana z powrotem do klienta).

Obiekt kontekstu ma obiekty podrzędne, które reprezentują te wiadomości odpowiedzi: context.proxyResponsecontext.targetResponse. Te obiekty umożliwiają dostęp do właściwości w przepływie odpowiedzi, który jest w zakresie, gdy wykonywany jest kod JavaScript.

Uwaga: możesz też użyć obiektu skróconego response, aby uzyskać dostęp do tych właściwości z poziomu przepływu odpowiedzi. Obiekt response odnosi się do context.proxyResponse lub context.targetResponse w zależności od tego, w którym miejscu przepływu wykonywany jest kod JavaScript.

context.*Właściwości obiektu odpowiedzi

Nazwa usługi Opis
headers

Nagłówki HTTP wiadomości odpowiedzi w postaci mapowania String => List.

Przykład:

var cookie = context.targetResponse.headers['Set-Cookie'];
status

Kod stanu z komunikatem o stanie jako właściwością. Zarówno kod stanu, jak i komunikat o stanie są dostępne jako właściwości.

Przykład:

var status = context.targetResponse.status.code;   // 200
var msg = context.targetResponse.status.message;   // "OK"
content

Treść HTTP (zawartość ładunku) komunikatu odpowiedzi.

Treść odpowiedzi zawiera te elementy:

context.targetResponse.content.asXML;
context.targetResponse.content.asJSON;

Używanie notacji .asXML

Istnieje wygodny sposób przeglądania dokumentu XML za pomocą notacji .asXML. W tej sekcji opisujemy, jak używać tej notacji i czym różni się ona od request.contentcontext.proxyRequest.content.

Na przykład:

request.content.asXML

lub

context.proxyRequest.content.asXML

Zarówno format *.content, jak i *.content.asXML może być używany w kontekście ciągu znaków, a JavaScript przekształci je w ciągi znaków. W pierwszym przypadku (*.content) ciąg znaków zawiera wszystkie deklaracje oraz komentarze XML. W tym drugim przypadku (*.content.asXML) wartość ciągu wynikowego jest oczyszczana 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>

Możesz też użyć formularza .asXML, aby przechodzić przez hierarchię XML, podając nazwy elementów i atrybutów. Nie można przechodzić przez hierarchię za pomocą innej składni.

Debugowanie za pomocą instrukcji JavaScript print()

Jeśli używasz zasady JavaScriptu do wykonywania niestandardowego kodu JavaScript, pamiętaj, że możesz użyć funkcji print(), aby wyświetlać informacje do debugowania w narzędziu do śledzenia. Ta funkcja jest dostępna bezpośrednio w modelu obiektów 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 zobaczyć dane wyjściowe, u dołu okna śledzenia kliknij Dane wyjściowe ze wszystkich transakcji. Dane wyjściowe znajdziesz też we właściwości śledzenia o nazwie stepExecution-stdout.

Wywoływanie JavaScriptu za pomocą httpClient

Użyj httpClient, aby wysyłać wiele równoległych, asynchronicznych żądań HTTP do dowolnego adresu URL z niestandardowego kodu JavaScript wykonywanego w przepływie serwera proxy interfejsu API. Obiekt httpClient jest udostępniany przez model obiektu JavaScript Apigee Edge.

Informacje o httpClient

Obiekt httpClient jest udostępniany niestandardowemu kodowi JavaScript działającemu na platformie Apigee Edge za pomocą modelu obiektów JavaScript. Aby dołączyć niestandardowy kod JavaScript do serwera proxy interfejsu API, użyj zasady JavaScript. Gdy zasada jest uruchamiana, wykonywany jest niestandardowy kod JavaScript.

Obiekt httpClient jest przydatny do tworzenia usług złożonych lub mashupów. Możesz na przykład połączyć kilka wywołań backendu w jedną metodę interfejsu API. Ten obiekt jest często używany jako alternatywa dla zasady ServiceCallout.

Oto podstawowy wzorzec użycia. Utwórz instancję obiektu Request, przypisz do niej adres URL (np. do usługi backendu, którą chcesz wywołać) i wywołaj funkcję 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()send().

httpClient.get()

Wygodna metoda do prostych żądań HTTP GET bez obsługi 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 klient HTTP nie mógł połączyć się z serwerem. Kody stanu HTTP 4xx5xx powodują isError() false, ponieważ połączenie zostało zakończone i zwrócono prawidłowy kod odpowiedzi. Jeśli funkcja isError() zwróci wartość true, wywołanie funkcji getResponse() zwróci obiekt JavaScript undefined.
  • isSuccess(): (wartość logiczna) zwraca wartość true, jeśli wysyłanie zostało zakończone i przebiegło pomyślnie.
  • isComplete(): (wartość logiczna) zwraca wartość true, jeśli żądanie zostało zrealizowane.
  • waitForComplete(): wstrzymuje wątek do czasu zakończenia żądania (powodzeniem lub błędem).
  • getResponse(): (object) Zwraca obiekt odpowiedzi, jeśli httpClient.send() zostało ukończone i zakończone sukcesem. Zwrócony obiekt ma identyczne metody i właściwości jak obiekt context.proxyResponse. Zobacz podsumowanie obiektu kontekstu.
  • getError(): (string) jeśli wywołanie funkcji httpClient.send() spowodowało błąd, zwraca komunikat o błędzie w postaci ciągu znaków.

Przykład

Wyślij w pełni skonfigurowany obiekt Request zawierający właściwości żądania HTTP. Użyj wywołania zwrotnego, które nie blokuje wątku, aby przetworzyć odpowiedź.

// 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 zasad JavaScript

Za pomocą zasady JavaScript możesz dołączyć niestandardowy kod JavaScript do przepływu proxy. Zapoznaj się z zasadami dotyczącymi JavaScriptu.

Powiązane artykuły

Artykuły na forum społeczności Apigee

Powiązane artykuły znajdziesz w społeczności Apigee: