JavaScript オブジェクト モデル

このトピックでは、Apigee Edge JavaScript オブジェクト モデルについて説明します。JavaScript ポリシーを使用してカスタム JavaScript を API プロキシに追加する場合は、このモデルを理解しておく必要があります。

Edge JavaScript オブジェクト モデルについて

Apigee Edge JavaScript オブジェクト モデルで定義するオブジェクトには、Apigee Edge プロキシフロー内で実行される JavaScript コードで使用可能なプロパティが関連付けられています。このカスタムコードは、JavaScript ポリシーを使用して API プロキシフローに追加します。

このモデルで定義されるオブジェクトのスコープは、API プロキシフロー内です。つまり、特定のオブジェクトとプロパティはフロー内の特定の箇所でのみ使用できます。JavaScript が実行されると、実行用のスコープが作成されます。このスコープでは、contextrequestresponsecrypto のオブジェクト参照が作成されます。オブジェクト モデルには、デバッグに使用できる print 関数も含まれています。

context オブジェクト

context オブジェクトのスコープはグローバルです。これは、API プロキシフロー内の任意の場所で使用できます。このオブジェクトには、proxyRequestproxyResponsetargetRequesttargetResponse の 4 つの子オブジェクトがあります。これらの子オブジェクトのスコープは、環境のリクエストとレスポンスです。つまり、プロキシのリクエストとレスポンス、またはターゲットのリクエストとレスポンスが、スコープになります。たとえば、JavaScript ポリシーがフローのプロキシ エンドポイントの部分で実行される場合、context.proxyRequest オブジェクトと context.proxyResponse オブジェクトはスコープに含まれます。JavaScript がターゲット フローで実行される場合、context.targetRequest オブジェクトと context.targetResponse オブジェクトはスコープに含まれます。

context オブジェクトには、プロパティとメソッドも含まれます。詳しい内容は、このトピックで説明します。たとえば、次の JavaScript コードの例では、context.flow プロパティを使用して、context で get/setVariable() メソッドが呼び出されます。

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

これらのメソッドは、フロー変数と直接やり取りします。context.flow プロパティの値が、現在のフロースコープになります。プロキシ リクエスト フローでは、この値は定数 PROXY_REQ_FLOW に設定されます。ターゲット レスポンス フローでは、TARGET_RESP_FLOW に設定されます。この定数は、スコープ固有のコードを実行する場合に便利です。getter を使用すると、フロー変数が取得できます。また、setter を使用すると、フロー変数を設定できます。これらの変数は、プロキシフローで使用できるだけでなく、その他のポリシーでも使用できます。

詳細と例については、以下の context オブジェクト リファレンスをご覧ください。

crypto オブジェクト

crypto オブジェクトでは、JavaScript オブジェクト モデルに、基本的な高性能の暗号サポートが追加されます。詳細と例については、下に示す crypto オブジェクトのリファレンスをご覧ください。

request オブジェクトと response オブジェクト

request オブジェクトと response オブジェクトは、環境のリクエストとレスポンス(プロキシのリクエストとレスポンス、またはターゲットのリクエストとレスポンス)に対する簡易的な参照です。これらの変数が参照するオブジェクトは、JavaScript ポリシーが実行されるコンテキストによって異なります。JavaScript がプロキシ エンドポイントのフローで実行される場合、リクエスト変数とレスポンス変数は、それぞれ context.proxyRequestcontext.proxyResponse を参照します。JavaScript がターゲット フローで実行される場合、これらの変数は context.targetRequestcontext.targetResponse を参照します。

print() 関数

JavaScript オブジェクト モデルの print() 関数を使用すると、デバッグ情報を Edge Trace ツールに出力できます。JavaScript の print() ステートメントでデバッグするをご覧ください。

crypto オブジェクトのリファレンス

crypto オブジェクトを使用すると、JavaScript で基本的な暗号ハッシュ関数を実行できます。

crypto オブジェクトのスコープはグローバルです。API プロキシフロー内の任意の場所で使用できます。Crypto では、次のハッシュ オブジェクトを使用できます。

  • SHA-1
  • SHA256
  • SHA512
  • MD5

SHA-1 オブジェクトの操作

SHA-1 オブジェクトを作成して更新できます。また、16 進数または base64 値に変換することもできます。

新しい SHA-1 オブジェクトを作成する

var _sha1 = crypto.getSHA1();

SHA-1 オブジェクトを更新する

