เงื่อนไขที่มีตัวแปรโฟลว์

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

คำสั่งแบบมีเงื่อนไขเป็นโครงสร้างการควบคุมที่ใช้กันทั่วไปในภาษาโปรแกรมทั้งหมด ชอบ ภาษาโปรแกรม การกำหนดค่าพร็อกซี API รองรับคำสั่งแบบมีเงื่อนไขสำหรับโฟลว์ นโยบาย ขั้นตอน และ RouteRule การกำหนดข้อความแบบมีเงื่อนไขจะช่วยกำหนดพฤติกรรมแบบไดนามิก สำหรับ API ของคุณ ลักษณะการทำงานแบบไดนามิกนี้จะช่วยให้คุณทำสิ่งต่างๆ เช่น แปลง XML เป็น JSON เฉพาะสำหรับ อุปกรณ์เคลื่อนที่ หรือกำหนดเส้นทางไปยัง URL แบ็กเอนด์ตามประเภทเนื้อหาหรือคำกริยา HTTP ของคำขอ

หัวข้อนี้จะแสดงวิธีใช้เงื่อนไขเพื่อใช้ฟีเจอร์การจัดการ API แบบไดนามิกที่ โดยไม่ต้องเขียนโค้ดใดๆ

กำหนดค่าคำสั่งเงื่อนไข

การใช้งานแบบมีเงื่อนไขจะใช้งานในพร็อกซี API โดยใช้เงื่อนไขร่วมกัน และvariables คำสั่งแบบมีเงื่อนไขจะสร้างขึ้นโดยใช้องค์ประกอบเงื่อนไข เงื่อนไขต่อไปนี้เป็นเงื่อนไขว่าง

<Condition></Condition>

หากต้องการสร้างคำสั่งแบบมีเงื่อนไข ให้เพิ่มโอเปอเรเตอร์แบบมีเงื่อนไขและตัวแปรเพื่อสร้าง โครงสร้างต่อไปนี้

<Condition>{variable.name}{operator}{"value"}</Condition>

โอเปอเรเตอร์แบบมีเงื่อนไขที่รองรับ ได้แก่ = (เท่ากับ) != (ไม่เท่ากับ) และ > (มากกว่า) คุณยังเขียนเงื่อนไขเป็นแบบ ข้อความ: equals, notequals, greaterthan

เมื่อใช้เส้นทาง URI คุณจะใช้ ~/ หรือ MatchesPath ได้ นอกจากนี้ คุณยังจับคู่นิพจน์ทั่วไป JavaRegex กับโอเปอเรเตอร์ ~~ ได้ด้วย

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

ตัวแปร

เงื่อนไขจะทำงานโดยการประเมินค่าของvariables ตัวแปรคือ ของธุรกรรม HTTP ที่ดำเนินการโดยพร็อกซี API หรือพร็อพเพอร์ตี้ของพร็อกซี API การกำหนดค่าเอง เมื่อใดก็ตามที่พร็อกซี API ได้รับคำขอจากแอป Apigee Edge จะป้อนข้อมูล รายการตัวแปรจำนวนมากที่เกี่ยวข้องกับสิ่งต่างๆ เช่น เวลาของระบบ เครือข่ายของแอป ข้อมูล, ส่วนหัว HTTP ในข้อความ, การกำหนดค่าพร็อกซี API, การดำเนินนโยบาย เป็นต้น ซึ่งจะสร้างบริบทที่สมบูรณ์ซึ่งคุณใช้เพื่อตั้งค่าคำสั่งเงื่อนไขได้

ตัวแปรจะใช้เครื่องหมายแบบจุดเสมอ เช่น ส่วนหัว HTTP ในข้อความคําขอจะพร้อมใช้งานเป็นตัวแปรที่ชื่อ request.header.{header_name} ดังนั้นในการประเมิน ส่วนหัวประเภทเนื้อหา คุณใช้ตัวแปร request.header.Content-type ได้ สำหรับ ตัวอย่าง request.header.Content-type = "application/json" บ่งบอกว่าเนื้อหา ประเภทคำขอควรเป็น JSON

สมมติว่าคุณต้องสร้างคำสั่งแบบมีเงื่อนไขที่จะทําให้บังคับใช้นโยบายก็ต่อเมื่อข้อความคําขอเป็น GET เท่านั้น วิธีสร้างเงื่อนไขที่ประเมินกริยา HTTP เพื่อสร้างคำสั่งแบบมีเงื่อนไขด้านล่าง ตัวแปรในเงื่อนไขนี้คือ request.verb ค่าของตัวแปรคือ GET โอเปอเรเตอร์คือ =

<Condition>request.verb = "GET"</Condition>
นอกจากนี้ คุณยังสามารถใช้:
<Condition>request.verb equals "GET"</Condition>

Edge ใช้คำแถลงดังกล่าวเพื่อประเมินเงื่อนไข ตัวอย่างข้างต้นจะประเมินเป็น "จริง" หากคำกริยา HTTP ที่เชื่อมโยงกับคำขอคือ GET หากคํากริยา HTTP ที่เชื่อมโยงกับคําขอคือ POST คำสั่งจะประเมินเป็นเท็จ

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

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

เช่น หากต้องการสร้างโฟลว์ที่จะทํางานเฉพาะเมื่อคํากริยาของคําขอเป็น GET ให้ทําดังนี้

<Flows>
  <Flow name="ExecuteForGETs">
  <Condition>request.verb="GET"</Condition>
  </Flow>
</Flows>

วิธีสร้างโฟลว์ 1 รายการสําหรับ GET และอีก 1 รายการสําหรับ POST

<Flows>
  <Flow name="ExecuteForGETs">
  <Condition>request.verb="GET"</Condition>
  </Flow>
  <Flow name="ExecuteForPOSTs">
  <Condition>request.verb="POST"</Condition>
  </Flow>
</Flows>

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

<PreFlow name="PreFlow">
    <Request>
        <Step>
            <Condition>request.verb equals "POST"</Condition>
            <Name>VerifyApiKey</Name>
        </Step>
    </Request>
</PreFlow>

