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

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

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

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

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

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

ออบเจ็กต์ crypto

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

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

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

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

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

เมื่อใช้องค์ประกอบ ในการกำหนดค่านโยบาย โค้ด 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 เป็นค่าเลขฐานสิบหกและ 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 เป็นสตริงเลขฐานสิบหก

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 เป็นค่าฐาน 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 เป็นค่าฐาน 16 และ 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.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');

ตัวอย่างที่มีคริปโต

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 จึงมีประโยชน์ในการสร้างตรรกะที่อิงตามพร็อพเพอร์ตี้เหล่านี้เพื่อดำเนินการ ลักษณะการทำงานที่กำหนดเอง

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

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

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

ชื่อ คำอธิบาย พร็อพเพอร์ตี้
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 object methods

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 หลายรายการ ซึ่งต้องมีโค้ด เพื่อตรวจสอบ Flow ปัจจุบันก่อนที่จะเรียกใช้ตรรกะ

ตัวอย่าง

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

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

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

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

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

ส่วนต่อไปนี้จะอธิบายเมธอดและพร็อพเพอร์ตี้ของออบเจ็กต์เหล่านี้

context.*Request child objects

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

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

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

context.*Request child object properties

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

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

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

  • โปรโตคอล: โปรโตคอลของ URL (เช่น HTTP, HTTPS)
  • พอร์ต: พอร์ต (เช่น :80, :443)
  • โฮสต์: โฮสต์ของ 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.*ออบเจ็กต์ย่อยของคำตอบ

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

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

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

context.*Response object properties

ชื่อพร็อพเพอร์ตี้ คำอธิบาย
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

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

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

หากใช้นโยบาย 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"));
}

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

รูปแบบการใช้งานพื้นฐานมีดังนี้ สร้างออบเจ็กต์ Request กำหนด URL ให้กับออบเจ็กต์ (เช่น 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(): (ออบเจ็กต์) แสดงผลออบเจ็กต์การตอบกลับหาก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