การเขียนโปรแกรมพร็อกซี API ด้วย JavaScript

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

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

ดาวน์โหลดและลองใช้โค้ดตัวอย่าง

เกี่ยวกับตัวอย่างตำราอาหารนี้

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

ตัวอย่าง JavaScript 2 ตัวอย่างอยู่ในพร็อกซี API ดังนี้

  • setHeaders.js: JavaScript นี้จะได้รับค่าของตัวแปรบางรายการที่ตั้งค่าไว้เมื่อมีการเรียกใช้พร็อกซี API JavaScript จะเพิ่มตัวแปรเหล่านั้นลงในข้อความตอบกลับเพื่อให้คุณดูค่าของแต่ละคำขอที่คุณสร้าง
  • minimize.js: JavaScript นี้จะแสดงวิธีทํางานกับเนื้อหาข้อความ แนวคิดเบื้องหลังตัวอย่างนี้คือบริการมักจะส่งคืนข้อมูลมากเกินความจำเป็น ดังนั้น JavaScript จะแยกวิเคราะห์ข้อความตอบกลับ ดึงพร็อพเพอร์ตี้ที่น่าสนใจ 2-3 รายการ จากนั้นใช้เพื่อสร้างเนื้อหาของข้อความตอบกลับ

รหัสสำหรับ setHeader.js:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"));
context.setVariable("response.header.X-Apigee-ApiProxyName", context.getVariable("apiproxy.name"));
context.setVariable("response.header.X-Apigee-ProxyName", context.getVariable("proxy.name"));
context.setVariable("response.header.X-Apigee-ProxyBasePath", context.getVariable("proxy.basepath"));
context.setVariable("response.header.X-Apigee-ProxyPathSuffix", context.getVariable("proxy.pathsuffix"));
context.setVariable("response.header.X-Apigee-ProxyUrl", context.getVariable("proxy.url"));

รหัสสำหรับ minimize.js:

// Parse the respose from the target.
var res = JSON.parse(context.proxyResponse.content);

// Pull out only the information we want to see in the response.
var minimizedResponse = { city: res.root.city,
                          state: res.root.state };
          
// Set the response variable. 
context.proxyResponse.content = JSON.stringify(minimizedResponse);

คุณเข้าถึงตัวแปรโฟลว์ใน JavaScript ผ่านออบเจ็กต์บริบทได้ ออบเจ็กต์นี้เป็นส่วนหนึ่งของโมเดลออบเจ็กต์ Edge JavaScript โปรดดูรายละเอียดเกี่ยวกับโมเดลออบเจ็กต์ที่โมเดลออบเจ็กต์ JavaScript

ก่อนเริ่มต้น

ก่อนจะดูตัวอย่างตำราอาหารนี้ คุณควรทำความคุ้นเคยกับแนวคิดพื้นฐานต่อไปนี้ด้วย

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

หากดาวน์โหลดโค้ดตัวอย่างแล้ว คุณจะดูไฟล์ทั้งหมดที่กล่าวถึงในหัวข้อนี้ได้ในโฟลเดอร์ตัวอย่าง javascript-cookbook ส่วนต่อไปนี้จะอธิบายรายละเอียดเกี่ยวกับโค้ดตัวอย่าง

ทำความเข้าใจโฟลว์พร็อกซี

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

ตัวอย่างเช่น นโยบายต่อไปนี้อ้างอิงไฟล์ JavaScript ที่ชื่อ setHeader.js

<Javascript name='setHeaders' timeLimit='200'>
    <ResourceURL>setHeaders.js</ResourceURL>
</Javascript>

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

หากคุณเปิดการกำหนดค่าขั้นตอนนี้ใน UI การจัดการ คุณจะเห็นการกำหนดค่าโฟลว์ด้านล่าง

เลือกปลายทางของพร็อกซี > ค่าเริ่มต้น > PostFlow ในแผงการนำทาง

การกำหนดค่า XML ที่สอดคล้องกันสำหรับ ProxyEndpoint ที่ชื่อ "default" แสดงอยู่ด้านล่าง

<ProxyEndpoint name="default">
  <PostFlow>
    <Response>
      <!-- Steps reference policies under /apiproxy/policies -->
      <!-- First, set a few HTTP headers with variables for this transaction. -->
      <Step><Name>setHeaders</Name></Step>
      <!-- Next, transform the response from XML to JSON for easier parsing with JavaScript -->
      <Step><Name>transform</Name></Step>
      <!-- Finally, use JavaScript to create minimized response with just city and state. -->
      <Step><Name>minimize</Name></Step>
    </Response>
  </PostFlow>
  <HTTPProxyConnection>
        <!-- BasePath defines the network address for this API proxy. See the script 'invoke.sh' to see how the complete URL for this API proxy is constructed.-->
    <BasePath>/javascript-cookbook</BasePath>
     <!-- Set VirtualHost to 'secure' to have this API proxy listen on HTTPS. -->
    <VirtualHost>default</VirtualHost>
  </HTTPProxyConnection>
  <RouteRule name="default">
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