เมื่อกำหนดโฟลว์แบบมีเงื่อนไขดังกล่าวแล้ว คุณจะแนบนโยบายกับขั้นตอนดังกล่าวเพื่อเปิดใช้ API ได้ พร็อกซีเพื่อบังคับใช้นโยบายชุดหนึ่งสำหรับคำขอ GET และอีกชุดนโยบายสำหรับ POST คำขอ

ดูข้อมูลอ้างอิงโดยละเอียดได้ที่แหล่งข้อมูลต่อไปนี้

ตัวอย่างที่ 1

ตัวอย่างต่อไปนี้แสดงโฟลว์แบบมีเงื่อนไขรายการเดียวชื่อ Convert-for-devices ซึ่งกําหนดค่าไว้ในขั้นตอนการตอบกลับ ProxyEndpoint เพิ่มเงื่อนไขเป็นองค์ประกอบในเอนทิตีไปยัง ที่ใช้กับเงื่อนไข ในตัวอย่างนี้ เงื่อนไขเป็นองค์ประกอบของขั้นตอน ดังนั้น ขั้นตอนจะทํางานทุกครั้งที่คำสั่งประเมินเป็น "จริง"

<Flows>
  <Flow name="Convert-for-devices">
  <Condition>(request.header.User-Agent = "Mozilla")</Condition>
    <Response>
      <Step><Name>ConvertToJSON</Name></Step>
    </Response>
  </Flow>
</Flows>

Edge จะจัดเก็บค่าของส่วนหัว HTTP ทั้งหมดที่แสดง สำหรับแต่ละคำขอที่ได้รับจากแอป ตัวแปร หากคําขอมีส่วนหัว HTTP ชื่อว่า User-Agent ระบบจะจัดเก็บส่วนหัวและค่าของส่วนหัวนั้นเป็นตัวแปรชื่อ request.header.User-Agent

จากการกำหนดค่า ProxyEndpoint ด้านบน Edge จะตรวจสอบค่าของฟิลด์ request.header.User-Agent เพื่อดูว่าเงื่อนไขประเมินเป็น true

หากเงื่อนไขประเมินเป็น "จริง" กล่าวคือ ค่าของตัวแปร request.header.User-Agent เท่ากับ Mozilla ตามด้วยโฟลว์แบบมีเงื่อนไข ดำเนินการ และได้มีการบังคับใช้นโยบาย XMLtoJSON ชื่อ ConvertToJSON หากไม่เป็นเช่นนั้น โฟลว์ ไม่มีการดำเนินการ และการตอบกลับ XML จะถูกส่งคืนโดยไม่มีการแก้ไข (ในรูปแบบ XML) สำหรับคำขอ แอป

ตัวอย่างที่ 2

ลองดูตัวอย่างเฉพาะที่คุณต้องเปลี่ยนรูปแบบข้อความตอบกลับจาก XML เป็น JSON แต่มีไว้สำหรับอุปกรณ์เคลื่อนที่เท่านั้น ก่อนอื่น ให้สร้างนโยบายที่จะแปลง การตอบกลับในรูปแบบ XML จาก Weather API ไปยัง JSON:

<XMLToJSON name="ConvertToJSON">
  <Options>
  </Options>
  <OutputVariable>response</OutputVariable>
  <Source>response</Source>
</XMLToJSON>

การกําหนดค่านโยบายข้างต้นบอกให้พร็อกซี API นำข้อความตอบกลับ แปลงจาก XML เป็น JSON ด้วยการตั้งค่าเริ่มต้น แล้วเขียนผลลัพธ์ลงในข้อความตอบกลับใหม่ (หากคุณกำลังแปลงข้อความ request จาก XML เป็น JSON เพียงตั้งค่าทั้ง ค่าเหล่านี้ไปยัง request)

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

<Flows>
  <Flow name="Convert-for-devices">
    <Response>
      <Step><Name>ConvertToJSON</Name></Step>
    </Response>
  </Flow>
</Flows>

เมื่อคุณเรียกใช้ API โดยใช้คำขอมาตรฐาน การตอบกลับจะอยู่ในรูปแบบ JSON

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

ทดสอบขั้นตอนแบบมีเงื่อนไข

ในคำขอตัวอย่างนี้ ส่วนหัว HTTP User-Agent ได้รับการตั้งค่าเป็น Mozilla ทำให้ข้อความแบบมีเงื่อนไขประเมินค่าเป็นจริง และเป็น เรียกใช้ Convert-for-devices

$ curl -H "User-Agent:Mozilla" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282

หรืออาจให้พิมพ์ตามความเหมาะสมเมื่อใช้ Python

$ curl -H "User-Agent:Mozilla" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282 | python -mjson.tool

ตัวอย่างการตอบกลับ

. . .

"yweather_forecast": [
         {
              "code": "11",
              "date": "12 Dec 2012",
              "day": "Wed",
              "high": "55",
              "low": "36",
              "text": "Showers"
          },
          {
              "code": "32",
              "date": "13 Dec 2012",
              "day": "Thu",
              "high": "56",
              "low": "38",
              "text": "Sunny"
          }
      ]
  }

. . .

คำขอที่ส่งโดยไม่มีส่วนหัว User-Agent หรือมีค่าที่แตกต่างจาก Mozilla จะส่งผลให้มีการตอบกลับในรูปแบบ XML

$ curl http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282

ระบบจะแสดงการตอบกลับ XML ที่ไม่ได้แก้ไข

ตัวอย่างการตอบกลับ

<yweather:forecast day="Wed" date="12 Dec 2012" low="36" high="55" text="Showers" code="11" /> <yweather:forecast day="Thu" date="13 Dec 2012" low="38" high="56" text="Sunny" code="32" />

การจับคู่รูปแบบ

ส่วนนี้จะอธิบายวิธีใช้การจับคู่รูปแบบกับเงื่อนไขในเวิร์กโฟลว์ Apigee

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

ส่วนนี้จะอธิบายวิธีใช้โอเปอเรเตอร์การจับคู่รูปแบบต่อไปนี้ในคำสั่งแบบมีเงื่อนไข

การจับคู่

