คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ
Apigee X info
เงื่อนไขช่วยให้พร็อกซี API ทำงานแบบไดนามิกได้ในขณะรันไทม์ เงื่อนไขจะกำหนดการดำเนินการ
ในตัวแปร ซึ่งไปป์ไลน์การประมวลผลของ Apigee Edge จะเป็นผู้ประเมิน คำสั่งแบบมีเงื่อนไข
เป็นบูลีนและประเมินค่าเป็น true หรือ false เสมอ
ภาพรวมเงื่อนไข
ส่วนนี้จะอธิบายวิธีและตำแหน่งที่จะใช้คำสั่งแบบมีเงื่อนไขกับ Edge นอกจากนี้ ส่วนต่อไปนี้จะอธิบายไวยากรณ์
โครงสร้างของคำสั่งแบบมีเงื่อนไข
โครงสร้างพื้นฐานของคำสั่งแบบมีเงื่อนไขคือ
<Condition>variable.name operator "value"</Condition>
เช่น
<Condition>request.verb = "GET"</Condition>
คุณรวมเงื่อนไขกับ AND เพื่อบังคับใช้มากกว่า 1 เงื่อนไขพร้อมกันได้ ตัวอย่างเช่น เงื่อนไขต่อไปนี้จะประเมินเป็น true ก็ต่อเมื่อ URI ของคำขอตรงกับ
/statuses และกริยา HTTP ของคำขอคือ
GET
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
ตำแหน่งที่คุณใช้คำสั่งแบบมีเงื่อนไขได้
คุณใช้เงื่อนไขเพื่อควบคุมลักษณะการทำงานในสิ่งต่อไปนี้ได้
การปฏิบัติตามนโยบาย
คุณสามารถควบคุมการบังคับใช้นโยบายได้โดยใช้คำสั่งแบบมีเงื่อนไข กรณีการใช้งานที่พบบ่อย คือการเปลี่ยนรูปแบบข้อความตอบกลับแบบมีเงื่อนไข โดยอิงตามส่วนหัว HTTP หรือเนื้อหาข้อความ
ตัวอย่างต่อไปนี้จะแปลง XML เป็น JSON แบบมีเงื่อนไขตามส่วนหัว Accept
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
การดำเนินการตามโฟลว์
การใช้คำสั่งแบบมีเงื่อนไขช่วยให้คุณควบคุมการดำเนินการของโฟลว์ที่มีชื่อใน ProxyEndpoints และ TargetEndpoints ได้ โปรดทราบว่าเฉพาะโฟลว์ที่ "ตั้งชื่อ" เท่านั้นที่จะดำเนินการแบบมีเงื่อนไขได้ PreFlow และ PostFlow (ทั้งคำขอและการตอบกลับ) ใน ProxyEndpoint และ TargetEndpoint จะทำงานสำหรับทุกธุรกรรม จึงทำให้มีความสามารถ "ป้องกันข้อผิดพลาด" แบบไม่มีเงื่อนไข
ตัวอย่างเช่น หากต้องการเรียกใช้โฟลว์คำขอแบบมีเงื่อนไขตามกริยา 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
ตัวแปร
คุณสามารถใช้ทั้งตัวแปรโฟลว์ที่มีอยู่แล้วและตัวแปรที่กำหนดเองในคำสั่งแบบมีเงื่อนไข ดูข้อมูลเพิ่มเติมได้ที่
- ข้อมูลอ้างอิงตัวแปรโฟลว์: รายการตัวแปรในตัวทั้งหมด
- นโยบาย ExtractVariables: วิธีตั้งค่าตัวแปรที่กำหนดเอง
โอเปอเรเตอร์
เมื่อใช้ตัวดำเนินการ โปรดปฏิบัติตามข้อจำกัดต่อไปนี้
- ใช้ตัวดำเนินการเป็นชื่อตัวแปรไม่ได้
- ต้องมีอักขระเว้นวรรคก่อนและหลังโอเปอเรเตอร์
- หากต้องการรวมตัวดำเนินการไว้ในตัวแปร จะต้องใส่ชื่อตัวแปรไว้ในเครื่องหมายคำพูดเดี่ยว
เช่น
'request.header.help!me' - ระบบไม่รองรับตัวดำเนินการทางคณิตศาสตร์ (
+ * - / %) - ลำดับความสำคัญของ Javaใช้สำหรับโอเปอเรเตอร์
- Apigee Edge ใช้นิพจน์ทั่วไปตามที่ใช้งานใน
java.util.regex
ตารางต่อไปนี้แสดงรายการโอเปอเรเตอร์ที่รองรับ คุณใช้สัญลักษณ์หรือคำในนิพจน์ได้ดังนี้
| สัญลักษณ์ | Word | คำอธิบาย |
|---|---|---|
! |
Not, not |
ตัวดำเนินการเอกภาค (รับอินพุตเดียว) |
= |
Equals, Is |
เท่ากับ (คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) |
!= |
NotEquals, IsNot |
ไม่เท่ากับ (คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) |
:= |
EqualsCaseInsensitive |
เท่ากับ แต่ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ |
> หรือ > |
GreaterThan |
มากกว่า หากคุณใช้ > เมื่อกำหนดเงื่อนไขใน UI ของ Edge ระบบจะแปลงเป็น > |
>= หรือ >= |
GreaterThanOrEquals |
มากกว่าหรือเท่ากับ หากคุณใช้ >= เมื่อกำหนดเงื่อนไขใน UI ของ Edge ระบบจะแปลงเป็น >= |
< |
LesserThan |
น้อยกว่า UI ของ Edge ไม่รองรับเครื่องหมาย < |
<= |
LesserThanOrEquals |
น้อยกว่าหรือเท่ากับ UI ของ Edge ไม่รองรับสัญลักษณ์ <= |
&& |
And, and |
และ |
|| |
Or |
ตัวดำเนินการ 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" (Double เช่น 3.142d, 100.123D)
- "l" หรือ "L" (ยาว เช่น 12321421312L)
ในกรณีเหล่านี้ ระบบจะทำการปรับตามที่แสดงในตารางต่อไปนี้ (โดย RHS หมายถึงด้านขวาของสมการ และ LHS คือด้านซ้าย)
| RHS LHS | บูลีน | จำนวนเต็ม | ยาว | ทศนิยม | ดับเบิล | สตริง | เปรียบเทียบได้ | วัตถุ |
|---|---|---|---|---|---|---|---|---|
| บูลีน | บูลีน | จำนวนเต็ม | ยาว | ทศนิยม | ดับเบิล | สตริง | - | |
| จำนวนเต็ม | จำนวนเต็ม | จำนวนเต็ม | ยาว | ทศนิยม | ดับเบิล | สตริง | เปรียบเทียบได้ | - |
| ยาว | ยาว | ยาว | ยาว | ทศนิยม | ดับเบิล | สตริง | เปรียบเทียบได้ | - |
| ทศนิยม | ทศนิยม | ทศนิยม | ทศนิยม | ทศนิยม | ดับเบิล | สตริง | เปรียบเทียบได้ | - |
| ดับเบิล | ดับเบิล | ดับเบิล | ดับเบิล | ดับเบิล | ดับเบิล | สตริง | เปรียบเทียบได้ | - |
| สตริง | สตริง | สตริง | สตริง | สตริง | สตริง | สตริง | เปรียบเทียบได้ | - |
| เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | เปรียบเทียบได้ | - |
| วัตถุ | - | - | - | - | - | - | - | - |
ตัวถูกดำเนินการที่เป็น Null
ตารางต่อไปนี้แสดงว่าเงื่อนไขประเมินเป็น true หรือ
false เมื่อค่าเป็น Null ทางด้านซ้าย (LHS) และ/หรือด้านขวา (RHS)
ของตัวถูกดำเนินการที่แสดง
| โอเปอเรเตอร์ | LHS null | 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 |
ค่าคงที่
นอกเหนือจากสตริงและค่าคงที่ที่เป็นตัวเลขแล้ว คุณยังใช้ค่าคงที่ต่อไปนี้ใน คำสั่งแบบมีเงื่อนไขได้ด้วย
nulltruefalse
เช่น
request.header.host is nullflow.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>