構文

_sha1.update(value);

パラメータ

  • value -(文字列)任意の文字列値。

SHA-1 オブジェクトを更新する

_sha1.update("salt_value");

_sha1.update("some text");

SHA-1 オブジェクトを 16 進文字列として返す

var _hashed_token = _sha1.digest();

SHA-1 オブジェクトを base64 文字列として返す

var _hashed_token = _sha1.digest64();

SHA-256 オブジェクトの操作

SHA-256 オブジェクトを作成して更新できます。また、16 進数または base64 値に変換することもできます。

新しい SHA-256 オブジェクトを作成する

var _sha256 = crypto.getSHA256();

SHA-256 オブジェクトを更新する

構文

_sha256.update(value);

パラメータ

  • value -(文字列)任意の文字列値。

SHA-256 オブジェクトを更新する

_sha256.update("salt_value");

_sha256.update("some text");

SHA-256 オブジェクトを 16 進文字列として返す

var _hashed_token = _sha256.digest();

SHA-256 オブジェクトを base64 文字列として返す

var _hashed_token = _sha256.digest64();

SHA-512 オブジェクトの操作

SHA-512 オブジェクトを作成して更新できます。また、16 進数または base64 値に変換することもできます。

新しい SHA-512 オブジェクトを作成する

var _sha512 = crypto.getSHA512();

SHA-512 オブジェクトを更新する

構文

_sha512.update(value);

パラメータ

  • value -(文字列)任意の文字列値。

SHA-512 オブジェクトを更新する

_sha512.update("salt_value");

_sha512.update("some text");

SHA-512 オブジェクトを 16 進文字列として返す

var _hashed_token = _sha512.digest();

SHA-512 オブジェクトを base64 文字列として返す

var _hashed_token = _sha512.digest64();

MD5 オブジェクトの操作

MD5 オブジェクトを作成して更新できます。また、16 進数または base64 値に変換することもできます。

新しい MD5 オブジェクトを作成する

var _md5 = crypto.getMD5();

MD5 オブジェクトを更新する

構文

_md5.update(value);

パラメータ

  • value -(文字列)任意の文字列値。

MD5 オブジェクトを更新する

_md5.update("salt_value");

_md5.update("some text");

MD5 オブジェクトを 16 進の文字列として返す

var _hashed_token = _md5.digest();

MD5 オブジェクトを base64 文字列として返す

var _hashed_token = _md5.digest64();

crypto での日付 / 時刻のサポート

crypto オブジェクトは、日付 / 時刻のフォーマット パターンをサポートしています。

crypto.dateFormat()

日付を文字列形式で返します。

構文

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

パラメータ

  • format - (文字列)このパラメータの基礎となっている実装は java.text.SimpleDateFormat です。例: 'YYYY-MM-DD HH:mm:ss.SSS'
  • timezone - (文字列、省略可)このパラメータの基礎となっている実装は、java.util.TimeZone です。このパラメータのデフォルトは UTC です。
  • time -(数値、省略可)書式設定する Unix タイムスタンプ値。デフォルトは、現在の時刻です。

現在の時刻をミリ秒単位まで取得するには、次のように記述します。

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

太平洋標準時の現在時刻を取得するには、次のように記述します。

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

現在から 10 秒後の値を取得するには、次のように記述します。

var _timeNow = Number(context.getVariable('system.timestamp'));
var ten_seconds = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);

その他の例については、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");

getHash() を使用してサポート対象のハッシュ オブジェクトを取得する

var _hash1 = crypto.getHash('MD5');

var _hash2 = crypto.getHash('SHA-1');

var _hash3 = crypto.getHash('SHA-256');

var _hash4 = crypto.getHash('SHA-512');

crypto を使用したサンプル

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

context オブジェクトのリファレンス

context オブジェクトは、API プロキシによって実行されるリクエスト / レスポンス トランザクションごとに作成されます。context オブジェクトは、各トランザクションに関連する変数の取得、設定、削除のためのメソッドをエクスポーズします。

これらの変数は、トランザクションに固有のプロパティを定義します。contextで使用できる変数の例としては、時刻、リクエスト側のクライアントのロケール、リクエスト側のクライアントのユーザー エージェント、ターゲット・サービスの URL があります。したがって、context は、これらのプロパティに依存してカスタム動作を実行するロジックを構築するのに利用できます。

変数のリファレンスExtract Variables ポリシーをご覧ください。

