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

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

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

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

โมเดลออบเจ็กต์ Apigee Edge JavaScript จะกำหนดออบเจ็กต์ที่มีพร็อพเพอร์ตี้ที่เชื่อมโยงกัน พร้อมใช้งานสำหรับการเรียกใช้โค้ด 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 โมเดล ดูรายละเอียดเพิ่มเติมและตัวอย่างได้ที่ crypto Object reference ด้านล่าง

คำขอและการตอบกลับ วัตถุ

ออบเจ็กต์ 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));
}

การอ้างอิงออบเจ็กต์คริปโต

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

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

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

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

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

ชื่อ Flow แต่ละชื่อจะรวมถึง PreFlow, PostFlow, และ Flow แบบมีเงื่อนไขใดๆ ที่กำหนดไว้ในแท็ก ProxyEndpoints หรือ TargetEndpoints

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

ตัวอย่าง

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

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

ตั้งค่าเนื้อหาเท่านั้นในโฟลว์พร็อกซีตอบกลับ:

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: ข้อความคำขอขาออกที่ส่งไปยังแบ็กเอนด์ service.
  • context.proxyResponse: ข้อความตอบกลับขาออกแสดงผลไปยัง ที่ส่งคำขอไปยังไคลเอ็นต์
  • context.targetResponse: ข้อความคำขอขาเข้าที่ได้รับจากแบ็กเอนด์ service.

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

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

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

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

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

Context.*ขอพร็อพเพอร์ตี้ออบเจ็กต์ย่อย

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

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

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

  • โปรโตคอล: โปรโตคอลของ URL (เช่น HTTP, HTTPS)
  • Port: พอร์ต (เช่น :80, :443)
  • host: โฮสต์ของ URL (เช่น www.example.com)
  • เส้นทาง: เส้นทางของ 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 รายการคือ สร้างแล้ว: รายการหนึ่งขาเข้า (การตอบสนองจากบริการแบ็กเอนด์) และอีกรายการหนึ่งขาออก (การตอบสนอง ส่งกลับไปยังลูกค้า)

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

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

บริบท*พร็อพเพอร์ตี้ออบเจ็กต์การตอบสนอง

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

แก้ไขข้อบกพร่องด้วย 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"));
}

หากต้องการดูเอาต์พุต ให้เลือกเอาต์พุตจากธุรกรรมทั้งหมดที่ด้านล่างของ ติดตามหน้าต่าง นอกจากนี้ คุณยังจะเห็นเอาต์พุตในพร็อพเพอร์ตี้การติดตามที่ชื่อ stepExecution-stdout ด้วย

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

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

เกี่ยวกับ 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() เสร็จสมบูรณ์และสำเร็จ ออบเจ็กต์ที่แสดงผลมีแอตทริบิวต์ Method และคุณสมบัติที่เหมือนกันเป็นออบเจ็กต์ Context.proxyResponse ดูสรุปออบเจ็กต์บริบท
  • getError(): (สตริง) หากการเรียกไปยัง httpClient.send() ทำให้เกิด "ข้อผิดพลาด" จะแสดงข้อความแสดงข้อผิดพลาดเป็นสตริง

ตัวอย่าง

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

// 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 ชุมชน: