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

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

อะไร

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

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

กำหนดเวลา

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

เกี่ยวกับ

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

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

ตัวอย่าง

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

วิธีสร้าง Java Callout

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

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

ใช้แอตทริบิวต์ 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> ดูเพิ่มเติมที่ หัวข้อ วิธีสร้าง Java Callout

<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

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

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

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

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

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

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

ข้อจำกัด

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

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

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

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