context オブジェクトの概要

次の表に、context オブジェクトとその子オブジェクトの内容、および互いにバインドされるプロパティの一覧を示します。

名前 説明 プロパティ
context メッセージ処理パイプラインのコンテキストと、ProxyEndpoint と TargetEndpoint が実行するリクエスト / レスポンス フローのラッパー。 flow、session
context.proxyRequest ProxyEndpoint への受信リクエスト メッセージ(リクエスト側のアプリから API プロキシへのメッセージ)を表すオブジェクト。 headers、query parameters、method、body、url
context.targetRequest TargetEndpoint からの送信リクエスト メッセージ(API プロキシからバックエンド サービスへのメッセージ)を表すオブジェクト。 headers、query parameters、method、body、url
context.targetResponse 受信ターゲット レスポンス メッセージ(バックエンド サービスから API プロキシへのメッセージ)を表すオブジェクト。 headers、content、status
context.proxyResponse 送信プロキシ レスポンス メッセージ(API プロキシからリクエスト側のアプリへのメッセージ)を表すオブジェクト。 headers、content、status
context.flow 現在のフローの名前。 以下の context.flow をご覧ください。
context.session 同じコンテキストで実行される 2 つのステップ間でオブジェクトを交換する場合に使用する名前 / 値ペアのマップ。例: context.session['key'] = 123 このオブジェクトの使用方法については、Apigee コミュニティのディスカッションをご覧ください。

context オブジェクトのメソッド

context.getVariable()

事前定義変数またはカスタム変数の値を取得します。

構文

context.getVariable("variable-name");

現在の年の値を取得するには、次のように記述します。

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

context.setVariable()

カスタム変数の値または書き込み可能な事前定義変数の値を設定します。

構文

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

変数を設定する一般的なケースは、API プロキシによってターゲット URL が動的に書き込まれる必要がある場合です。次の JavaScript は、USER.name という変数の値を取得し、その値をクエリ パラメータとして http://mocktarget.apigee.net?user= という URL に追加し、定義済みの target.url をその値に設定します。

context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));

context.removeVariable()

コンテキストから変数を削除します。

構文

context.removeVariable('variable-name');

context オブジェクトのプロパティ

context.flow

flow プロパティは、現在の API プロキシフローを識別する文字列です。このプロパティは、JavaScript が追加されたフローを表す場合に使用されます。サポートされている値は次のとおりです。

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

フロー名には、PreFlow と PostFlow の他に、ProxyEndpoint(s) または TargetEndpoint(s) で定義された条件付きフローが含まれます。

共通の JavaScript が複数のフローで実行され、実行されるフローによって動作が変わる場合、このプロパティは便利です。複数の API プロキシで再利用する JavaScript モジュールに Flow プロパティを使用します。このコードは、ロジックの実行前に現在のフローを確認するために使用されます。

targetRequest フローでのみ HTTP ヘッダーを設定するには、次のように記述します。

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

proxyResponse フローでのみコンテンツを設定するには、次のように記述します。

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

context.session

同じメッセージ コンテキスト内の 2 つのポリシー間でオブジェクトを交換する際に使用する、名前 / 値ペアのマップ。

セッションに値を設定するには、次のように記述します。

context.session['key']  = 123;

セッションから値を取得するには、次のように記述します。

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

context オブジェクトの子

以下に示すように、完全な API プロキシフローは 4 つの異なるフェーズから構成されています。各フェーズには、コンテキスト オブジェクトの子になるメッセージ オブジェクトが関連付けられています。

  • context.proxyRequest: リクエスト側のクライアントから受信した受信リクエスト メッセージ。
  • context.targetRequest: バックエンド サービスに送信された送信リクエスト メッセージ。
  • context.proxyResponse: リクエスト側のクライアントに返される送信レスポンス メッセージ。
  • context.targetResponse: バックエンド サービスから受信した受信リクエスト メッセージ。

以下のセクションでは、次のオブジェクトのメソッドとプロパティについて説明します。

context.*Request 子オブジェクト

API プロキシで実行される HTTP トランザクションには、2 つのリクエスト メッセージ オブジェクトが作成されます。1 つは受信用(クライアントからのリクエスト)で、もう 1 つは送信用(API プロキシによって生成され、バックエンド ターゲットに送信されるリクエスト)です。

context オブジェクトには、context.proxyRequestcontext.targetRequest のリクエスト メッセージを表す子オブジェクトが含まれます。これらのオブジェクトを使用すると、JavaScript コードを実行する際に対象となるリクエスト フロー内のプロパティにアクセスできます。

注: 簡略化されたオブジェクト request を使用して、リクエスト フローでこれらのプロパティにアクセスすることもできます。request オブジェクトは、JavaScript コードが実行されるフローの場所に応じて、context.proxyRequest または context.targetRequest を参照します。

context.*Request 子オブジェクトのプロパティ

プロパティ名 説明
url

url プロパティは、読み取り / 書き込みのコンビニエンス プロパティです。targetRequest のスキーム、ホスト、ポート、パス、クエリ パラメータが組み合わされます。

リクエストの完全な URL は、次のプロパティから構成されます。

  • protocol: URL のプロトコル(HTTP、HTTPS など)
  • port: ポート(:80、:443 など)
  • host: URL のホスト(www.example.com など)
  • path: URI のパス(/v1/mocktarget など)

url を取得すると、URL が次の形式で返されます。

protocol://host:port/path?queryParams

例:


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

String => List のマッピングとしての HTTP リクエスト ヘッダー

例:

次の HTTP リクエストに対して、


POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
次のように JavaScript を記述した場合、

context.proxyRequest.headers['Content-Type'];
context.proxyRequest.headers['Authorization'];

次の値が返されます。


application/json
Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
queryParams

String => List のマッピングとしてのリクエスト メッセージのクエリ パラメータ。

例:


"?city=PaloAlto&city=NewYork"

これは次のようにアクセス可能です。


context.proxyRequest.queryParams['city'];  // == 'PaloAlto'
context.proxyRequest.queryParams['city'][0]     // == 'PaloAlto'
context.proxyRequest.queryParams['city'][1];    // == 'NewYork'
context.proxyRequest.queryParams['city'].length(); // == 2
method

リクエストに関連する HTTP 動詞(GET、POST、PUT、DELETE. PATCH など)

例:

次のリクエストに対して、


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

次のように JavaScript を記述した場合、


context.proxyRequest.method;

次の値が返されます。


POST
body

HTTP リクエストのメッセージの本文(ペイロード)

リクエスト本文には次のメンバーがあります。

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

例:

次のような XML 本文において、


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

XML オブジェクトの要素にアクセスするには、次のように記述します。


var name = context.targetRequest.body.asXML.name;

XML 属性にアクセスするには、次のように @ 表記を使用します。


var number = context.targetRequest.body.asXML.@number;

次のような JSON リクエスト本文において、


{
"a":  1 ,
"b" : "2"
}

var a = context.proxyRequest.body.asJSON.a;    // == 1
var b = context.proxyRequest.body.asJSON.b;    // == 2

フォーム パラメータを読み込むには、次のように記述します。


"vehicle=Car&vehicle=Truck"

v0 = context.proxyRequest.body.asForm['vehicle'][0];
v1 = context.proxyRequest.body.asForm['vehicle'][1];

context.*Response 子オブジェクト

API プロキシで実行される HTTP トランザクションには、2 つのレスポンス メッセージ オブジェクトが作成されます。1 つは受信用(バックエンド サービスからのリクエスト)で、もう 1 つは送信用(クライアントから戻されるレスポンス)です。

コンテキスト オブジェクトには、context.proxyResponsecontext.targetResponse のレスポンス メッセージを表す子オブジェクトが含まれます。これらのオブジェクトを使用すると、JavaScript コードの実行時に、スコープに存在するレスポンス フロー内のプロパティにアクセスできます。

注: 簡略化された response オブジェクトを使用している場合でも、レスポンス フローのこれらのプロパティにアクセスできます。response オブジェクトは、JavaScript コードが実行されるフローの場所に応じて、context.proxyResponse または context.targetResponse を参照します。

context.*Response オブジェクトのプロパティ

プロパティ名 説明
headers

String => List のマッピングとしてのレスポンス メッセージの HTTP ヘッダー。

例:


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

ステータス コードとステータス メッセージ。ステータス コードとステータス メッセージは両方ともプロパティとして使用できます。

例:


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

レスポンス メッセージの HTTP 本文(ペイロード コンテンツ)

レスポンス コンテンツには次のメンバーがあります。


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

.asXML 表記の使用

.asXML 表記を使用すると、XML ドキュメントを簡単に確認できます。このセクションでは、この表記の使用方法と、request.contentcontext.proxyRequest.content との違いについて説明します。