เรามาดูโอเปอเรเตอร์แบบมีเงื่อนไข "ตรงกัน" หรือ "~" ก่อน โอเปอเรเตอร์ 2 รายการนี้เหมือนกัน โดย "ตรงกัน" ในภาษาอังกฤษถือเป็นตัวเลือกที่อ่านง่ายกว่า

สรุป: "รายการที่ตรงกัน" ให้คุณดำเนินการได้ 2 อย่าง จับคู่สตริงตามตัวอักษร หรือจับคู่ไวลด์การ์ดด้วย "*" ไวลด์การ์ดจะจับคู่อักขระตั้งแต่ 0 ตัวขึ้นไป มาดูวิธีการทำงานของฟีเจอร์นี้กัน

XML ต่อไปนี้จะแสดงเงื่อนไขขั้นตอน โดยจะเรียกใช้นโยบาย SomePolicy เมื่อเงื่อนไขประเมินเป็น "จริง" ในตัวอย่างนี้ เราจะทดสอบตัวแปร proxy.pathsuffix ซึ่งเป็นตัวแปรในตัวของ Edge ที่เก็บส่วนต่อท้ายของเส้นทางของคําขอ อย่างไรก็ตาม โปรดทราบว่าคุณสามารถทดสอบค่าของตัวแปรการไหลที่มีสตริงได้ ดังนั้นในกรณีนี้ ถ้าเส้นทางฐานของ คำขอที่เข้ามาใหม่คือ /animals และคำขอคือ /animals/cat จากนั้น คำต่อท้ายเส้นทางคือสตริงตามตัวอักษร "/cat"

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>(proxy.pathsuffix Matches "/cat")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

คำถาม: คำต่อท้ายเส้นทางพร็อกซีใดที่จะทำให้ somePolicy ทำงาน มี จะสามารถทำได้เพียงครั้งเดียว

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat

นโยบายจะทำงานไหม ใช่ เนื่องจากคำต่อท้ายเส้นทางพร็อกซีตรงกับ "/cat" แน่นอน การดำเนินการจะไม่ทำงานหากส่วนต่อท้ายคือ /bat หรือ /dog หรือ "/" หรืออย่างอื่น

ทีนี้ลองพิจารณาคำสั่งแบบมีเงื่อนไขนี้ซึ่งเราใช้อักขระไวลด์การ์ด "*"

<Condition>(proxy.pathsuffix Matches "/*at")</Condition>

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat

นโยบายมีผลบังคับใช้หรือไม่ ใช่ เนื่องจากไวลด์การ์ดตรงกับอักขระใดก็ได้ และ "/cat นิ้ว คือรายการที่ตรงกัน

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/bat

นโยบายจะทำงานไหม ใช่ เนื่องจากไวลด์การ์ดตรงกับอักขระใดก็ได้ "/bat" คือรายการที่ตรงกัน

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/owl

นโยบายมีผลบังคับใช้หรือไม่ ไม่ได้ แม้ว่าไวลด์การ์ดจะตรงกับ "o" แต่ก็ไม่ได้ตรงกับตัวอักษร "wl"

ต่อไปเราจะย้ายไวลด์การ์ดไปยังส่วนท้ายของส่วนต่อท้าย

<Condition>(proxy.pathsuffix Matches "/cat*")</Condition>

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat

นโยบายมีผลบังคับใช้หรือไม่ ใช่ เนื่องจากไวลด์การ์ดตรงกับอักขระ 0 ตัวขึ้นไป

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/bat

นโยบายมีผลบังคับใช้หรือไม่ ไม่ "/bat" ไม่ใช่รายการที่ตรงกัน

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat123

นโยบายจะทำงานไหม ใช่ ไวลด์การ์ดจะจับคู่กับอักขระใดก็ได้ตั้งแต่ 0 ตัวขึ้นไป ดังนั้น "123" จึงจับคู่ได้

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat/bird/mouse

นโยบายจะทำงานไหม ใช่ เนื่องจากไวลด์การ์ดจะจับคู่กับอักขระใดก็ได้ตั้งแต่ 0 ตัวขึ้นไป ดังนั้น "/bird/mouse" จึงจับคู่ได้ โปรดทราบว่านิพจน์เช่นนี้อาจทําให้คุณมีปัญหาได้ เนื่องจากจะจับคู่กับทุกอย่างที่อยู่หลังอักขระตัวอักษร

คําถาม: โอเปอเรเตอร์ "ตรงกับ" จะคํานึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ไหม

ได้ สมมติว่าคุณมีเงื่อนไขดังนี้

<Condition>(proxy.pathsuffix Matches "/*At")</Condition>

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat

นโยบายมีผลบังคับใช้หรือไม่ ไม่ ไวลด์การ์ดจะจับคู่ตัวอักษรใดก็ได้ (โดยไม่คำนึงถึงตัวพิมพ์เล็กหรือใหญ่) แต่ ตัวพิมพ์เล็ก "a" ไม่ตรงกับ "A"

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/bAt

นโยบายมีผลบังคับใช้หรือไม่ ใช่ ตรงกัน

คำถาม: ฉันจะกำหนดอักขระหลีกด้วยโอเปอเรเตอร์การจับคู่ได้อย่างไร

ใช้เปอร์เซ็นต์ "%" เพื่อหลีกอักขระที่สงวนไว้ เช่น

<Condition>(proxy.pathsuffix Matches "/c%*at")</Condition>

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat

นโยบายจะทำงานไหม ไม่ โอเปอเรเตอร์การจับคู่กำลังค้นหาสตริงตามตัวอักษร "c*at"

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/c*at

คำถาม:นโยบายดำเนินไปหรือไม่

ใช่ เส้นทางนี้อาจจะดูผิดปกติเล็กน้อย

JavaRegex

