นโยบายคําขอราคาเสนอของ Java

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

อะไร

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

ดูเวอร์ชัน Java ที่รองรับได้ที่ซอฟต์แวร์ที่รองรับและเวอร์ชันที่รองรับ

กำหนดเวลา

ดูหลักเกณฑ์ได้ที่ "ฉันควรใช้ Java Callout เมื่อใด" ในวิธีสร้าง Java Callout

เกี่ยวกับ

นโยบาย Java Callout ช่วยให้คุณรับและตั้งค่าตัวแปรโฟลว์ เรียกใช้ตรรกะที่กำหนดเอง และดำเนินการ การจัดการข้อผิดพลาด ดึงข้อมูลจากคำขอหรือการตอบกลับ และอื่นๆ นโยบายนี้ช่วยให้คุณ ใช้ลักษณะการทำงานที่กำหนดเองซึ่งนโยบาย Edge มาตรฐานอื่นๆ ไม่ครอบคลุม

คุณสามารถแพ็กเกจแอปพลิเคชัน Java ด้วยไฟล์ JAR ของแพ็กเกจที่ต้องการได้ โปรดทราบ ว่ามีข้อจำกัดบางประการเกี่ยวกับสิ่งที่คุณทำได้ด้วย Java Callout โดยจะแสดงไว้ด้านล่าง ในส่วนข้อจำกัด

ตัวอย่าง

ตัวอย่างง่ายๆ

วิธีสร้าง Callout ของ Java

ดึงข้อมูลพร็อพเพอร์ตี้ในโค้ด Java

องค์ประกอบ <Property> ของนโยบายช่วยให้คุณระบุคู่ชื่อ/ค่า ที่เรียกใช้ได้ในโค้ด Java ดูตัวอย่างการทำงานที่ใช้พร็อพเพอร์ตี้ได้ที่วิธีใช้พร็อพเพอร์ตี้ ในการเรียกใช้ Java

ใช้แอตทริบิวต์ name ขององค์ประกอบ <Property> เพื่อระบุชื่อที่จะใช้เข้าถึงพร็อพเพอร์ตี้จากโค้ด Java ค่าขององค์ประกอบ <Property> (ค่าระหว่างแท็กเปิดและปิด) คือค่าที่โค้ด Java จะได้รับ ค่าต้องเป็นสตริง คุณจะอ้างอิงตัวแปรโฟลว์เพื่อรับค่าไม่ได้

  • กำหนดค่าพร็อพเพอร์ตี้ ในที่นี้ ค่าพร็อพเพอร์ตี้คือชื่อตัวแปร response.status.code
    <JavaCallout async="false" continueOnError="false" enabled="true" name="JavaCallout">
        <DisplayName>JavaCallout</DisplayName>
        <ClassName>com.example.mypolicy.MyJavaCallout</ClassName>
        <ResourceURL>java://MyJavaCallout.jar</ResourceURL>
        <Properties>
            <Property name="source">response.status.code</Property>
        </Properties>
    </Javascript>
  • ในโค้ด Java ให้ใช้ตัวสร้างต่อไปนี้ในการติดตั้งใช้งานคลาส Execution ดังนี้
    public class MyJavaCallout implements Execution{
        public MyJavaCallout(Map<string, string> props){
    
                // Extract property values from map.
        }
        ...
    }

ตั้งค่าตัวแปรโฟลว์ในโค้ด Java

ดูคำอธิบายที่ชัดเจนเกี่ยวกับวิธีกำหนดตัวแปรในบริบทของข้อความ (ตัวแปรโฟลว์) ใน โค้ด Java ได้ที่โพสต์ในชุมชน Apigee นี้


การอ้างอิงองค์ประกอบ

การอ้างอิงองค์ประกอบจะอธิบายองค์ประกอบและแอตทริบิวต์ของนโยบาย JavaCallout

<JavaCallout name="MyJavaCalloutPolicy">
   <ClassName>com.example.mypolicy.MyJavaCallout</ClassName>
   <ResourceURL>java://MyJavaCallout.jar</ResourceURL>
</JavaCallout>

แอตทริบิวต์ <JavaCallout>

<JavaCallout name="MyJavaCalloutPolicy" enabled="true" continueOnError="false" async="false" >

ตารางต่อไปนี้อธิบายแอตทริบิวต์ทั่วไปในองค์ประกอบระดับบนสุดของนโยบายทั้งหมด

แอตทริบิวต์ คำอธิบาย ค่าเริ่มต้น การมีบุคคลอยู่
name

ชื่อภายในของนโยบาย ค่าของแอตทริบิวต์ name สามารถ ประกอบด้วยตัวอักษร ตัวเลข การเว้นวรรค ขีดกลางสั้น ขีดล่าง และจุด ค่านี้ไม่สามารถ เกิน 255 อักขระ

(ไม่บังคับ) ใช้องค์ประกอบ <DisplayName> เพื่อติดป้ายกำกับนโยบายใน เครื่องมือแก้ไขพร็อกซี UI การจัดการด้วยชื่อที่เป็นภาษาธรรมชาติต่างกัน

ไม่มี ต้องระบุ
continueOnError

ตั้งค่าเป็น false เพื่อแสดงผลข้อผิดพลาดเมื่อนโยบายล้มเหลว เป็นเรื่องปกติ พฤติกรรมสำหรับนโยบายส่วนใหญ่

ตั้งค่าเป็น true เพื่อให้ดำเนินการตามขั้นตอนได้อย่างต่อเนื่องแม้จะมีนโยบายแล้วก็ตาม ล้มเหลว

เท็จ ไม่บังคับ
enabled

ตั้งค่าเป็น true เพื่อบังคับใช้นโยบาย

ตั้งค่าเป็น false เพื่อปิดนโยบาย นโยบายจะไม่ บังคับใช้ แม้ว่าจะยังคงแนบกับขั้นตอน

จริง ไม่บังคับ
async

แอตทริบิวต์นี้เลิกใช้งานแล้ว

เท็จ เลิกใช้

&lt;DisplayName&gt; องค์ประกอบ

ใช้เพิ่มเติมจากแอตทริบิวต์ name เพื่อติดป้ายกำกับนโยบายใน เครื่องมือแก้ไขพร็อกซี UI การจัดการด้วยชื่อที่เป็นภาษาธรรมชาติต่างกัน

<DisplayName>Policy Display Name</DisplayName>
ค่าเริ่มต้น

ไม่มี

หากไม่ใส่องค์ประกอบนี้ ค่าของแอตทริบิวต์ name ของนโยบายจะเป็น

การมีบุคคลอยู่ ไม่บังคับ
ประเภท สตริง

องค์ประกอบ <ClassName>

ระบุชื่อของคลาส Java ที่จะดำเนินการเมื่อนโยบาย Java Callout ทำงาน ต้องรวมคลาส ไว้ในไฟล์ JAR ที่ระบุโดย <ResourceURL> ดูวิธีสร้าง Callout ของ Javaด้วย

<JavaCallout name="MyJavaCalloutPolicy">
   <ResourceURL>java://MyJavaCallout.jar</ResourceURL>
   <ClassName>com.example.mypolicy.MyJavaCallout</ClassName>
</JavaCallout>
ค่าเริ่มต้น: ไม่มี
การแสดงตน: ต้องระบุ
ประเภท: สตริง

องค์ประกอบ <Property>

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

<Properties>
    <Property name="propName">propertyValue</Property>
</Properties>
ค่าเริ่มต้น: ไม่มี
การแสดงตน: ไม่บังคับ
ประเภท: สตริง

Attributes

แอตทริบิวต์ คำอธิบาย ค่าเริ่มต้น การมีบุคคลอยู่
ชื่อ

ระบุชื่อพร็อพเพอร์ตี้

ไม่มี ต้องระบุ

องค์ประกอบ<ResourceURL>

องค์ประกอบนี้ระบุไฟล์ JAR ของ Java ที่จะดำเนินการเมื่อนโยบายการเรียกใช้ Java ทำงาน

คุณสามารถจัดเก็บไฟล์นี้ที่ขอบเขตพร็อกซี API (ในส่วน/apiproxy/resources/javaในชุดพร็อกซี API หรือในส่วนสคริปต์ของ แผง Navigator ของเครื่องมือแก้ไขพร็อกซี API) หรือที่ขอบเขตองค์กรหรือสภาพแวดล้อมเพื่อนำกลับมาใช้ใหม่ ในพร็อกซี API หลายรายการตามที่อธิบายไว้ในไฟล์ทรัพยากร

<JavaCallout name="MyJavaCalloutPolicy">
   <ResourceURL>java://MyJavaCallout.jar</ResourceURL>
   <ClassName>com.example.mypolicy.MyJavaCallout</ClassName>
</JavaCallout>
ค่าเริ่มต้น: ไม่มี
การแสดงตน: ต้องระบุ
ประเภท: สตริง

ข้อมูลอ้างอิงข้อผิดพลาด

