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

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

ตัวแปร

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

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

เมื่อใช้ตัวดำเนินการ โปรดปฏิบัติตามข้อจำกัดต่อไปนี้

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

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

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