จะเห็นว่า "รายการที่ตรงกัน" เหมาะสำหรับสถานการณ์ง่ายๆ แต่คุณใช้โอเปอเรเตอร์อื่นได้ เช่น โอเปอเรเตอร์ "JavaRegex" หรือ "~~" 2 รายการนี้เป็นโอเปอเรเตอร์เดียวกัน ยกเว้น JavaRegex ที่ถือว่าอ่านง่ายกว่า เรียกเช่นนี้เนื่องจากอนุญาตให้จับคู่รูปแบบนิพจน์ทั่วไป และ Edge เป็นไปตามกฎเดียวกับคลาสในแพ็กเกจ java.util.regex ในภาษา Java การทำงานของโอเปอเรเตอร์ JavaRegex แตกต่างจากโอเปอเรเตอร์การจับคู่อย่างมาก คุณจึงต้องไม่สับสนระหว่าง 2 อย่างนี้

สรุป: โอเปอเรเตอร์ "JavaRegex" ช่วยให้คุณใช้ไวยากรณ์นิพจน์ทั่วไปในเงื่อนไข

โค้ดต่อไปนี้แสดงเงื่อนไขขั้นตอน ระบบจะเรียกใช้นโยบาย SomePolicy หากเงื่อนไขประเมินเป็น "จริง" ในตัวอย่างนี้ เราทดสอบตัวแปร proxy.pathsuffix ซึ่งเป็นตัวแปร ใน Edge ที่จัดเก็บส่วนต่อท้ายเส้นทางของคำขอ หากเส้นทางฐานของคำขอขาเข้าคือ /animals และคำขอคือ /animals/cat นามสกุลเส้นทางจะเป็นสตริง "/cat"

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>(proxy.pathsuffix JavaRegex "/cat")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

คําถาม: ส่วนต่อท้ายเส้นทางพร็อกซีใดที่จะทําให้ SomePolicy ทำงาน เช่นเดียวกับโอเปอเรเตอร์ "ตรงกับ" ในกรณีนี้จะมีเพียง 1 รูปแบบเท่านั้น

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat

นโยบายมีผลบังคับใช้หรือไม่ ใช่ เนื่องจากส่วนต่อท้ายเส้นทางพร็อกซีตรงกับ "/cat" อย่างสมบูรณ์ การดำเนินการจะไม่ทำงานหากส่วนต่อท้ายคือ /bat หรือ /dog หรืออย่างอื่น

ตอนนี้มาสร้างนิพจน์ทั่วไปโดยใช้ตัวระบุจํานวน "*" ตัวระบุนี้ตรงกับ 0 หรือ ของอักขระนำหน้ามากขึ้น

<Condition>(proxy.pathsuffix JavaRegex "/c*t")</Condition>

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat

นโยบายจะทำงานไหม ไม่เอาด้วยหรอก เครื่องหมาย "*" ตัวระบุค่าตรงกับค่า ก่อนหน้า อักขระ ซึ่งก็คือ "c"

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/ccccct

นโยบายมีผลบังคับใช้หรือไม่ ใช่ เนื่องจากไวลด์การ์ดตรงกับค่านำหน้า 0 หรืออย่างน้อย 1 รายการ อักขระ

ถัดไป เราใช้ตัวขยาย "?" ซึ่งจะจับคู่กับอักขระก่อนหน้า 1 ครั้งหรือไม่จับคู่เลยก็ได้

<Condition>(proxy.pathsuffix JavaRegex "/ca?t")</Condition>

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat

นโยบายจะทำงานไหม ได้ "?" ตัวคั่นตรงกับ 0 หรือ 1 รายการ อักขระนำหน้า ซึ่งก็คือ "a"

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/ct

นโยบายจะทำงานไหม ได้ "?" ตัวคั่นตรงกับ 1 หรือ ไม่มีอักขระนำหน้า ในกรณีนี้ จะไม่มี "a" ดังนั้น จะได้รับผลเป็น "จริง"

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/caat

นโยบายมีผลบังคับใช้หรือไม่ ไม่ได้ คำสั่ง "?" ตัวระบุค่าตรงกับ 1 จากค่าก่อนหน้า ซึ่งก็คือ "a"

ต่อไป เราใช้ "[abc]" หรือ "การจัดกลุ่ม" ของนิพจน์นิพจน์ทั่วไป โดยจะจับคู่กับอักขระ "a" หรือ "b" หรือ "c"

<Condition>(proxy.pathsuffix JavaRegex "/[cbr]at")</Condition>

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat

นโยบายมีผลบังคับใช้หรือไม่ ได้ เราจะใช้นิพจน์ทั่วไปที่นี่ และ "[cbr]" นิพจน์จะจับคู่กับ "c", "b", OR "r" การเรียกเหล่านี้ยังตรงกับ:

GET http://artomatic-test.apigee.net/matchtest/bat

GET http://artomatic-test.apigee.net/matchtest/rat

แต่นี่ไม่ใช่ข้อมูลที่ตรงกัน:

GET http://artomatic-test.apigee.net/matchtest/mat

คำถาม: โอเปอเรเตอร์ JavaRegex พิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่หรือไม่

ได้ สมมติว่าคุณมีเงื่อนไขดังนี้

<Condition>(proxy.pathsuffix JavaRegex "/ca?t")</Condition>

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat

นโยบายมีผลบังคับใช้หรือไม่ ใช่ regex จะจับคู่อักขระที่นำหน้า 0 หรือ 1 ตัว ซึ่ง คือ "a"

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cAt

คำถาม: นโยบายทำงานหรือไม่

ไม่ เนื่องจาก "A" ตัวพิมพ์ใหญ่ไม่ตรงกับ "a" ตัวพิมพ์เล็ก

MatchesPath

และระบุโอเปอเรเตอร์ MatchesPath เช่นนี้ "~/" ได้เช่นกัน ดูเหมือนคุณจะ Matches (~) และโอเปอเรเตอร์ JavaRegex (~~) แต่ MatchesPath นั้นแตกต่างอย่างสิ้นเชิง

โปรดทราบว่าโอเปอเรเตอร์นี้จะพิจารณาเส้นทางเป็นชุดของชิ้นส่วน ดังนั้น หากเส้นทาง คือ /animals/cats/wild ให้ลองคิดว่าเส้นทางประกอบด้วยส่วนต่างๆ "/animals" "/cats" และ "/wild"

