คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่
เอกสารประกอบของ Apigee X info
นโยบาย JavaScript ใน Apigee Edge ช่วยให้คุณเพิ่มโค้ดที่กำหนดเองซึ่งทำงานในบริบทของโฟลว์พร็อกซี API ได้ ตัวอย่างเช่น คุณสามารถใช้โค้ดที่กำหนดเองในนโยบาย JavaScript เพื่อดำเนินการต่อไปนี้
- รับและตั้งค่าตัวแปรโฟลว์
- เรียกใช้ตรรกะที่กำหนดเองและจัดการข้อผิดพลาด
- แยกข้อมูลจากคำขอหรือการตอบสนอง
- แก้ไข URL เป้าหมายแบ็กเอนด์แบบไดนามิก
- เพิ่มหรือนำส่วนหัวออกจากคำขอหรือการตอบสนองแบบไดนามิก
- แยกวิเคราะห์การตอบสนอง JSON
ไคลเอ็นต์ HTTP
ฟีเจอร์ที่มีประสิทธิภาพของนโยบาย JavaScript คือไคลเอ็นต์ HTTP คุณสามารถใช้ไคลเอ็นต์ HTTP (หรือออบเจ็กต์ httpClient) เพื่อส่งคำขอไปยังแบ็กเอนด์หรือบริการภายนอกอย่างน้อย 1 รายการ ไคลเอ็นต์ HTTP มีประโยชน์อย่างยิ่งเมื่อคุณต้องส่งคำขอไปยังบริการภายนอกหลายรายการและรวมการตอบสนองไว้ใน API เดียว
ตัวอย่างโค้ด JavaScript ที่ส่งคำขอไปยังแบ็กเอนด์ด้วยออบเจ็กต์ httpClient
var headers = {'X-SOME-HEADER' : 'some value' };
var myRequest = new Request("http://www.example.com","GET",headers);
var exchange = httpClient.send(myRequest);
ออบเจ็กต์ httpClient แสดงเมธอด get และ send (send ใช้ในโค้ดตัวอย่างด้านบน) 2 รายการเพื่อส่งคำขอ HTTP ทั้ง 2 เมธอดเป็นแบบอะซิงโครนัสและแสดงผลออบเจ็กต์ exchange ก่อนที่คำขอ HTTP จริงจะเสร็จสมบูรณ์
คำขอ HTTP อาจใช้เวลา 2-3 วินาทีถึง 2-3 นาที หลังจากส่งคำขอ HTTP แล้ว คุณต้องทราบว่าคำขอเสร็จสมบูรณ์เมื่อใด เพื่อให้ประมวลผลการตอบสนองจากคำขอได้ วิธีที่พบบ่อยที่สุดวิธีหนึ่งในการระบุว่าคำขอ HTTP เสร็จสมบูรณ์เมื่อใดคือการเรียกใช้เมธอด waitForComplete() ของออบเจ็กต์ exchange
waitForComplete()
เมธอด waitForComplete() จะหยุดชั่วคราวไม่ให้เธรดทำงานจนกว่าคำขอ HTTP จะเสร็จสมบูรณ์และแสดงผลการตอบสนอง (สำเร็จ/ไม่สำเร็จ) จากนั้นจึงจะประมวลผลการตอบสนองจากแบ็กเอนด์หรือบริการภายนอกได้
ตัวอย่างโค้ด JavaScript ที่มี waitForComplete()
var headers = {'X-SOME-HEADER' : 'some value' };
var myRequest = new Request("http://www.example.com","GET",headers);
var exchange = httpClient.send(myRequest);
// Wait for the asynchronous GET request to finish
exchange.waitForComplete();
// Get and Process the response
if (exchange.isSuccess()) {
var responseObj = exchange.getResponse().content.asJSON;
return responseObj.access_token;
} else if (exchange.isError()) {
throw new Error(exchange.getError());
}
รูปแบบที่ไม่แนะนำ
การใช้ waitForComplete() หลังจากส่งคำขอ HTTP ในโค้ด JavaScript จะส่งผลต่อประสิทธิภาพ
พิจารณาโค้ด JavaScript ต่อไปนี้ที่เรียกใช้ waitForComplete() หลังจากส่งคำขอ HTTP
โค้ดสำหรับ sample.js
// Send the HTTP request
var exchangeObj = httpClient.get("http://example.com");
// Wait until the request is completed
exchangeObj.waitForComplete();
// Check if the request was successful
if (exchangeObj.isSuccess()) {
response = exchangeObj.getResponse();
context.setVariable('example.status', response1.status);
} else {
error = exchangeObj.getError();
context.setVariable('example.error', 'Woops: ' + error);
}
ในตัวอย่างนี้
- โค้ด JavaScript จะส่งคำขอ HTTP ไปยัง API แบ็กเอนด์
- จากนั้นจะเรียกใช้
waitForComplete()เพื่อหยุดการทำงานชั่วคราวจนกว่าคำขอจะเสร็จสมบูรณ์API
waitForComplete()จะทำให้เธรดที่เรียกใช้โค้ด JavaScript ถูกบล็อกจนกว่าแบ็กเอนด์จะประมวลผลคำขอเสร็จสมบูรณ์และตอบกลับ
จำนวนเธรดสูงสุดที่สามารถเรียกใช้โค้ด JavaScript พร้อมกันใน Message Processor ได้ทุกเมื่อคือ 30% หลังจากถึงขีดจำกัดแล้ว จะไม่มีเธรดใดพร้อมใช้งานเพื่อเรียกใช้โค้ด JavaScript ดังนั้น หากมีคำขอพร้อมกันจำนวนมากเกินไปที่เรียกใช้ API waitForComplete() ในโค้ด JavaScript คำขอที่ตามมาจะล้มเหลวโดยมีข้อผิดพลาด 500 Internal Server Error และข้อความแสดงข้อผิดพลาด 'หมดเวลา' แม้ว่านโยบาย JavaScript จะยังไม่หมดเวลา
โดยทั่วไป สถานการณ์นี้อาจเกิดขึ้นหากแบ็กเอนด์ใช้เวลานานในการประมวลผลคำขอหรือมีการรับส่งข้อมูลสูง
ผลกระทบ
- คำขอ API จะล้มเหลวโดยมีข้อผิดพลาด 500 Internal Server Error และ ข้อความแสดงข้อผิดพลาด "หมดเวลา" เมื่อจำนวนคำขอพร้อมกันที่เรียกใช้
waitForComplete()ในโค้ด JavaScript เกินขีดจำกัดที่กำหนดไว้ล่วงหน้า - การวินิจฉัยหาสาเหตุของปัญหาอาจทำได้ยาก เนื่องจาก JavaScript จะล้มเหลวโดยมีข้อผิดพลาด "หมดเวลา" แม้ว่าเวลาที่กำหนดสำหรับนโยบาย JavaScript ที่เฉพาะเจาะจงจะยังไม่หมดลง
แนวทางปฏิบัติแนะนำ
ใช้การเรียกกลับในไคลเอ็นต์ HTTP เพื่อปรับปรุงโค้ดการเรียกใช้และเพิ่มประสิทธิภาพ รวมถึงหลีกเลี่ยงการใช้ waitForComplete() ในโค้ด JavaScript วิธีนี้จะช่วยให้มั่นใจได้ว่าเธรดที่เรียกใช้ JavaScript จะไม่ถูกบล็อกจนกว่าคำขอ HTTP จะเสร็จสมบูรณ์
เมื่อใช้การเรียกกลับ เธรดจะส่งคำขอ HTTP ในโค้ด JavaScript และกลับไปยังพูล เนื่องจากเธรดไม่ถูกบล็อกอีกต่อไป จึงพร้อมใช้งานเพื่อจัดการคำขออื่นๆ หลังจากคำขอ HTTP เสร็จสมบูรณ์และการเรียกกลับพร้อมที่จะเรียกใช้แล้ว ระบบจะสร้างและเพิ่มงานลงในคิวงาน เธรดรายการใดรายการหนึ่งจากพูลจะเรียกใช้การเรียกกลับตามลำดับความสำคัญของงาน
ตัวอย่างโค้ด JavaScript ที่ใช้การเรียกกลับใน httpClient
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("http://example.com", onComplete);