Model obiektu JavaScript

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.

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 , kod JavaScript może uzyskać dostęp do wartości tych właściwości za pomocą zmiennej 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

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

context.flow

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';
}

context.session

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 opisano 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ść url to łatwa w obsłudze właściwość do odczytu i zapisu, która łączy parametry schematu, hosta, portu, ścieżki i zapytania na potrzeby obiektu targetRequest.

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

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

Podczas pobierania parametru url adres URL jest zwracany w takim 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 obiektu 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 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 String => List.

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

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:

  • 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 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 String => List.

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 HTTP 4xx i 5xx dają wynik isError() false, ponieważ połączenie zostało nawiązane i zwrócono prawidłowy kod odpowiedzi. Jeśli isError() zwraca wartość true, wywołanie metody getResponse() 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 operacja httpClient.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łanie httpClient.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

Artykuły na temat społeczności Apigee

Zapoznaj się z tymi artykułami w społeczności Apigee: