โมเดลออบเจ็กต์ JavaScript

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X
ข้อมูล

หัวข้อนี้จะกล่าวถึงโมเดลออบเจ็กต์ JavaScript ของ Apigee Edge คุณต้องเข้าใจโมเดลนี้หากตั้งใจจะใช้นโยบาย JavaScript เพื่อเพิ่ม JavaScript ที่กำหนดเองไปยังพร็อกซี API

เกี่ยวกับโมเดลออบเจ็กต์ Edge JavaScript

โมเดลออบเจ็กต์ JavaScript Apigee Edge จะกำหนดออบเจ็กต์ที่มีพร็อพเพอร์ตี้ที่เชื่อมโยง ซึ่งพร้อมใช้งานสำหรับการเรียกใช้โค้ด JavaScript ภายในโฟลว์พร็อกซี Apigee Edge คุณใช้นโยบาย JavaScript เพื่อแนบโค้ดที่กำหนดเองนี้กับขั้นตอนพร็อกซี API

ออบเจ็กต์ที่โมเดลนี้กำหนดมีขอบเขตภายในโฟลว์พร็อกซี API ซึ่งหมายความว่าออบเจ็กต์และพร็อพเพอร์ตี้บางอย่างจะใช้ได้ที่จุดที่เจาะจงในโฟลว์เท่านั้น เมื่อระบบเรียกใช้ JavaScript ระบบจะสร้างขอบเขตสำหรับการดำเนินการ ในขอบเขตดังกล่าว ระบบจะสร้างการอ้างอิงออบเจ็กต์เหล่านี้ขึ้น

  • context: ออบเจ็กต์ที่ให้สิทธิ์เข้าถึงบริบทข้อความ
  • request: ชวเลขที่อนุญาตการเข้าถึงออบเจ็กต์คำขอ
  • Response: ชวเลขที่ช่วยให้เข้าถึงออบเจ็กต์คำขอได้
  • crypto: ระบุฟังก์ชันแฮชแบบต่างๆ
  • print: ฟังก์ชันส่งเอาต์พุต
  • คุณสมบัติ: อนุญาตสิทธิ์การอ่านพร็อพเพอร์ตี้การกำหนดค่าในนโยบาย

ออบเจ็กต์บริบท

ออบเจ็กต์ context มีขอบเขตรวม และพร้อมให้ใช้งานได้ทุกที่ภายในขั้นตอนพร็อกซีของ API ซึ่งมีออบเจ็กต์ย่อย 4 รายการ ได้แก่ proxyRequest, proxyResponse, targetRequest, targetResponse ออบเจ็กต์ย่อยเหล่านี้กำหนดขอบเขตเป็นคำขอแวดล้อมและการตอบสนอง ไม่ว่าจะเป็นคำขอและการตอบกลับพร็อกซี หรือคำขอและคำตอบเป้าหมาย เช่น หากนโยบาย JavaScript ทำงานในส่วนปลายทางของพร็อกซีของโฟลว์ ออบเจ็กต์ context.proxyRequest และ context.proxyResponse ก็อยู่ในขอบเขต หาก JavaScript ทำงานในโฟลว์เป้าหมาย ออบเจ็กต์ context.targetRequest และ context.targetResponse จะอยู่ในขอบเขต

ออบเจ็กต์ context ยังมีพร็อพเพอร์ตี้และเมธอดตามที่อธิบายไว้อย่างละเอียดในหัวข้อนี้ เช่น ตัวอย่างโค้ด JavaScript ต่อไปนี้ใช้พร็อพเพอร์ตี้ context.flow และเรียกเมธอด get/setVariable() ใน context

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 จะให้คุณรับตัวแปรโฟลว์ และเครื่องมือตั้งค่าให้คุณตั้งค่าตัวแปรโฟลว์ โดยทั่วไปแล้ว ตัวแปรเหล่านี้จะใช้ได้ในขั้นตอนของพร็อกซีและใช้โดยนโยบายอื่นๆ ได้