例:

request.content.asXML

または

context.proxyRequest.content.asXML

*.content*.content.asXML のどちらの形式も、文字列のコンテキストで使用可能です。JavaScript では、これらの形式は強制的に文字列に変換されます。前者の場合(*.content)、文字列にはすべての宣言と XML コメントが含まれます。後者の場合(*.content.asXML)、結果の文字列値から宣言とコメントが削除されます。

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>

さらに、要素と属性の名前を指定することで、.asXML フォームを使用して XML 階層を走査できます。別の構文を使用して、階層を走査することはできません。

JavaScript の print() ステートメントを使用してデバッグする

JavaScript ポリシーを使用して、カスタム JavaScript コードを実行する場合は、print() 関数を使用して Trace ツールにデバッグ情報を出力できます。この関数は、JavaScript オブジェクト モデルで直接使用できます。例:

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"));
}

出力を表示するには、Trace ウィンドウの下部にある [Output from all transactions] を選択します。「stepExecution-stdoutという Trace プロパティでも出力を確認できます。

httpClient で JavaScript コールアウトを行う

httpClient を使用すると、API プロキシフローで実行されるカスタム JavaScript コード内から任意の URL に対して複数の非同期 HTTP リクエストを同時に送信できます。httpClient オブジェクトは、Apigee Edge JavaScript オブジェクト モデルによって公開されます。

httpClient について

httpClient オブジェクトは、JavaScript オブジェクト モデルを介して、Apigee Edge で実行されるカスタム JavaScript コードに公開されます。カスタム JavaScript を API プロキシに追加するには、JavaScript ポリシーを使用します。ポリシーが実行されると、カスタム JavaScript コードが実行されます。

httpClient オブジェクトは、複合サービスやマッシュアップの開発に利用できます。たとえば、複数のバックエンド呼び出しを 1 つの API メソッドに統合できます。このオブジェクトは通常、ServiceCallout ポリシーの代わりに使用されます。

基本的な使用パターンは次のとおりです。Request オブジェクトをインスタンス化して(たとえば、呼び出し対象のバックエンド サービスの)URL に割り当て、そのリクエスト オブジェクトを使用して httpClient.send を呼び出します。

var myRequest = new Request();
myRequest.url = "http://www.example.com";
var exchangeObj = httpClient.send(myRequest);

httpClient リファレンス

HTTP クライアントは、get()send() という 2 つのメソッドを公開します。

httpClient.get()

単純な HTTP GET の実装に利用できるメソッドです。HTTP ヘッダーはサポートされません。

用法

var exchangeObj = httpClient.get(url);

戻り値

このメソッドは、exchange オブジェクトを返します。このオブジェクトにプロパティはありません。次のメソッドを公開します。

  • isError(): (ブール値)httpClient がサーバーに接続できなかった場合に true が返されます。接続が完了して有効なレスポンス コードが返されたため、HTTP ステータス コード 4xx5xxisError() falseになります。isError()true を返す場合、getResponse() の呼び出しにより JavaScript の undefined が返されます。
  • isSuccess(): (ブール値)送信が完了して成功した場合に、true が返されます。
  • isComplete(): (ブール値)リクエストが完了した場合に、true が返されます。
  • waitForComplete(): (成功またはエラーによって)リクエストが完了するまで、スレッドを一時停止します。
  • getResponse(): (オブジェクト)httpClient.send() が完了して成功した場合に、レスポンス オブジェクトが返されます。戻り値のオブジェクトには、context.proxyResponse オブジェクトと同じメソッドとプロパティが含まれます。Context オブジェクトの概要をご覧ください。
  • getError(): (文字列)httpClient.send() の呼び出しでエラーが発生した場合は、エラー メッセージが文字列として返されます。

exchange オブジェクトは、後から実際の HTTP レスポンスを取得するために、または後からレスポンスがタイムアウトしたかどうかを確認するために使用できます。例:

var ex1 = httpClient.get("http://www.example.com?api1");
context.session["ex1"] = ex1;  // Put the object into the session

var ex2 = httpClient.get("http://www.example.com?api2");
context.session["ex2"] = ex2;  // Put the object into the session

返されたオブジェクトには、後でフローの処理中にアクセスできます。ここでは、セッションから exchange オブジェクトを取得し、その exchange オブジェクトに別の JavaScript ポリシー内からアクセスしています。