ส่วนนี้จะอธิบายรหัสข้อผิดพลาดและข้อความแสดงข้อผิดพลาดที่แสดงกลับมา และตัวแปรข้อผิดพลาดที่ Edge ตั้งค่าไว้เมื่อนโยบายนี้ทริกเกอร์ข้อผิดพลาด ข้อมูลนี้มีความสำคัญต่อการทราบว่าคุณจะสร้างกฎความผิดพลาดเพื่อ จัดการกับข้อผิดพลาด หากต้องการเรียนรู้เพิ่มเติม โปรดดูที่สิ่งที่คุณจำเป็นต้องทราบ เกี่ยวกับข้อผิดพลาดของนโยบายและการจัดการ ข้อผิดพลาด

ข้อผิดพลาดเกี่ยวกับรันไทม์

ข้อผิดพลาดเหล่านี้อาจเกิดขึ้นเมื่อนโยบายทำงาน

รหัสข้อผิดพลาด สถานะ HTTP สาเหตุ แก้ไข
steps.javacallout.ExecutionError 500 เกิดขึ้นเมื่อโค้ด Java ส่งข้อยกเว้นหรือแสดงผลเป็น Null ในระหว่างการบังคับใช้นโยบาย JavaScript

ข้อผิดพลาดในการทำให้ใช้งานได้

ข้อผิดพลาดเหล่านี้อาจเกิดขึ้นเมื่อมีการทำให้พร็อกซีที่มีนโยบายใช้งานได้

ชื่อข้อผิดพลาด สตริงข้อผิดพลาด สถานะ HTTP เกิดขึ้นเมื่อ
ResourceDoesNotExist Resource with name [name] and type [type] does not exist ไม่มี ไม่มีไฟล์ที่ระบุในองค์ประกอบ <ResourceURL>
JavaCalloutInstantiationFailed Failed to instantiate the JavaCallout Class [classname] ไม่มี ไฟล์คลาสที่ระบุในองค์ประกอบ <ClassName> ไม่ได้อยู่ใน โหล
IncompatibleJavaVersion Failed to load java class [classname] definition due to - [reason] ไม่มี ดูสตริงข้อผิดพลาด ดูเพิ่มเติมที่รองรับ ซอฟต์แวร์และเวอร์ชันที่รองรับ
JavaClassNotFoundInJavaResource Failed to find the ClassName in java resource [jar_name] - [class_name] ไม่มี ดูสตริงข้อผิดพลาด
JavaClassDefinitionNotFound Failed to load java class [class_name] definition due to - [reason] ไม่มี ดูสตริงข้อผิดพลาด
NoAppropriateConstructor No appropriate constructor found in JavaCallout class [class_name] ไม่มี ดูสตริงข้อผิดพลาด
NoResourceForURL Could not locate a resource with URL [string] ไม่มี ดูสตริงข้อผิดพลาด

ตัวแปรความผิดพลาด

ระบบจะตั้งค่าตัวแปรเหล่านี้เมื่อนโยบายนี้ทำให้เกิดข้อผิดพลาด โปรดดูข้อมูลเพิ่มเติมที่หัวข้อสิ่งที่คุณจำเป็นต้องทราบ เกี่ยวกับข้อผิดพลาดของนโยบาย

ตัวแปร สถานที่ ตัวอย่าง
fault.name="fault_name" fault_name คือชื่อของข้อผิดพลาดตามที่ระบุไว้ในตารางข้อผิดพลาดรันไทม์ด้านบน ชื่อข้อผิดพลาดคือส่วนสุดท้ายของรหัสข้อผิดพลาด fault.name Matches "ExecutionError"
javacallout.policy_name.failed policy_name คือชื่อที่ผู้ใช้ระบุของนโยบายที่เป็นสาเหตุของข้อผิดพลาด javacallout.JC-GetUserData.failed = true

ตัวอย่างการตอบสนองข้อผิดพลาด

{  
   "fault":{  
      "faultstring":"Failed to execute JavaCallout. [policy_name]",
      "detail":{  
         "errorcode":"javacallout.ExecutionError"
      }
   }
}

ตัวอย่างกฎข้อผิดพลาด

<FaultRule name="JavaCalloutFailed">
    <Step>
        <Name>AM-JavaCalloutError</Name>
    </Step>
    <Condition>(fault.name Matches "ExecutionError") </Condition>
</FaultRule>

สคีมา

การคอมไพล์และการทำให้ใช้งานได้