ดูรายละเอียดและตัวอย่างเพิ่มเติมได้ที่การอ้างอิงออบเจ็กต์บริบทด้านล่าง

ออบเจ็กต์ Crypto

ออบเจ็กต์คริปโตจะเพิ่มการรองรับการเข้ารหัสพื้นฐานที่มีประสิทธิภาพสูงลงในโมเดล JavaScript Object Model ดูรายละเอียดและตัวอย่างเพิ่มเติมได้ที่ข้อมูลอ้างอิงออบเจ็กต์ Crypto ด้านล่าง

ออบเจ็กต์คำขอและการตอบกลับ

ออบเจ็กต์ request และ response อ้างอิงสั้นถึงคำขอแวดล้อมและการตอบสนอง ไม่ว่าจะเป็นคำขอและการตอบกลับพร็อกซี หรือคำขอและการตอบสนองเป้าหมาย ออบเจ็กต์ที่ตัวแปรเหล่านี้อ้างอิงจะขึ้นอยู่กับบริบทที่นโยบาย JavaScript ดำเนินการ หาก JavaScript ทำงานในกระบวนการของปลายทางของพร็อกซี ตัวแปรคำขอและการตอบกลับจะอ้างอิง context.proxyRequest และ context.proxyResponse หาก JavaScript ทำงานในโฟลว์เป้าหมาย ตัวแปรจะอ้างอิงถึง context.targetRequest และ context.targetResponse

โมเดลออบเจ็กต์ JavaScript มีฟังก์ชัน print() ที่ใช้ส่งออกข้อมูลการแก้ไขข้อบกพร่องไปยังเครื่องมือ Edge Trace ได้ ดูแก้ไขข้อบกพร่องด้วยคำสั่ง Print() ของ JavaScript

ออบเจ็กต์พร็อพเพอร์ตี้

เมื่อใช้องค์ประกอบ ในการกำหนดค่านโยบาย โค้ด JavaScript จะเข้าถึงค่าของพร็อพเพอร์ตี้เหล่านั้นได้โดยใช้ตัวแปร properties

ตัวอย่างเช่น หากการกําหนดค่า JavaScript ประกอบด้วย

<Javascript name='JS-1' >
  <Properties>
    <Property name="number">8675309</Property>
    <Property name="firstname">Jenny</Property>
  </Properties>
  <ResourceURL>jsc://my-code.js</ResourceURL>
</Javascript>

จากนั้นใน my-code.js คุณจะทําสิ่งต่อไปนี้ได้

  print(properties.firstname);  // prints Jenny
  print(properties.number);  // 8675309

ในทางปฏิบัติแล้ว การกำหนดค่าอาจทำให้โค้ดทำงานแตกต่างออกไปเมื่อเรียกใช้ในสภาพแวดล้อมที่ต่างกัน ในช่วงเวลาที่ต่างกัน หรือด้วยเหตุผลใดก็ได้

ตัวอย่างต่อไปนี้ระบุ "ชื่อตัวแปร" และรูปแบบเอาต์พุตที่ JavaScript ควรนำข้อมูลออกมา

<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 โค้ดอาจมีลักษณะดังนี้
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));
}

การอ้างอิงออบเจ็กต์ Crypto

ออบเจ็กต์การเข้ารหัสช่วยให้คุณใช้ฟังก์ชันการแฮชแบบเข้ารหัสพื้นฐานใน JavaScript ได้

ออบเจ็กต์ Crypto มีขอบเขตรวม และพร้อมให้ใช้งานได้ทุกที่ภายในขั้นตอนพร็อกซีของ API Crypto ให้คุณทำงานกับออบเจ็กต์แฮชต่อไปนี้

  • SHA-1
  • SHA256
  • SHA512
  • MD5

การทำงานกับออบเจ็กต์ SHA-1

คุณสร้างออบเจ็กต์ SHA-1 อัปเดต แล้วแปลงเป็นค่าเลขฐาน 16 และเลขฐาน 64 ได้

สร้างออบเจ็กต์ SHA-1 ใหม่

var _sha1 = crypto.getSHA1();