var ex1 = context.session["ex1"]; // Get exchange objs from the session.
var ex2 = context.session["ex2"];

ex1.waitForComplete();      // pause until the response is returned,
                            // or error occurs, or JS step time
                            // limit has been reached.
ex2.waitForComplete(100);   // pause for a maximum of 100 ms.

if (ex1.isSuccess() && ex2.isSuccess()) {
   response.content = ex1.getResponse().content + ex2.getResponse().content;
}

例 1

var exchangeObj = httpClient.get("http://www.example.com");

httpClient.send()

HTTP リクエストのプロパティを含む完全に構成された Request オブジェクトを送信できます。

用法

var request = new Request(url, operation, headers);
var exchangeObj = httpClient.send(request);

戻り値

httpClient.send() を呼び出すと、exchange オブジェクトが返されます。このオブジェクトについて詳しくは、httpclient.get() メソッドについての説明をご覧ください。

例 2

var headers = {'X-SOME-HEADER' : 'some value' };
var myRequest = new Request("http://www.example.com","GET",headers);
var exchange = httpClient.send(myRequest);

例 3

var headers = {'Content-Type' : 'application/xml' };
var myRequest = new Request("http://www.example.com","POST",headers,""<foo>);
var exchange = httpClient.send(myRequest);

例 4

バックエンド サービスを呼び出し、レスポンス ペイロードを取得して、変数を抽出するには、次のように記述します。

注: このスニペットの元の完全なコードは、GitHub の Outbound OAuth サンプルから入手できます。

/**
 * Retrieve an access token for the Microsoft Translator API
 * http://msdn.microsoft.com/en-us/library/hh454950.aspx
 */
function getAccessToken() {
  var bodyObj = {
    'grant_type': translatorApi.grantType,
    'scope': translatorApi.scopeUrl,
    'client_id': translatorApi.clientId,
    'client_secret': translatorApi.clientSecret
  };

  var req = new Request(translatorApi.authUrl, 'POST', {'Content-Type':'application/json'}, JSON.stringify(bodyObj));
  var exchange = httpClient.send(req);

  // Wait for the asynchronous POST request to finish
  exchange.waitForComplete();

  if (exchange.isSuccess()) {
    var responseObj = exchange.getResponse().content.asJSON;

    if (responseObj.error) {
      throw new Error(responseObj.error_description);
    }

    return responseObj.access_token;
  } else if (exchange.isError()) {
    throw new Error(exchange.getError());
  }
}

context.setVariable('twitter-translate.apiAccessToken', getAccessToken());

例 5

HTTP リクエストのステータスをトラッキングするには、次のように記述します。

function userCheck() {
  var url = getAppServicesUrl() + '/users/' + username,
      headers = {
        Authorization : 'Bearer ' + appServicesAccessToken
      },
      req = new Request(url, 'GET', headers),
      exchange = httpClient.send(req),
      response, status;

  // Wait for the asynchronous GET request to finish
  exchange.waitForComplete();

  // get the response object from the exchange
  response = exchange.getResponse();

  // get the HTTP status code from the response
  status = response.status;

  if (status == 200) {
    context.setVariable('userCheck.trace', 'user exists');
  }
  else if (status == 404) {
    context.setVariable('userCheck.trace', 'user does not exist');
  }
  else {
    context.setVariable('userCheck.trace', 'user-inquiry-status:' + status);
  }
  return true;
}

例 6: レスポンス ヘッダーを繰り返し処理する

httpClient.get() レスポンスの一部として返されるレスポンス ヘッダーを反復処理する方法を示す、こちらのサンプルをご覧ください。

このサンプルで使用されている JavaScript の関連コードは次のとおりです。

var response = httpClient.get("http://mocktarget.apigee.net/json");
// set the pending request into a context variable
context.setVariable('pendingResponse', response);

var headers = "";

var response = context.getVariable('pendingResponse');
if (response) { // retrieve the pending request from the context variable
    response.waitForComplete();
    if (response.isSuccess()) {
        for (var n in response.getResponse().headers) {
            headers = headers + n + " --> " + response.getResponse().headers[n] + "\n";
        }
    }
    context.setVariable("response_headers", headers);
}

JavaScript ポリシーの使用

JavaScript ポリシーを使用して、カスタム JavaScript コードをプロキシフローに追加します。JavaScript ポリシーをご覧ください。

関連トピック

Apigee コミュニティの記事

次の関連記事は、Apigee コミュニティでご覧いただけます。