คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X ข้อมูล
เงื่อนไขทำให้พร็อกซี API ทำงานแบบไดนามิกระหว่างรันไทม์ได้ เงื่อนไขจะกำหนดการดำเนินการกับตัวแปร ซึ่งประเมินโดยไปป์ไลน์การประมวลผล Apigee Edge คำสั่งแบบมีเงื่อนไขจะเป็นบูลีนและจะประเมินค่าเป็น true
หรือ false
เสมอ
ภาพรวมเงื่อนไข
ส่วนนี้จะอธิบายวิธีและตำแหน่งที่จะใช้คำสั่งแบบมีเงื่อนไขกับ Edge นอกจากนี้ ส่วนต่อไปนี้จะอธิบายไวยากรณ์
โครงสร้างของคำสั่งแบบมีเงื่อนไข
โครงสร้างพื้นฐานของคำสั่งแบบมีเงื่อนไขมีดังนี้
<Condition>variable.name operator "value"</Condition>
เช่น
<Condition>request.verb = "GET"</Condition>
คุณรวมเงื่อนไขกับ "และ" เพื่อบังคับใช้มากกว่า 1 รายการต่อครั้งได้ เช่น เงื่อนไขต่อไปนี้จะประเมินเป็น true
ต่อเมื่อ URI ของคำขอตรงกับ /statuses
และคำกริยา HTTP ของคำขอคือ GET
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
ที่ที่คุณใช้คำสั่งแบบมีเงื่อนไขได้
คุณใช้เงื่อนไขเพื่อควบคุมลักษณะการทำงานในลักษณะต่อไปนี้ได้
การดำเนินการนโยบาย
เมื่อใช้คำสั่งแบบมีเงื่อนไข คุณจะควบคุมการบังคับใช้นโยบายได้ Use Case ที่พบบ่อยคือการเปลี่ยนรูปแบบข้อความตอบกลับแบบมีเงื่อนไขตามส่วนหัว HTTP หรือเนื้อหาข้อความ
ตัวอย่างต่อไปนี้เปลี่ยนรูปแบบ XML เป็น JSON ตามเงื่อนไขตามส่วนหัว Accept
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
การดำเนินการโฟลว์
เมื่อใช้คำสั่งแบบมีเงื่อนไข คุณจะควบคุมการดำเนินการของโฟลว์ที่มีชื่อใน ProxyEndpoints และ TargetEndpoints ได้ โปรดทราบว่ามีเพียงโฟลว์ "ที่มีชื่อ" เท่านั้นที่จะดำเนินการอย่างมีเงื่อนไขได้ Preflow และ Postflow (ทั้งคำขอและการตอบกลับ) บน ProxyEndpoints และ TargetEndpoints จะทำงานต่อธุรกรรมทุกรายการ จึงทำให้มีความสามารถ "failsafe" แบบไม่มีเงื่อนไข
ตัวอย่างเช่น การดำเนินการโฟลว์คำขอแบบมีเงื่อนไขตามกริยา HTTP ของข้อความคำขอ และโฟลว์การตอบสนองแบบมีเงื่อนไขตามรหัสสถานะ HTTP (ที่เป็นไปได้) ที่แสดงข้อผิดพลาดดังนี้
<Flow name="GetRequests"> <Condition>request.verb = "GET"</Condition> <Request> <Step> <Condition>request.path MatchesPath "/statuses/**"</Condition> <Name>StatusesRequestPolicy</Name> </Step> </Request> <Response> <Step> <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition> <Name>MaintenancePolicy</Name> </Step> </Response> </Flow>
การเลือกเส้นทางปลายทางเป้าหมาย
เมื่อใช้คำสั่งแบบมีเงื่อนไข คุณจะสามารถควบคุมปลายทางเป้าหมายที่เรียกใช้โดยการกำหนดค่าปลายทางของพร็อกซีได้ กฎของเส้นทางจะส่งต่อคำขอไปยังปลายทางเป้าหมายที่เฉพาะเจาะจง เมื่อมีปลายทางเป้าหมายมากกว่า 1 รายการ ระบบจะประเมินกฎเส้นทางตามเงื่อนไข และหากเป็นจริง ระบบจะส่งต่อคำขอไปยังปลายทางเป้าหมายที่มีชื่อ
เช่น หากต้องการกำหนดเส้นทางข้อความอย่างมีเงื่อนไขไปยังปลายทางเป้าหมายที่กำหนดตาม Content-Type
ให้ทำดังนี้
<RouteRule name="default">
<!--this routing executes if the header indicates that this is an XML call. If true, the call is routed to the endpoint XMLTargetEndpoint-->
<Condition>request.header.Content-Type = "text/xml"</Condition>
<TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>
ดูข้อมูลเพิ่มเติมได้ที่ตัวแปรและเงื่อนไขสำหรับโฟลว์
นิพจน์เส้นทาง
นิพจน์เส้นทางใช้สำหรับเส้นทาง URI ที่ตรงกัน โดยใช้ "*" เพื่อแสดงองค์ประกอบเส้นทางเดียว และใช้ "**" เพื่อแสดง URI หลายระดับ
เช่น
รูปแบบ | ตัวอย่างเส้นทาง URI ที่ตรงกัน |
---|---|
/*/a/ |
/x/a/ หรือ /y/a/ |
/*/a/* |
/x/a/b หรือ /y/a/foo |
/*/a/** |
/x/a/b/c/d |
/*/a/*/feed/ |
/x/a/b/feed/ หรือ /y/a/foo/feed/ |
/a/**/feed/** |
/a/b/feed/rss/1234 |
ระบบจะถือว่า %
เป็นอักขระหลีก รูปแบบ %{user%}
ตรงกับ {user}
แต่ไม่จับคู่กับ user
ตัวแปร
คุณสามารถใช้ทั้งตัวแปรโฟลว์ในตัวและตัวแปรที่กำหนดเองในคำสั่งแบบมีเงื่อนไข ดูข้อมูลเพิ่มเติมได้ที่
- การอ้างอิงตัวแปรโฟลว์: รายการตัวแปรบิวท์อินทั้งหมด
- นโยบาย ExtractVariable: วิธีการในการตั้งค่าตัวแปรที่กําหนดเอง
โอเปอเรเตอร์
เมื่อใช้โอเปอเรเตอร์ โปรดคำนึงถึงข้อจำกัดต่อไปนี้
- ใช้โอเปอเรเตอร์เป็นชื่อตัวแปรไม่ได้
- ต้องเว้นวรรคก่อนและหลังโอเปอเรเตอร์
- หากต้องการใส่โอเปอเรเตอร์ในตัวแปร ชื่อตัวแปรจะต้องอยู่ในเครื่องหมายคำพูดเดี่ยว
เช่น
'request.header.help!me'
- ไม่รองรับโอเปอเรเตอร์ทางคณิตศาสตร์ (
+ * - / %
) - ลำดับความสำคัญของ Java จะใช้สำหรับโอเปอเรเตอร์
- Apigee Edge อาศัยนิพจน์ทั่วไปที่นำไปใช้ใน
java.util.regex
ตารางต่อไปนี้แสดงโอเปอเรเตอร์ที่รองรับ คุณสามารถใช้สัญลักษณ์หรือคำในนิพจน์
สัญลักษณ์ | คำ | คำอธิบาย |
---|---|---|
! |
Not not |
โอเปอเรเตอร์ค่าเดี่ยว (ใช้อินพุตเดียว) |
= |
Equals Is |
เท่ากับ (คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) |
!= |
NotEquals IsNot |
ไม่เท่ากับ (คํานึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) |
:= |
EqualsCaseInsensitive |
เท่ากับ แต่ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ |
> หรือ > |
GreaterThan |
มากกว่า หากคุณใช้ > เมื่อกําหนดเงื่อนไขใน Edge UI ระบบจะแปลงเป็น > |
>= หรือ >= |
GreaterThanOrEquals |
มากกว่าหรือเท่ากับ หากคุณใช้ >= เมื่อกำหนดเงื่อนไขใน Edge UI ระบบจะแปลงเป็น >= |
< |
LesserThan |
น้อยกว่า Edge UI ไม่รองรับ < ตรงตัวอักษร |
<= |
LesserThanOrEquals |
น้อยกว่าหรือเท่ากับ Edge UI ไม่รองรับ <= ลิเทอรัล |
&& |
And and |
และ |
|| |
Or |
โอเปอเรเตอร์ "หรือ" ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ เช่น OR , Or และ or ใช้ได้ทั้งหมด |
() |
จัดกลุ่มนิพจน์ ( จะเปิดนิพจน์และ ) จะปิดนิพจน์นั้น |
|
~~ |
JavaRegex |
ตรงกับนิพจน์ทั่วไปที่เป็นไปตามข้อกำหนด |
~ |
Matches Like |
จับคู่รูปแบบสไตล์ glob โดยใช้อักขระไวลด์การ์ด "*" การจับคู่จะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ดูตัวอย่างได้ที่การจับคู่รูปแบบกับเงื่อนไข |
~/ |
MatchesPath LikePath |
จับคู่นิพจน์เส้นทาง การจับคู่จะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ดูตัวอย่างได้ที่การจับคู่รูปแบบกับเงื่อนไข |
=| |
StartsWith |
จับคู่อักขระตัวแรกของสตริง การจับคู่จะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ |
ตัวถูกดำเนินการ
Apigee Edge จะปรับตัวถูกดำเนินการเข้ากับประเภทข้อมูลทั่วไปก่อนที่จะเปรียบเทียบตัวถูกดำเนินการเหล่านั้น เช่น หากรหัสสถานะการตอบกลับคือ 404 นิพจน์ response.status.code = "400"
และ response.status.code = 400
จะเทียบเท่ากัน
สำหรับตัวถูกดำเนินการที่เป็นตัวเลข ระบบจะตีความประเภทข้อมูลเป็นจำนวนเต็ม ยกเว้นกรณีที่ค่าสิ้นสุดลงดังนี้
- "f" หรือ "F" (ทศนิยม เช่น 3.142f, 91.1F)
- "d" หรือ "D" (ดับเบิล เช่น 3.142d, 100.123D)
- "l" หรือ "L" (ยาว เช่น 12321421312L)
ในกรณีเหล่านี้ ระบบจะปรับตามที่แสดงในตารางต่อไปนี้ (โดยที่ RHS หมายถึงด้านขวาของสมการและ LHS คือด้านซ้าย)
RHS LHS | บูลีน | จำนวนเต็ม | ยาว | ทศนิยม | ดับเบิล | สตริง | เปรียบเทียบได้ | ออบเจ็กต์ |
---|---|---|---|---|---|---|---|---|
บูลีน | บูลีน | จำนวนเต็ม | ยาว | ทศนิยม | ดับเบิล | สตริง | - | |
จำนวนเต็ม | จำนวนเต็ม | จำนวนเต็ม | ยาว | ทศนิยม | ดับเบิล | สตริง | เปรียบเทียบได้ | - |
ยาว | ยาว | ยาว | ยาว | ทศนิยม | ดับเบิล | สตริง | เปรียบเทียบได้ | - |
ทศนิยม | ทศนิยม | ทศนิยม | ทศนิยม | ทศนิยม | ดับเบิล | สตริง | เปรียบเทียบได้ | - |
ดับเบิล | ดับเบิล | ดับเบิล | ดับเบิล | ดับเบิล | ดับเบิล | สตริง | เปรียบเทียบได้ | - |
สตริง | สตริง | สตริง | สตริง | สตริง | สตริง | สตริง | เปรียบเทียบได้ | - |
เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | - |
ออบเจ็กต์ | - | - | - | - | - | - | - | - |
ตัวถูกดำเนินการเป็นค่าว่าง
ตารางต่อไปนี้จะแสดงให้เห็นว่าเงื่อนไขจะประเมินเป็น true
หรือ false
เมื่อค่าเป็น Null ทางด้านซ้าย (LHS) และ/หรือด้านขวามือ (RHS) ของตัวถูกดำเนินการที่แสดงอยู่
ผู้ประกอบธุรกิจ | LHS ไม่มีข้อมูล | RHS null | LHS และ RHS ไม่มีข้อมูล |
---|---|---|---|
= , == , := |
false | false | true |
=| |
false | false | false |
!= |
true | true | false |
> หรือ > |
true | false | false |
>= หรือ >= |
false | true | true |
< |
true | false | false |
<= |
true | false | true |
~ |
false | ไม่มี | false |
~~ |
false | ไม่มี | false |
!~ |
true | false | false |
~/ |
false | ไม่มี | false |
ลิเทอรัล
นอกเหนือจากลิเทอรัลสตริงและตัวเลขแล้ว คุณยังใช้ลิเทอรัลต่อไปนี้ในคำสั่งแบบมีเงื่อนไขได้ด้วย
null
true
false
เช่น
request.header.host is null
flow.cachehit is true
ตัวอย่าง
<RouteRule name="default"> <Condition>request.header.content-type = "text/xml"</Condition> <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint> </RouteRule>
<Step> <Condition>response.status.code = 503</Condition> <Name>MaintenancePolicy</Name> </Step>
<Flow name="GetRequests"> <Condition>response.verb="GET"</Condition> <Request> <Step> <Condition>request.path ~ "/statuses/**"</Condition> <Name>StatusesRequestPolicy</Name> </Step> </Request> <Response> <Step> <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition> <Name>MaintenancePolicy</Name> </Step> </Response> </Flow>