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

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

เงื่อนไขช่วยให้พร็อกซี 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>

ตำแหน่งที่คุณใช้คำสั่งแบบมีเงื่อนไขได้

คุณใช้เงื่อนไขเพื่อควบคุมลักษณะการทำงานต่อไปนี้ได้

การบังคับใช้นโยบาย

เมื่อใช้ข้อความแบบมีเงื่อนไข คุณสามารถควบคุมการบังคับใช้นโยบายได้ Use Case ทั่วไป คือการแปลงข้อความตอบกลับแบบมีเงื่อนไข โดยอิงตามส่วนหัว HTTP หรือเนื้อหาข้อความ

ตัวอย่างต่อไปนี้เปลี่ยน XML เป็น JSON แบบมีเงื่อนไขโดยอิงตาม Accept ส่วนหัว:

<Step>
  <Condition>request.header.accept = "application/json"</Condition>
  <Name>XMLToJSON</Name>
</Step>

การดำเนินการตามโฟลว์

เมื่อใช้คำสั่งแบบมีเงื่อนไข คุณสามารถควบคุมการทำงานของขั้นตอนที่ตั้งชื่อใน ProxyEndpoints และ TargetEndpoints โปรดทราบว่าเฉพาะ "ชื่อ" เท่านั้น สามารถดำเนินการอย่างมีเงื่อนไข ลำดับขั้นตอนและ 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

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

สัญลักษณ์ Word คำอธิบาย
! 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 และ or ใช้ได้ทั้งหมด
() จัดกลุ่มนิพจน์ ( จะเปิดนิพจน์และ ) ปิด ได้
~~ JavaRegex

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

~ Matches Like จับคู่รูปแบบภาพโลกโดยใช้เครื่องหมาย "*" อักขระไวลด์การ์ด การจับคู่ที่ตรงกันคือ คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ สำหรับตัวอย่าง ดูการจับคู่รูปแบบกับ แบบมีเงื่อนไข
~/ 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 บูลีน จำนวนเต็ม ยาว ทศนิยม ดับเบิล สตริง เปรียบเทียบได้ ออบเจ็กต์
บูลีน บูลีน จำนวนเต็ม ยาว ทศนิยม ดับเบิล สตริง -
จำนวนเต็ม จำนวนเต็ม จำนวนเต็ม ยาว ทศนิยม ดับเบิล สตริง เปรียบเทียบได้ -
ยาว ยาว ยาว ยาว ทศนิยม ดับเบิล สตริง เปรียบเทียบได้ -
ทศนิยม ทศนิยม ทศนิยม ทศนิยม ทศนิยม ดับเบิล สตริง เปรียบเทียบได้ -
ดับเบิล ดับเบิล ดับเบิล ดับเบิล ดับเบิล ดับเบิล สตริง เปรียบเทียบได้ -
สตริง สตริง สตริง สตริง สตริง สตริง สตริง เปรียบเทียบได้ -
เปรียบเทียบได้ เปรียบเทียบได้ เปรียบเทียบได้ เปรียบเทียบได้ เปรียบเทียบได้ เปรียบเทียบได้ เปรียบเทียบได้ เปรียบเทียบได้ -
ออบเจ็กต์ - - - - - - - -

ตัวถูกดำเนินการแบบ Null

ตารางต่อไปนี้แสดงให้เห็นว่าเงื่อนไขมีการประเมินเป็น true หรือ false เมื่อค่าเป็น Null ทางด้านซ้าย (LHS) และ/หรือด้านขวามือ (RHS) ของตัวถูกดำเนินการที่แสดง

โอเปอเรเตอร์ LHS ค่าว่าง RHS ค่าว่าง LHS และ RHS เป็นค่าว่าง
=, ==, := เท็จ เท็จ true
=| เท็จ เท็จ เท็จ
!= true true เท็จ
> หรือ &gt; true เท็จ เท็จ
>= หรือ &gt;= เท็จ true true
&lt; true เท็จ เท็จ
&lt;= true เท็จ true
~ เท็จ ไม่มี เท็จ
~~ เท็จ ไม่มี เท็จ
!~ true เท็จ เท็จ
~/ เท็จ ไม่มี เท็จ

ลิเทอรัล

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

  • 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>