การอ้างอิงเงื่อนไข

คุณกำลังดูเอกสารประกอบของ 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

ตัวแปร

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

โอเปอเรเตอร์

เมื่อใช้โอเปอเรเตอร์ โปรดคำนึงถึงข้อจำกัดต่อไปนี้

  • ใช้โอเปอเรเตอร์เป็นชื่อตัวแปรไม่ได้
  • ต้องเว้นวรรคก่อนและหลังโอเปอเรเตอร์
  • หากต้องการใส่โอเปอเรเตอร์ในตัวแปร ชื่อตัวแปรจะต้องอยู่ในเครื่องหมายคำพูดเดี่ยว เช่น 'request.header.help!me'
  • ไม่รองรับโอเปอเรเตอร์ทางคณิตศาสตร์ (+ * - / %)
  • ลำดับความสำคัญของ Java จะใช้สำหรับโอเปอเรเตอร์
  • Apigee Edge อาศัยนิพจน์ทั่วไปที่นำไปใช้ใน java.util.regex

ตารางต่อไปนี้แสดงโอเปอเรเตอร์ที่รองรับ คุณสามารถใช้สัญลักษณ์หรือคำในนิพจน์

สัญลักษณ์ คำ คำอธิบาย
! Not not โอเปอเรเตอร์ค่าเดี่ยว (ใช้อินพุตเดียว)
= Equals Is เท่ากับ (คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่)
!= NotEquals IsNot ไม่เท่ากับ (คํานึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่)
:= EqualsCaseInsensitive เท่ากับ แต่ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
> หรือ &gt; GreaterThan มากกว่า หากคุณใช้ > เมื่อกําหนดเงื่อนไขใน Edge UI ระบบจะแปลงเป็น &gt;
>= หรือ &gt;= GreaterThanOrEquals มากกว่าหรือเท่ากับ หากคุณใช้ >= เมื่อกำหนดเงื่อนไขใน Edge UI ระบบจะแปลงเป็น &gt;=
&lt; LesserThan น้อยกว่า Edge UI ไม่รองรับ < ตรงตัวอักษร
&lt;= LesserThanOrEquals น้อยกว่าหรือเท่ากับ Edge UI ไม่รองรับ <= ลิเทอรัล
&& And and และ
|| Or โอเปอเรเตอร์ "หรือ" ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ เช่น OR, Or และ or ใช้ได้ทั้งหมด
() จัดกลุ่มนิพจน์ ( จะเปิดนิพจน์และ ) จะปิดนิพจน์นั้น
~~ JavaRegex

ตรงกับนิพจน์ทั่วไปที่เป็นไปตามข้อกำหนด javax.util.regex การจับคู่จะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ดูตัวอย่างได้ที่การจับคู่รูปแบบในคำสั่งแบบมีเงื่อนไข

~ 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
> หรือ &gt; true false false
>= หรือ &gt;= false true true
&lt; true false false
&lt;= 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>