โอเปอเรเตอร์ MatchesPath ช่วยให้คุณสามารถใช้สัญลักษณ์ไวลด์การ์ดได้ 2 ชุด ได้แก่ เครื่องหมายดอกจัน (*) 1 ตัว และ ดอกจันคู่ (**) เครื่องหมายดอกจันเดียวตรงกับองค์ประกอบของเส้นทาง 1 รายการ เครื่องหมายดอกจันคู่จะจับคู่กับองค์ประกอบเส้นทางอย่างน้อย 1 รายการ

มาดูตัวอย่างกัน ในตัวอย่างนี้ เราจะทดสอบตัวแปร proxy.pathsuffix ซึ่งเป็นตัวแปรในตัวของ Edge ที่เก็บส่วนต่อท้ายของเส้นทางของคําขอ อย่างไรก็ตาม โปรดทราบว่าคุณสามารถทดสอบค่าของตัวแปรการไหลที่มีสตริงได้

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>(proxy.pathsuffix MatchesPath "/animals/*")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

คำถาม: คำต่อท้ายเส้นทางพร็อกซีใดที่จะทำให้ SomePolicy ทำงาน

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/animals

คำถาม: นโยบายทำงานได้หรือไม่

ไม่ได้ เนื่องจากเงื่อนไขต้องใช้องค์ประกอบเส้นทางอื่นหลังจาก "/animals" ตามที่ระบุโดย "/*"

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/animals/

นโยบายจะทำงานไหม ใช่ เส้นทางมีองค์ประกอบเส้นทางอื่น (ส่วนที่อยู่หลัง "/animals/") แต่เว้นว่างไว้

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/animals/cats

นโยบายจะทำงานไหม ใช่ เนื่องจากเส้นทางมีองค์ประกอบ ("/cats") ที่ตามหลัง "/animals" อย่างชัดเจน

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild

คำถาม: นโยบายทำงานได้หรือไม่

ไม่ เนื่องจากเครื่องหมายดอกจันดอกเดียวตรงกับองค์ประกอบเส้นทางเพียงองค์ประกอบเดียวเท่านั้น และ API นี้มีมากกว่า 1 องค์ประกอบต่อจาก "/animals"

ต่อไปเราจะใช้เครื่องหมายดอกจันคู่ ดังนี้

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>(proxy.pathsuffix MatchesPath "/animals/**")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

คําถาม: คำต่อท้ายเส้นทางพร็อกซีใดที่จะทำให้ SomePolicy ทำงาน

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/animals

นโยบายจะทำงานไหม ไม่ เนื่องจากเงื่อนไขต้องมีองค์ประกอบเส้นทางต่อไปนี้อย่างน้อย 1 รายการ ระบุโดย "/**"

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/animals/

นโยบายดำเนินงานหรือไม่

ใช่ เส้นทางมีองค์ประกอบเส้นทางอื่น (ส่วนที่อยู่หลัง "/animals/") แต่ว่างเปล่า

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/animals/cats

นโยบายดำเนินงานหรือไม่

ใช่ เนื่องจากเส้นทางมีองค์ประกอบอย่างน้อย 1 อย่างที่ตามหลัง "/animals"

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild

นโยบายมีผลบังคับใช้ไหม

ใช่ เนื่องจากเส้นทางมีองค์ประกอบมากกว่า 1 องค์ประกอบที่ตามหลัง "/animals"

ผสมเครื่องหมายดอกจัน

คุณสามารถใช้เครื่องหมายดอกจัน (*) เดี่ยว (*) และคู่ (**) ร่วมกันเพื่อปรับแต่ง การจับคู่เส้นทาง

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>(proxy.pathsuffix MatchesPath "/animals/*/wild/**")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

การเรียก API:

การเรียก API ทั้งหมดเหล่านี้จะให้ผลลัพธ์ที่ตรงกัน

GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild/

และ

GET http://artomatic-test.apigee.net/matchtest/animals/dogs/wild/austrailian

และ

GET http://artomatic-test.apigee.net/matchtest/animals/birds/wild/american/finches

ทรัพยากร API

บริการ RESTful คือคอลเล็กชันของทรัพยากร API ทรัพยากร API คือส่วนของเส้นทาง URI ที่ระบุเอนทิตีบางอย่างที่นักพัฒนาแอปเข้าถึงได้โดยการเรียก API ของคุณ ตัวอย่างเช่น หากบริการของคุณให้รายงานสภาพอากาศและการพยากรณ์อากาศ บริการแบ็กเอนด์อาจกำหนดแหล่งข้อมูล API 2 รายการดังนี้

  • http://mygreatweatherforecast.com/reports
  • http://mygreatweatherforecast.com/forecasts

เมื่อสร้างพร็อกซี API (ตามที่แสดงในหัวข้อสร้างพร็อกซี API รายการแรก) คุณกำลังสร้าง URL ฐานของอีเมลแทนที่ซึ่งแมปกับบริการแบ็กเอนด์เป็นอย่างน้อย เช่น

URL พื้นฐานของแบ็กเอนด์ URL พร็อกซี API ใหม่/ที่เทียบเท่า
http://mygreatweatherforecast.com http://{your_org}-{environment}.apigee.net/mygreatweatherforecast

ในจุดนี้ คุณสามารถเรียก API ไปยังแบ็กเอนด์โดยใช้ URL พื้นฐานใดก็ได้ แต่เมื่อคุณใช้ URL พร็อกซี API สิ่งต่างๆ ก็เริ่มน่าสนใจขึ้น

นอกจากข้อมูลวิเคราะห์ API ที่ Edge เริ่มรวบรวมเมื่อคุณใช้พร็อกซี API แล้ว พร็อกซียังให้คุณกําหนดโฟลว์แบบมีเงื่อนไขซึ่งแมปกับทรัพยากรในแบ็กเอนด์ได้ด้วย ตามหลักแล้ว "ถ้า เมื่อมีการเรียก GET เข้ามาในทรัพยากร /reports Edge ควรทำบางอย่าง"

รูปภาพต่อไปนี้แสดงความแตกต่างของลักษณะการทำงานระหว่าง URL 2 รายการซึ่งท้ายที่สุดแล้ว แบ็กเอนด์เดียวกัน URL หนึ่งคือ URL ของทรัพยากรที่ไม่ผ่านพร็อกซี ส่วนอีก URL คือพร็อกซี Edge API ที่มีโฟลว์แบบมีเงื่อนไขไปยังทรัพยากรแบ็กเอนด์เดียวกัน เราจะอธิบายโฟลว์แบบมีเงื่อนไขอย่างละเอียดด้านล่าง

วิธีที่พร็อกซี API เชื่อมโยงกับทรัพยากรแบ็กเอนด์ที่เฉพาะเจาะจง

เมื่อ URL ของพร็อกซี API แมปกับ URL พื้นฐานของบริการแบ็กเอนด์ (เมื่อคุณสร้างพร็อกซี) คุณจะเพิ่มโฟลว์แบบมีเงื่อนไขไปยังทรัพยากรที่เฉพาะเจาะจงได้ เช่น ทรัพยากร /reports และ /forecasts ที่กล่าวถึงก่อนหน้านี้

สมมติว่าคุณต้องการให้ Edge "ดําเนินการบางอย่าง" เมื่อมีการโทรเข้ามาที่ทรัพยากร /reports หรือ /forecasts ตอนนี้คุณไม่ได้บอก Edge สิ่งที่ต้องทำ เพียงแต่ควรคอยฟังการเรียกไปยังทรัพยากรเหล่านั้น ซึ่งทำได้โดยใช้เงื่อนไข ในพร็อกซี Edge API คุณสามารถสร้างโฟลว์แบบมีเงื่อนไขสําหรับ /reports และ /forecasts ตัวอย่าง XML พร็อกซีของ API ต่อไปนี้แสดงลักษณะที่เงื่อนไขเหล่านั้นอาจมี

<Flows>
    <Flow name="reports">
        <Description/>
        <Request/>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/reports") and (request.verb = "GET")</Condition>
    </Flow>
    <Flow name="forecasts">
        <Description/>
        <Request/>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/forecasts") and (request.verb = "GET")</Condition>
    </Flow>
</Flows>

เงื่อนไขเหล่านั้นระบุว่า "เมื่อได้รับคําขอ GET ที่มี /reports และ /forecasts ใน URL แล้ว Edge จะทําตามที่คุณ (นักพัฒนา API) บอกผ่านนโยบายที่แนบมากับโฟลว์เหล่านั้น

ต่อไปนี้เป็นตัวอย่างการบอก Edge ว่าต้องทําอะไรเมื่อเป็นไปตามเงื่อนไข ใน XML พร็อกซีของ API ต่อไปนี้ เมื่อส่งคำขอ GET ไปยัง https://yourorg-test.apigee.net/mygreatweatherforecast/reports แล้ว Edge จะดำเนินการตามนโยบาย "XML-to-JSON-1" ในการตอบกลับ

<Flows>
    <Flow name="reports">
        <Description/>
        <Request/>
        <Response>
            <Step>
                <Name>XML-to-JSON-1</Name>
            </Step>
        </Response>
        <Condition>(proxy.pathsuffix MatchesPath "/reports") and (request.verb = "GET")</Condition>
</Flow>

นอกจากโฟลว์แบบมีเงื่อนไขที่ไม่บังคับแล้ว พารามิเตอร์การเรียก API แต่ละรายการยังมีโฟลว์เริ่มต้น 2 รายการด้วย ได้แก่ <PreFlow> ที่ทำงานก่อนโฟลว์แบบมีเงื่อนไข และ <PostFlow> ที่ทำงานหลังโฟลว์แบบมีเงื่อนไข สิ่งเหล่านี้มีประโยชน์สำหรับ บังคับใช้นโยบายเมื่อมีการเรียกใช้พร็อกซี API ใดก็ตาม เช่น หากคุณต้องการ ยืนยันคีย์ API ของแอปทุกครั้งที่เรียก ไม่ว่าจะมีการเข้าถึงทรัพยากรแบ็กเอนด์ใด สามารถวางนโยบายคีย์ API ของ "ยืนยัน" ใน <PreFlow> ได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับขั้นตอนได้ที่ การกำหนดค่าขั้นตอน

สร้างโฟลว์แบบมีเงื่อนไขไปยังทรัพยากรแบ็กเอนด์

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

โดยคุณจะทำสิ่งต่อไปนี้ได้

  • นำการจัดการไปใช้ในลักษณะที่สอดคล้องกับความหมายของโมเดล API ของคุณ
  • ใช้นโยบายและลักษณะการทำงานที่มีสคริปต์กับเส้นทางทรัพยากร (URI) แต่ละรายการ
  • รวบรวมเมตริกแบบละเอียดสำหรับบริการ Analytics

ตัวอย่างเช่น สมมติว่าคุณต้องนำตรรกะประเภทต่างๆ ไปใช้กับแบ็กเอนด์จาก /developers ไปยังทรัพยากร /apps

โดยเพิ่มโฟลว์แบบมีเงื่อนไข 2 รายการในพร็อกซี API ได้แก่ /developers และ /apps

ในมุมมองการพัฒนาของแผง Navigator ของเครื่องมือแก้ไขพร็อกซี API ให้คลิกไอคอน + ถัดจากค่าเริ่มต้นในปลายทางของพร็อกซี

ในหน้าต่าง "โฟลว์แบบมีเงื่อนไขใหม่" ให้ป้อนการกําหนดค่าคีย์ต่อไปนี้

  • ชื่อขั้นตอน: นักพัฒนาแอป
  • ประเภทเงื่อนไข: เส้นทาง
  • เส้นทาง: /developers

ระบบจะทริกเกอร์เงื่อนไข (และจะมีการบังคับใช้นโยบาย) หากมีการส่งการเรียกใช้ไปยังพร็อกซี กับ /developers ที่ส่วนท้ายของ URI

ตอนนี้ให้เพิ่มขั้นตอนแบบมีเงื่อนไขสําหรับ /apps และสมมติว่าคุณต้องการให้ระบบเรียกให้แสดงเงื่อนไข ทั้ง URI และกริยา POST ในคำขอ การกำหนดค่าเกี่ยวข้องกับการตั้งค่าต่อไปนี้

  • ชื่อโฟลว์: แอป
  • ประเภทเงื่อนไข: เส้นทางและคำกริยา
  • เส้นทาง: /apps
  • กริยา: POST

