คุณกำลังดูเอกสารประกอบของ 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
ฟังก์ชัน Print()
โมเดลออบเจ็กต์ JavaScript มีฟังก์ชัน print()
ที่ใช้ส่งออกข้อมูลการแก้ไขข้อบกพร่องไปยังเครื่องมือ Edge Trace ได้ ดูแก้ไขข้อบกพร่องด้วยคำสั่ง 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 อัปเดต แล้วแปลงเป็นค่าเลขฐาน 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');
พร็อพเพอร์ตี้ออบเจ็กต์บริบท
พร็อพเพอร์ตี้ 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'; }
แมปของคู่ชื่อ/ค่าที่ใช้ส่งออบเจ็กต์ระหว่างนโยบาย 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 ที่สมบูรณ์ของคำขอประกอบด้วยพร็อพเพอร์ตี้ต่อไปนี้
เมื่อได้รับ
|
ตัวอย่าง context.targetRequest.url = 'http://www.example.com/path?q1=1' context.targetRequest.protocol ='https'; |
|
headers |
ส่วนหัวของคำขอ HTTP สำหรับการแมปของ |
ตัวอย่าง สำหรับคำขอ HTTP นี้: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5ZJavaScript ต่อไปนี้ context.proxyRequest.headers['Content-Type']; context.proxyRequest.headers['Authorization']; จะแสดงผลค่าต่อไปนี้ application/json Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z |
|
queryParams |
พารามิเตอร์การค้นหาข้อความคําขอเป็นการแมปของ |
ตัวอย่าง "?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 ( |
ตัวอย่าง สำหรับคำขอนี้: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z JavaScript ต่อไปนี้ context.proxyRequest.method; จะแสดงผลค่าต่อไปนี้ POST |
|
body |
เนื้อหาข้อความ (เพย์โหลด) ของคำขอ HTTP เนื้อหาของคำขอมีสมาชิกต่อไปนี้
|
ตัวอย่าง สำหรับเนื้อหาของ 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 ของข้อความตอบกลับเป็นการแมปของ |
ตัวอย่าง 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 ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ รหัสสถานะ HTTP4xx
และ5xx
จะส่งผลให้isError()
false
เนื่องจากการเชื่อมต่อเสร็จสมบูรณ์ และระบบส่งโค้ดตอบกลับที่ถูกต้องกลับมา หากisError()
แสดงผลtrue
การเรียกไปยังgetResponse()
จะแสดงผล JavaScriptundefined
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
หัวข้อที่เกี่ยวข้อง
- นโยบาย JavaScript
- โมเดลออบเจ็กต์ JavaScript
- โปรดดูตัวอย่างและวิธีการพื้นฐานที่หัวข้อพร็อกซี API ที่มีการเขียนโปรแกรมด้วย JavaScript
- สำหรับตัวอย่างโค้ด JavaScript ที่ใช้งานได้ โปรดดูตัวอย่าง Apigee Edge ใน GitHub
บทความในชุมชน Apigee
คุณดูบทความที่เกี่ยวข้องเหล่านี้ได้ในชุมชน Apigee