องค์ประกอบต่างๆ ของขั้นตอนจะสรุปได้ดังนี้

  • <Request> - องค์ประกอบ <Request> ประกอบด้วยองค์ประกอบ <Step> หลายรายการ แต่ละขั้นตอนจะเรียกใช้นโยบายที่คุณสร้างผ่านส่วนที่เหลือของหัวข้อนี้ นโยบายเหล่านี้แนบ JavaScript ไปกับโฟลว์พร็อกซี API และตำแหน่งของไฟล์แนบนโยบายจะกำหนดว่า JavaScript ทำงานเมื่อใด
  • <Response> - องค์ประกอบ <Response> ยังรวมถึง <Steps> ด้วย ขั้นตอนเหล่านี้ยังเรียกใช้นโยบายที่รับผิดชอบการประมวลผลการตอบสนองขั้นสุดท้ายจากเป้าหมาย (ซึ่งในตัวอย่างนี้คือเป้าหมายบริการจำลองของ Apigee) โปรดทราบว่าการตั้งค่า HTTPTargetConnection ในส่วน /apiproxy/targets/default.xml)
  • <HTTPProxyConnection> - ระบุเส้นทางโฮสต์และเส้นทาง URI ที่กำหนดที่อยู่เครือข่ายที่แอปเรียกเพื่อใช้ API นี้
  • <RouteRule> - องค์ประกอบนี้ระบุว่าการกำหนดค่า TargetEndpoint จะเรียกใช้โดย ProxyEndpoint

การเพิ่มโค้ด JavaScript ลงในพร็อกซี

JavaScript (เช่น สคริปต์ Python, ไฟล์ Java JAR, ไฟล์ XSLT และอื่นๆ) จะจัดเก็บเป็นทรัพยากร เมื่อคุณเพิ่งเริ่มใช้ JavaScript การจัดเก็บไฟล์ JavaScript ในพร็อกซี API จะเป็นวิธีที่ง่ายที่สุด เมื่อดำเนินการต่อ คุณควรกำหนดให้ JavaScript เป็นแบบทั่วไปและนํามาใช้ใหม่ได้ให้มากที่สุด จากนั้นจึงจัดเก็บที่ระดับสภาพแวดล้อมหรือองค์กร เพื่อช่วยไม่ให้คุณต้องจัดเก็บไฟล์ JavaScript เดียวกันไว้ในพร็อกซี API หลายรายการ และทำให้จัดการไม่ได้อย่างรวดเร็ว

โปรดดูข้อมูลเกี่ยวกับการจัดเก็บทรัพยากรในระดับองค์กรและสภาพแวดล้อมที่หัวข้อไฟล์ทรัพยากร

ลองเลย

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

การนำเข้าและการทำให้พร็อกซี API ใช้งานได้

หลังจากทำการเปลี่ยนแปลงแล้ว คุณจะบันทึกพร็อกซี API ในเครื่องมือสร้างพร็อกซี API ใน UI การจัดการได้

หรือจะเรียกใช้คำสั่งต่อไปนี้ในไดเรกทอรี /api-platform-samples/doc-samples/javascript-cookbook ก็ได้

$ sh deploy.sh

การทดสอบ JavaScript

เรียกใช้คำสั่งต่อไปนี้ในไดเรกทอรี /api-platform-samples/doc-samples/javascript-cookbook

$ sh invoke.sh

ระบบจะใช้ค่าสถานะ Curl -v ในสคริปต์ Shell เพื่อดูส่วนหัว HTTP ในข้อความตอบกลับที่แก้ไขโดย JavaScript

คุณส่งคําขอได้โดยตรงดังนี้

$ curl -v http://{org_name}-test.apigee.net/javascript-cookbook 

หาก JavaScript ทำงานอย่างถูกต้อง คุณจะเห็นการตอบสนองดังตัวอย่างต่อไปนี้

< X-Apigee-Demo-Target: default
< X-Apigee-Demo-ApiProxyName: simple-javascript
< X-Apigee-Demo-ProxyName: default
< X-Apigee-Demo-ProxyBasePath: /javascript-cookbook
< X-Apigee-Demo-ProxyPathSuffix: /xml
< X-Apigee-Demo-ProxyUrl: http://rrt331ea.us-ea.4.apigee.com/javascript-cookbook/xml
 
{"city":"San Jose","state":"CA"}

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

ข้อผิดพลาดของสคริปต์

คุณจึงหลีกเลี่ยงข้อผิดพลาดเมื่อเขียน JavaScript อย่างแน่นอน รูปแบบของข้อผิดพลาด JavaScript ที่คุณจะเห็นซึ่งออกโดยพร็อกซี API จะแสดงอยู่ด้านล่าง

{  
   "fault":{  
      "faultstring":"Execution of rewriteTargetUrl failed with error: Javascript runtime error: \"TypeError: Cannot find function getVariable in object TARGET_REQ_FLOW. (rewriteTargetUrl_js#1). at line 1 \"",
      "detail":{  
         "errorcode":"steps.javascript.ScriptExecutionFailed"
      }
   }
}

เมื่อใดที่ควรใช้ JavaScript

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

หากกังวลเกี่ยวกับประสิทธิภาพการทำงานที่กำหนดเอง ให้ใช้ Java เมื่อเป็นไปได้

สรุป

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