อัปเดตออบเจ็กต์ SHA-1

ไวยากรณ์

_sha1.update(value);

พารามิเตอร์

  • value - (สตริง) ค่าสตริงใดๆ

ตัวอย่าง

อัปเดตออบเจ็กต์ SHA-1

_sha1.update("salt_value");

_sha1.update("some text");

แสดงผลออบเจ็กต์ SHA-1 เป็นสตริงฐานสิบหก

var _hashed_token = _sha1.digest();

แสดงผลออบเจ็กต์ SHA-1 เป็นสตริง base64

var _hashed_token = _sha1.digest64();

การทำงานกับออบเจ็กต์ SHA-256

คุณสร้างออบเจ็กต์ SHA-256 อัปเดต รวมถึงแปลงเป็นค่าฐานสิบหกและ 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 เป็นสตริงฐานสิบหก

var _hashed_token = _sha256.digest();

แสดงผลออบเจ็กต์ SHA-256 เป็นสตริง base64

var _hashed_token = _sha256.digest64();

การทำงานกับออบเจ็กต์ SHA-512

คุณสร้างออบเจ็กต์ SHA-512 อัปเดต แล้วแปลงเป็นค่าเลขฐาน 16 และเลขฐาน 64 ได้

สร้างออบเจ็กต์ SHA-512 ใหม่

var _sha512 = crypto.getSHA512();

อัปเดตออบเจ็กต์ SHA-512

ไวยากรณ์

_sha512.update(value);

พารามิเตอร์

  • value - (สตริง) ค่าสตริงใดๆ

ตัวอย่าง

อัปเดตออบเจ็กต์ SHA-512

_sha512.update("salt_value");

_sha512.update("some text");

แสดงผลออบเจ็กต์ SHA-512 เป็นสตริงฐานสิบหก

var _hashed_token = _sha512.digest();

แสดงผลออบเจ็กต์ SHA-512 เป็นสตริง base64

var _hashed_token = _sha512.digest64();

การทำงานกับออบเจ็กต์ MD5

คุณสามารถสร้างออบเจ็กต์ MD5 อัปเดต และแปลงเป็นค่าฐานสิบหกและ Base64 ได้

สร้างออบเจ็กต์ MD5 ใหม่

var _md5 = crypto.getMD5();

อัปเดตออบเจ็กต์ MD5

ไวยากรณ์

_md5.update(value);

พารามิเตอร์

  • value - (สตริง) ค่าสตริงใดๆ

ตัวอย่าง

อัปเดตออบเจ็กต์ MD5 ดังนี้

_md5.update("salt_value");

_md5.update("some text");

แสดงผลออบเจ็กต์ MD5 เป็นสตริงฐานสิบหก

var _hashed_token = _md5.digest();

แสดงผลออบเจ็กต์ MD5 เป็นสตริง base64

var _hashed_token = _md5.digest64();

การสนับสนุนวันที่/เวลาของคริปโต

ออบเจ็กต์ Crypto รองรับรูปแบบการจัดรูปแบบวันที่/เวลา

crypto.dateFormat()

แสดงผลวันที่ในรูปแบบสตริง

ไวยากรณ์

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

พารามิเตอร์

  • format - (สตริง) การใช้งานที่สำคัญสำหรับพารามิเตอร์นี้คือ java.text.SimpleDateFormat เช่น "yyyy-MM-DD HH:mm:ss.SSS"
  • timezone - (สตริง, ไม่บังคับ) การใช้งานที่สำคัญสำหรับพารามิเตอร์นี้คือ java.util.TimeZone พารามิเตอร์นี้คือ sameDefault: 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');

เก็บตัวอย่างโดยใช้คริปโต

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 สำหรับธุรกรรมคำขอ/การตอบกลับแต่ละรายการที่เรียกใช้โดยพร็อกซี API ออบเจ็กต์ context แสดงเมธอดเพื่อรับ ตั้งค่า และนำตัวแปรที่เกี่ยวข้องกับธุรกรรมแต่ละรายการออก

ตัวแปรจะกำหนดพร็อพเพอร์ตี้เฉพาะของธุรกรรม ช่วงเวลาของวัน ภาษาของไคลเอ็นต์ที่ส่งคำขอ, User Agent ของไคลเอ็นต์ที่ส่งคำขอ และ URL ของบริการเป้าหมายล้วนเป็นตัวอย่างตัวแปรที่มีอยู่ใน context ดังนั้น context จึงมีประโยชน์สำหรับการสร้างตรรกะที่อาศัยพร็อพเพอร์ตี้เหล่านี้เพื่อดำเนินการกับลักษณะการทำงานที่กำหนดเอง

ดูการอ้างอิงตัวแปรโฟลว์และนโยบายการแยกตัวแปร

สรุปออบเจ็กต์บริบท

ตารางนี้อธิบายออบเจ็กต์บริบทและออบเจ็กต์ย่อยโดยย่อ รวมถึงแสดงรายการพร็อพเพอร์ตี้ที่เชื่อมโยงกับแต่ละรายการ

ชื่อ คำอธิบาย พร็อพเพอร์ตี้
context Wrapper สำหรับบริบทไปป์ไลน์การประมวลผลข้อความ รวมถึงโฟลว์คำขอและการตอบกลับที่เรียกใช้โดย ProxyEndpoint และ TargetEndpoint โฟลว์, เซสชัน
context.proxyRequest ออบเจ็กต์ที่แสดงข้อความคำขอขาเข้าไปยัง ProxyEndpoint (จากแอปที่ส่งคำขอไปยังพร็อกซี API) ส่วนหัว, พารามิเตอร์การค้นหา, เมธอด, เนื้อหา, URL
context.targetRequest ออบเจ็กต์ที่แสดงข้อความคำขอขาออกจาก TargetEndpoint (จากพร็อกซี API ไปยังบริการแบ็กเอนด์) ส่วนหัว, พารามิเตอร์การค้นหา, เมธอด, เนื้อหา, URL
context.targetResponse ออบเจ็กต์ที่แสดงข้อความตอบกลับเป้าหมายขาเข้า (จากบริการแบ็กเอนด์ไปยังพร็อกซี API) ส่วนหัว, เนื้อหา, สถานะ
context.proxyResponse ออบเจ็กต์ที่แสดงข้อความตอบกลับของพร็อกซีขาออก (จากพร็อกซี API ไปยังแอปที่ส่งคำขอ) ส่วนหัว, เนื้อหา, สถานะ
context.flow ชื่อของโฟลว์ปัจจุบัน โปรดดู context.flow ด้านล่าง
context.session แมปของคู่ชื่อ/ค่าที่คุณใช้เพื่อส่งผ่านออบเจ็กต์ระหว่าง 2 ขั้นตอนที่ต่างกันเพื่อดำเนินการในบริบทเดียวกันได้ เช่น context.session['key'] = 123 ดูข้อมูลเพิ่มเติมเกี่ยวกับกรณีและเวลาที่ไม่ควรใช้ออบเจ็กต์นี้ได้ที่ การพูดคุยเรื่องชุมชน Apigee

เมธอดออบเจ็กต์บริบท

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 แล้วเพิ่มค่านั้นเป็นพารามิเตอร์การค้นหาต่อท้าย URL http://mocktarget.apigee.net?user= แล้วตั้งค่า target.url ที่กำหนดไว้ล่วงหน้าเป็นค่าดังกล่าว

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

context.removeVariable()

นําตัวแปรออกจากบริบท

ไวยากรณ์

context.removeVariable('variable-name');

พร็อพเพอร์ตี้ออบเจ็กต์บริบท

context.flow

พร็อพเพอร์ตี้ flow เป็นสตริงที่ระบุโฟลว์พร็อกซีของ API ปัจจุบัน พร็อพเพอร์ตี้นี้ใช้เพื่อระบุโฟลว์ที่มี JavaScript แนบอยู่ ค่าที่รองรับมีดังนี้

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

ชื่อโฟลว์แต่ละรายการจะรวม PreFlow, PostFlow และโฟลว์แบบมีเงื่อนไขที่กำหนดไว้ใน ProxyEndpoints หรือ TargetEndpoints

พร็อพเพอร์ตี้ที่ไม่บังคับนี้มีประโยชน์เมื่อมีการเรียกใช้ JavaScript ทั่วไปในโฟลว์มากกว่า 1 โฟลว์ แต่อาจแตกต่างกันไปโดยขึ้นอยู่กับโฟลว์ที่คำสั่งทำงาน ใช้พร็อพเพอร์ตี้ Flow สำหรับโมดูล JavaScript ที่จะนำไปใช้ซ้ำในพร็อกซี API หลายรายการ ซึ่งจำเป็นต้องใช้โค้ดเพื่อตรวจสอบโฟลว์ปัจจุบันก่อนดำเนินการกับตรรกะ

ตัวอย่าง

ตั้งค่าส่วนหัว HTTP เฉพาะในโฟลว์ targetRequest

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

ตั้งค่าเนื้อหาใน Flow Flow ของพร็อกซีตอบกลับเท่านั้น:

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

context.session

แมปของคู่ชื่อ/ค่าที่ใช้ส่งออบเจ็กต์ระหว่างนโยบาย 2 รายการที่ดำเนินการภายในบริบทข้อความเดียวกันได้

ตัวอย่าง

ตั้งค่าในเซสชัน

context.session['key']  = 123;

รับมูลค่าจากเซสชันดังนี้

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

หน่วยย่อยออบเจ็กต์บริบท

ดังที่แสดงด้านล่าง โฟลว์ของพร็อกซี API ที่สมบูรณ์ประกอบด้วย 4 เฟสที่แตกต่างกัน แต่ละเฟสจะมีออบเจ็กต์ข้อความที่เกี่ยวข้องซึ่งเป็นรายการย่อยของออบเจ็กต์บริบท

  • context.proxyRequest: ข้อความคำขอขาเข้าที่ได้รับจากไคลเอ็นต์ที่ส่งคำขอ
  • context.targetRequest: ข้อความคำขอขาออกที่ส่งไปยังบริการแบ็กเอนด์
  • context.proxyResponse: ข้อความตอบกลับขาออกที่ส่งกลับไปยังไคลเอ็นต์ที่ส่งคำขอ
  • context.targetResponse: ข้อความคำขอขาเข้าที่ได้รับจากบริการแบ็กเอนด์

ส่วนต่อไปนี้อธิบายถึงวิธีการและสมบัติของวัตถุเหล่านี้

Context.*คำขอออบเจ็กต์ย่อย

สำหรับธุรกรรม HTTP แต่ละรายการที่จะดำเนินการในพร็อกซี API ระบบจะสร้างออบเจ็กต์ข้อความคำขอ 2 รายการ ได้แก่ inbound 1 รายการ (คำขอจากไคลเอ็นต์) และinbound 1 รายการ (คำขอที่สร้างโดยพร็อกซี API และส่งไปยังเป้าหมายแบ็กเอนด์)

ออบเจ็กต์ context มีออบเจ็กต์ย่อยที่แสดงถึงข้อความคำขอเหล่านี้: context.proxyRequest และ context.targetRequest ออบเจ็กต์เหล่านี้ช่วยให้คุณเข้าถึงพร็อพเพอร์ตี้ภายในโฟลว์คำขอที่อยู่ในขอบเขตเมื่อโค้ด JavaScript ทำงาน

หมายเหตุ: คุณใช้ออบเจ็กต์แบบย่อ request เพื่อเข้าถึงพร็อพเพอร์ตี้เหล่านี้ในขั้นตอนคำขอได้ด้วย ออบเจ็กต์ request จะอ้างอิงถึง context.proxyRequest หรือ context.targetRequest ขึ้นอยู่กับว่าโค้ด JavaScript ทำงานที่ใดในโฟลว์

เมนูตามบริบท*ขอพร็อพเพอร์ตี้ออบเจ็กต์ย่อย

ชื่อพร็อพเพอร์ตี้ คำอธิบาย
url