ระบบจะทริกเกอร์เงื่อนไข (และดำเนินการตามนโยบาย) หากมีการส่งการเรียกไปยังพร็อกซีที่มี /apps ต่อท้าย URI และคำกริยา POST

ในแผงการนำทาง คุณจะเห็นขั้นตอนใหม่สำหรับแอป และ นักพัฒนาแอป

เลือกขั้นตอนใดขั้นตอนหนึ่งเพื่อดูการกำหนดค่าโฟลว์แบบมีเงื่อนไขในเครื่องมือแก้ไขพร็อกซี API มุมมองโค้ด:

<Flow name="Apps">
    <Description>Developer apps registered in Developer Services</Description>
    <Request/>
    <Response/>
    <Condition>(proxy.pathsuffix MatchesPath "/apps") and (request.verb = "POST")</Condition>
</Flow>

ดังที่คุณเห็น ทรัพยากร API เป็นเพียงโฟลว์แบบมีเงื่อนไขที่ประเมินเส้นทาง URI ของคำขอขาเข้า (ตัวแปร proxy.pathsuffix จะระบุ URI ของคำขอที่ตามหลัง BasePath ที่กําหนดค่าในการกําหนดค่า ProxyEndpoint)

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

เมื่อคุณทำให้พร็อกซี API ใช้งานได้ในสภาพแวดล้อมการทดสอบแล้ว คำขอต่อไปนี้

http://{org_name}-test.apigee.net/{proxy_path}/apps

จะทำให้เงื่อนไขประเมินเป็น "จริง" และขั้นตอนนี้ รวมถึง ที่จะดำเนินการ