ดูรายละเอียดเกี่ยวกับวิธีคอมไพล์โค้ด Java ที่กำหนดเองและติดตั้งใช้งานกับพร็อกซีได้ที่วิธีสร้าง Callout ของ Java

ข้อจำกัด

ข้อจำกัดที่คุณต้องพิจารณาเมื่อเขียน Java Callout มีดังนี้

  • ไม่อนุญาตให้ใช้การเรียกของระบบส่วนใหญ่ เช่น คุณไม่สามารถอ่านหรือเขียนระบบไฟล์ภายในได้
  • เข้าถึงเครือข่ายผ่านซ็อกเก็ต Apigee จำกัดการเข้าถึงที่อยู่ sitelocal, anylocal, loopback และ linklocal
  • ข้อความไฮไลต์ไม่สามารถรับข้อมูลเกี่ยวกับกระบวนการปัจจุบัน รายการกระบวนการ หรือ การใช้งาน CPU/หน่วยความจำในเครื่อง แม้ว่าการโทรบางอย่างอาจใช้งานได้ แต่เราไม่รองรับการโทรดังกล่าวและอาจปิดใช้ได้ทุกเมื่อ คุณควรหลีกเลี่ยงการเรียกใช้ดังกล่าวในโค้ดเพื่อความเข้ากันได้ในอนาคต
  • ระบบไม่รองรับการใช้ไลบรารี Java ที่รวมอยู่ใน Apigee Edge ไลบรารีเหล่านั้น มีไว้สำหรับฟังก์ชันการทำงานของผลิตภัณฑ์ Edge เท่านั้น และไม่มีการรับประกันว่าไลบรารีจะ พร้อมใช้งานตั้งแต่รุ่นแรกจนถึงรุ่นล่าสุด
  • อย่าใช้ io.apigee หรือ com.apigee เป็นชื่อแพ็กเกจใน Java Callouts ชื่อเหล่านั้นสงวนไว้และใช้โดยโมดูล Apigee อื่นๆ

บรรจุภัณฑ์

วาง JAR ในพร็อกซี API ภายใต้ /resources/java หาก Java Callout ของคุณต้องใช้ไลบรารีเพิ่มเติมของบุคคลที่สามซึ่งแพ็กเกจเป็นไฟล์ JAR แยกต่างหาก ให้วางไฟล์ JAR เหล่านั้นไว้ในไดเรกทอรี /resources/java ด้วยเพื่อให้แน่ใจว่าระบบจะโหลดไฟล์อย่างถูกต้องในรันไทม์

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

ดูข้อมูลเกี่ยวกับการอัปโหลด JAR ของ Java ได้ที่ไฟล์ทรัพยากร

ดูตัวอย่างโดยละเอียดที่แสดงวิธีแพ็กเกจและทำให้ Java Callout ใช้งานได้โดยใช้ Maven หรือ javac ได้ที่วิธีสร้าง Java Callout

Javadoc

Javadoc สำหรับการเขียนโค้ด Java Callout จะรวมอยู่ที่นี่ใน GitHub คุณจะต้องโคลนหรือดาวน์โหลด HTML ไปยังระบบ จากนั้นเพียงเปิดไฟล์ index.html ในเบราว์เซอร์

หมายเหตุการใช้งาน

  • นโยบาย Java Callout ไม่มีโค้ดจริง แต่ในทางกลับกัน นโยบาย Java Callout จะอ้างอิงถึง "ทรัพยากร" Java และกำหนดขั้นตอนในโฟลว์ API ที่โค้ด Java จะทำงาน คุณสามารถ อัปโหลด JAR ของ Java ผ่านเครื่องมือแก้ไขพร็อกซีของ UI การจัดการ หรือจะรวมไว้ใน ไดเรกทอรี /resources/java ในพร็อกซี API ที่คุณพัฒนาในเครื่องก็ได้
  • สำหรับการดำเนินการที่มีน้ำหนักเบา เช่น การเรียก API ไปยังบริการระยะไกล เราขอแนะนำให้ใช้ นโยบาย ServiceCallout ดูนโยบายข้อความไฮไลต์บริการ
  • สำหรับการโต้ตอบกับเนื้อหาข้อความที่ค่อนข้างง่าย เช่น การแก้ไขหรือการแยกส่วนหัว HTTP, พารามิเตอร์ หรือเนื้อหาข้อความ Apigee ขอแนะนำให้ใช้นโยบาย JavaScript

หัวข้อที่เกี่ยวข้อง

  • ดูตัวอย่างที่เกี่ยวข้องได้ในที่เก็บ java-cookbook