พร็อพเพอร์ตี้ url เป็นพร็อพเพอร์ตี้ความสะดวกในการอ่าน/เขียนที่รวม Scheme, โฮสต์, พอร์ต, เส้นทาง และพารามิเตอร์การค้นหาสำหรับ targetRequest เข้าด้วยกัน

URL ที่สมบูรณ์ของคำขอประกอบด้วยพร็อพเพอร์ตี้ต่อไปนี้

  • โปรโตคอล: โปรโตคอลของ URL (เช่น HTTP, HTTPS)
  • พอร์ต: พอร์ต (เช่น :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

ส่วนหัวของคำขอ HTTP สำหรับการแมปของ String => List

ตัวอย่าง

สำหรับคำขอ 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 ออบเจ็กต์ย่อย

สำหรับธุรกรรม HTTP แต่ละรายการที่จะดำเนินการในพร็อกซี API ระบบจะสร้างออบเจ็กต์ข้อความตอบกลับ 2 รายการ ได้แก่ inbound 1 รายการ (การตอบกลับจากบริการแบ็กเอนด์) และinbound 1 รายการ (การตอบกลับที่ส่งกลับไปยังไคลเอ็นต์)

ออบเจ็กต์บริบทมีออบเจ็กต์ย่อยที่แสดงถึงข้อความตอบกลับเหล่านี้: context.proxyResponse และ context.targetResponse ออบเจ็กต์เหล่านี้ช่วยให้คุณเข้าถึงพร็อพเพอร์ตี้ภายในขั้นตอนการตอบสนองที่อยู่ในขอบเขตเมื่อโค้ด JavaScript ทำงาน

หมายเหตุ: คุณยังใช้ออบเจ็กต์แบบย่อ response เพื่อเข้าถึงพร็อพเพอร์ตี้เหล่านี้จากขั้นตอนการตอบสนองได้ด้วย ออบเจ็กต์ response จะอ้างอิงถึง context.proxyResponse หรือ context.targetResponse ขึ้นอยู่กับว่าโค้ด JavaScript ทำงานที่ใดในโฟลว์

Context.*พร็อพเพอร์ตี้ออบเจ็กต์การตอบกลับ

ชื่อพร็อพเพอร์ตี้ คำอธิบาย
headers

ส่วนหัว HTTP ของข้อความตอบกลับเป็นการแมปของ String => List

ตัวอย่าง

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

มีวิธีที่สะดวกในการนำทางในเอกสาร XML โดยใช้เครื่องหมาย .asXML ส่วนนี้จะอธิบายวิธีใช้เครื่องหมายนี้และความแตกต่างจาก request.content และ context.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 ได้ด้วยการระบุชื่อองค์ประกอบและแอตทริบิวต์ คุณจะข้ามลำดับชั้นโดยใช้ไวยากรณ์อื่นไม่ได้

แก้ไขข้อบกพร่องด้วยคำสั่ง Print() ของ JavaScript

หากใช้นโยบาย JavaScript เพื่อเรียกใช้โค้ด JavaScript ที่กำหนดเอง โปรดทราบว่าคุณใช้ฟังก์ชัน Print() เพื่อส่งออกข้อมูลการแก้ไขข้อบกพร่องไปยังเครื่องมือติดตามได้ ฟังก์ชันนี้พร้อมใช้งานโดยตรงผ่านโมเดลออบเจ็กต์ 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 ที่ชื่อว่า stepExecution-stdout ได้ด้วย

การสร้างการเรียก JavaScript ด้วย httpClient

ใช้ httpClient เพื่อสร้างคำขอ HTTP แบบไม่พร้อมกันหลายรายการไปยัง URL จากภายในโค้ด JavaScript ที่กำหนดเองที่ดำเนินการในขั้นตอนพร็อกซี API ออบเจ็กต์ httpClient แสดงโดยโมเดลออบเจ็กต์ JavaScript Apigee Edge

เกี่ยวกับ httpClient

ออบเจ็กต์ httpClient ถูกเปิดเผยกับโค้ด JavaScript ที่กำหนดเองซึ่งทำงานใน Apigee Edge ผ่านโมเดลออบเจ็กต์ JavaScript หากต้องการแนบ JavaScript ที่กำหนดเองกับพร็อกซี API ให้ใช้นโยบาย JavaScript เมื่อนโยบายทำงาน โค้ด JavaScript ที่กำหนดเองจะทำงาน

ออบเจ็กต์ httpClient มีประโยชน์สำหรับการพัฒนาบริการผสมหรือแมชอัป ตัวอย่างเช่น คุณจะรวมการเรียกแบ็กเอนด์หลายรายการไว้ในเมธอด API เดียวได้ ออบเจ็กต์นี้โดยทั่วไปจะใช้เป็นอีกทางเลือกหนึ่งของนโยบาย Serviceส่วนขยายไฮไลต์

ต่อไปนี้เป็นรูปแบบการใช้งานพื้นฐาน สร้างอินสแตนซ์ของออบเจ็กต์คำขอ กำหนด URL (เช่น ให้กับบริการแบ็กเอนด์ที่คุณต้องการเรียกใช้) และเรียกใช้ httpClient.send ด้วยออบเจ็กต์คำขอนั้น

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

การอ้างอิง httpClient

ไคลเอ็นต์ HTTP แสดง 2 วิธี: get() และ send()

httpClient.get()

วิธีการอำนวยความสะดวกสำหรับคำขอ HTTP GET แบบง่ายโดยไม่มีการรองรับส่วนหัว HTTP

การใช้งาน

var exchangeObj = httpClient.get(url);

การส่งคืน

เมธอดจะแสดงออบเจ็กต์ exchange ออบเจ็กต์นี้ไม่มีพร็อพเพอร์ตี้ และแสดงเมธอดต่อไปนี้

  • isError(): (บูลีน) แสดงผล true หาก httpClient ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ รหัสสถานะ HTTP 4xx และ 5xx จะส่งผลให้ isError() false เนื่องจากการเชื่อมต่อเสร็จสมบูรณ์ และระบบส่งโค้ดตอบกลับที่ถูกต้องกลับมา หาก isError() แสดงผล true การเรียกไปยัง getResponse() จะแสดงผล JavaScript undefined
  • isSuccess(): (บูลีน) แสดงผล true หากการส่งเสร็จสมบูรณ์และสำเร็จ
  • isComplete(): (บูลีน) แสดงผล true หากคำขอเสร็จสมบูรณ์
  • waitForComplete(): หยุดชุดข้อความชั่วคราวจนกว่าคำขอจะเสร็จสมบูรณ์ (โดยการดำเนินการสำเร็จหรือจากข้อผิดพลาด)
  • getResponse(): (object) แสดงผลออบเจ็กต์การตอบกลับหาก httpClient.send() เสร็จสมบูรณ์และสำเร็จ ออบเจ็กต์ที่แสดงผลมีเมธอดและพร็อพเพอร์ตี้เหมือนกับออบเจ็กต์ Context.proxyResponse โปรดดูสรุปออบเจ็กต์บริบท
  • getError(): (สตริง) หากการเรียก httpClient.send() ทำให้เกิดข้อผิดพลาด จะแสดงข้อความแสดงข้อผิดพลาดเป็นสตริง

ตัวอย่าง

ส่งออบเจ็กต์คำขอที่กำหนดค่าอย่างสมบูรณ์ซึ่งมีพร็อพเพอร์ตี้ของคำขอ HTTP ใช้โค้ดเรียกกลับที่ไม่บล็อกเพื่อประมวลผลการตอบกลับ

// 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);

การใช้นโยบาย JavaScript

ใช้นโยบาย JavaScript เพื่อแนบโค้ด JavaScript ที่กำหนดเองไปยังโฟลว์พร็อกซี ดูนโยบาย JavaScript

หัวข้อที่เกี่ยวข้อง

บทความในชุมชน Apigee

คุณดูบทความที่เกี่ยวข้องเหล่านี้ได้ในชุมชน Apigee