ตัวอย่างเงื่อนไขต่อไปนี้ใช้นิพจน์ทั่วไปของ Java เพื่อจดจำการเรียกใช้ทรัพยากร /apps ที่มีหรือไม่มีเครื่องหมายทับ (/apps หรือ /apps/**) ต่อท้าย

<Condition>(proxy.pathsuffix JavaRegex "/apps(/?)") and (request.verb = "POST")</Condition>

ดูข้อมูลเพิ่มเติมเกี่ยวกับเงื่อนไขประเภทนี้ได้ในวิธีจับคู่โดยไม่คำนึงถึง ... ในชุมชน Apigee

การประมาณ URI แบบลําดับชั้น

ในบางกรณี คุณจะมีทรัพยากร API แบบลำดับชั้น เช่น บริการสําหรับนักพัฒนาแอป API มีวิธีการแสดงแอปทั้งหมดที่เป็นของนักพัฒนาแอป เส้นทาง URI คือ

/developers/{developer_email}/apps

คุณอาจมีทรัพยากรที่สร้างรหัสที่ไม่ซ้ำกันสำหรับเอนทิตีแต่ละรายการในคอลเล็กชัน ซึ่งบางครั้งจะมีการกำกับเนื้อหาไว้ดังนี้

/genus/:id/species

เส้นทางนี้นำไปใช้กับ URI 2 รายการต่อไปนี้ได้เท่ากัน

/genus/18904/species
/genus/17908/species

คุณใช้ไวลด์การ์ดเพื่อแสดงโครงสร้างนี้ในทรัพยากร API ได้ เช่น

/developers/*/apps
/developers/*example.com/apps
/genus/*/species

จะแปลง URI แบบลําดับชั้นเหล่านี้เป็นทรัพยากร API อย่างเหมาะสม

ในบางกรณี โดยเฉพาะสำหรับ API ที่มีลําดับชั้นลึก คุณอาจต้องการแก้ไขทุกอย่างที่อยู่ด้านล่างของ URI บางส่วน โดยให้ใช้ไวลด์การ์ดเครื่องหมายดอกจันคู่ในคำจำกัดความทรัพยากร ตัวอย่างเช่น หากคุณกําหนดทรัพยากร API ต่อไปนี้
/developers/**

ทรัพยากร API นั้นจะแก้ไขเส้นทาง URI ต่อไปนี้

/developers/{developer_email}/apps
/developers/{developer_email}/keys
/developers/{developer_email}/apps/{app_id}/keys

เงื่อนไขของโฟลว์แบบมีเงื่อนไขจะมีลักษณะดังนี้ในคําจํากัดความของพร็อกซี API

<Condition>(proxy.pathsuffix MatchesPath "/developers/**") and (request.verb = "POST")</Condition>

ตัวอย่างเพิ่มเติม

เงื่อนไขที่แนบมากับ RouteRule

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

เงื่อนไขที่แนบมากับนโยบาย

<Step>
<!--the policy MaintenancePolicy only executes if the response status code is exactly 503-->
  <Condition>response.status.code = 503</Condition>
  <Name>MaintenancePolicy</Name>
</Step>

โฟลว์แบบมีเงื่อนไข

<!-- this entire flow is executed only if the request verb is a GET-->
<Flow name="GetRequests">
  <Condition>request.verb="GET"</Condition>
  <Request>
    <Step>
<!-- this policy only executes if request path includes a term like statues-->
<Condition>request.path ~ "/statuses/**"</Condition>
      <Name>StatusesRequestPolicy</Name>
    </Step>
  </Request>
  <Response>
    <Step>
<!-- this condition has multiple expressions. The policy executes if the response code status is exactly 503 or 400-->
<Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
      <Name>MaintenancePolicy</Name>
    </Step>
  </Response>
</Flow>

ตัวอย่างโอเปอเรเตอร์ในเงื่อนไข

ตัวอย่างโอเปอเรเตอร์ที่ใช้สร้างเงื่อนไขมีดังนี้

  • request.header.content-type = "text/xml"
  • request.header.content-length < 4096 && request.verb = "PUT"
  • response.status.code = 404 || response.status.code = 500
  • request.uri MatchesPath "/*/statuses/**"
  • request.queryparam.q0 NotEquals 10

ตัวอย่างที่นำไปใช้ได้จริง: ละเว้น "/" ที่ จุดสิ้นสุดของเส้นทาง

โดยทั่วไปแล้วนักพัฒนา Edge ต้องการจัดการคำต่อท้ายเส้นทางทั้ง 2 รายการนี้: "/cat" และ "/cat/" เนื่องจากผู้ใช้หรือไคลเอ็นต์บางรายอาจเรียกใช้ API ของคุณโดยมีส่วนเสริม เครื่องหมายทับที่จุดสิ้นสุดของเส้นทาง และคุณต้องสามารถจัดการสิ่งเหล่านี้ได้ในแบบมีเงื่อนไข ข้อความ กรณีการใช้งานที่แน่นอน ในชุมชน Apigee

หากต้องการ ก็ทำได้โดยไม่ต้องใช้นิพจน์ทั่วไปดังนี้

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>((proxy.pathsuffix = "/cat") OR (proxy.pathsuffix = "/cat/")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

นี่เป็นตัวเลือกที่ดี ชัดเจนและอ่านได้

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

<Condition>(proxy.pathsuffix JavaRegex "/cat(/?)"</Condition>

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat
or

GET http://artomatic-test.apigee.net/matchtest/cat/

นโยบายมีผลบังคับใช้หรือไม่ ได้ โปรดทราบว่าในนิพจน์ทั่วไป อักขระ "?" หมายถึงตรงกับอักขระก่อนหน้า 0 หรือ 1 ตัว ดังนั้น "/cat" และ "/cat/" เป็นรายการที่ตรงกัน

การเรียก API:

GET http://artomatic-test.apigee.net/matchtest/cat/spotted

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

การจับคู่สตริงที่กำหนดเองกับ JavaRegex

ตัวอย่างทั้งหมดในหัวข้อนี้จะแสดงวิธีจับคู่ตัวแปรการไหลในตัวอย่างใดอย่างหนึ่งต่อไปนี้ proxy.pathsuffix การที่คุณสามารถจับคู่รูปแบบกับสตริงที่กำหนดเองใดๆ หรือ โฟลว์ ตัวแปรโฟลว์ ที่เป็นตัวแปรโฟลว์ในตัว เช่น session.pathsuffix หรือไม่

ตัวอย่างเช่น หากคุณมีเงื่อนไขที่ทดสอบสตริงที่กําหนดเอง อาจมีสตริงที่แสดงขึ้นมา ในเพย์โหลดแบ็กเอนด์ หรือสตริงที่แสดงผลจากการค้นหาเซิร์ฟเวอร์การตรวจสอบสิทธิ์ คุณสามารถใช้ ที่ตรงกันเพื่อทดสอบ หากคุณใช้ JavaRegex ระบบจะเปรียบเทียบนิพจน์ทั่วไปกับสตริงเรื่องทั้งหมด หากเรื่องคือ "abc" และนิพจน์ทั่วไปคือ "[a-z]" ไม่พบรายการที่ตรงกัน เนื่องจาก "[a-z]" ตรงกับอักขระอัลฟ่า1 ตัวพอดี นิพจน์ "[a-z]+" จะใช้งานได้ เช่นเดียวกับ "[a-z]*" และ "[a-z]{3}

มาดูตัวอย่างที่เป็นรูปธรรมกัน สมมติว่าเซิร์ฟเวอร์การตรวจสอบสิทธิ์ส่งคืนรายการบทบาทเป็น สตริงที่คั่นด้วยเครื่องหมายจุลภาค เช่น "ผู้แก้ไข ผู้เขียน ผู้มาเยือน"

หากต้องการทดสอบการแสดงบทบาทผู้แก้ไข การสร้างนี้จะไม่ทำงาน เนื่องจาก "ผู้แก้ไข" เท่ากับ เพียงบางส่วนของสตริงทั้งหมด

<Condition>returned_roles ~~ "editor"</Condition>

แต่รูปแบบนี้จะใช้ได้

<Condition>returned_roles ~~ ".*\beditor\b.*")</Condition>

ซึ่งได้ผลเพราะจะพิจารณาการแบ่งคำและส่วนอื่นๆ ของสตริงที่มี .* คำนำหน้าและคำต่อท้าย

ในตัวอย่างนี้ คุณยังสามารถทดสอบ "ตัวแก้ไข" ด้วยโอเปอเรเตอร์การจับคู่

<Condition>returned_roles ~~ "*editor*")</Condition>

อย่างไรก็ตาม ในกรณีที่คุณต้องการความแม่นยำมากขึ้น JavaRegex มักเป็นตัวเลือกที่ดีกว่า

การใช้เครื่องหมายคำพูดคู่แบบ Escape ในนิพจน์ JavaRegex

ไวยากรณ์เงื่อนไขต้องมีนิพจน์ JavaRegex เพื่อรวมในเครื่องหมายคำพูดคู่ ดังนั้นหากคุณมี นิพจน์นิพจน์ทั่วไปที่มีเครื่องหมายคำพูดคู่ คุณต้องใช้วิธีอื่นในการจับคู่ คำตอบคือ Unicode ตัวอย่างเช่น สมมติว่าคุณส่งส่วนหัวที่มีเครื่องหมายคำพูดคู่ ดังนี้
 -H 'content-type:multipart/related; type="application/xop+xml"'
หากคุณพยายามจับคู่ส่วนหัวนั้นในเงื่อนไขนิพจน์ทั่วไป คุณจะได้รับข้อผิดพลาด "เงื่อนไขไม่ถูกต้อง" เนื่องจากนิพจน์ มีเครื่องหมายคำพูดคู่
request.header.Content-Type ~~ "(multipart\/related)(; *type="application\/xop\+xml\")"
โซลูชันคือการแทนที่เครื่องหมายคำพูดคู่แบบ ASCII ด้วย \u0022 ที่เทียบเท่า Unicode ตัวอย่างเช่น นิพจน์ต่อไปนี้ถูกต้องและแสดงผลลัพธ์ตามที่คาดไว้
request.header.Content-Type ~~ "(multipart\/related)(; *type=\u0022application\/xop\+xml\u0022)"