आपको Apigee Edge का दस्तावेज़ दिख रहा है.
Apigee X के दस्तावेज़ पर जाएं. जानकारी
शर्तों की मदद से, एपीआई प्रॉक्सी को रनटाइम के दौरान डाइनैमिक तरीके से काम करने की सुविधा मिलती है. शर्तें, वैरिएबल पर होने वाले ऑपरेशनों को तय करती हैं. इनका आकलन Apigee Edge प्रोसेसिंग पाइपलाइन करती है. शर्त वाले स्टेटमेंट, बूलियन होते हैं. इनका आकलन हमेशा true या false के तौर पर किया जाता है.
शर्तों के बारे में खास जानकारी
इस सेक्शन में बताया गया है कि Edge में शर्त के आधार पर काम करने वाले स्टेटमेंट का इस्तेमाल कैसे और कहां किया जा सकता है. इसके अलावा, यहां दिए गए सेक्शन में सिंटैक्स के बारे में बताया गया है:
कंडिशनल स्टेटमेंट का स्ट्रक्चर
कंडिशनल स्टेटमेंट का बुनियादी स्ट्रक्चर यह है:
<Condition>variable.name operator "value"</Condition>
उदाहरण के लिए:
<Condition>request.verb = "GET"</Condition>
एक साथ कई शर्तें लागू करने के लिए, उन्हें AND ऑपरेटर के साथ जोड़ा जा सकता है. उदाहरण के लिए, यहां दी गई शर्तें true के तौर पर तब ही काम करती हैं, जब अनुरोध का यूआरआई /statuses से मेल खाता हो और अनुरोध का एचटीटीपी वर्ब GET हो:
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
शर्तों के आधार पर स्टेटमेंट का इस्तेमाल कहाँ किया जा सकता है
इनमें शर्तों का इस्तेमाल करके, व्यवहार को कंट्रोल किया जा सकता है:
नीति लागू करना
शर्तों वाले स्टेटमेंट का इस्तेमाल करके, नीतियों को लागू करने की प्रोसेस को कंट्रोल किया जा सकता है. इसका इस्तेमाल आम तौर पर, एचटीटीपी हेडर या मैसेज के कॉन्टेंट के आधार पर, जवाब के मैसेज को शर्तों के हिसाब से बदलने के लिए किया जाता है.
यहां दिए गए उदाहरण में, Accept हेडर के आधार पर, एक्सएमएल को JSON में बदला गया है:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
फ़्लो का एक्ज़ीक्यूशन
शर्तों के आधार पर स्टेटमेंट का इस्तेमाल करके, ProxyEndpoints और TargetEndpoints में नाम वाले फ़्लो के एक्ज़ीक्यूशन को कंट्रोल किया जा सकता है. ध्यान दें कि सिर्फ़ 'नाम वाले' फ़्लो को शर्त के हिसाब से लागू किया जा सकता है. ProxyEndpoints और TargetEndpoints पर प्रीफ़्लो और पोस्टफ़्लो (अनुरोध और जवाब, दोनों) हर ट्रांजै़क्शन के लिए लागू होते हैं. इसलिए, ये बिना किसी शर्त के 'फ़ेलसेफ़' सुविधाएं देते हैं.
उदाहरण के लिए, अनुरोध के एचटीटीपी वर्ब के आधार पर, शर्त के साथ अनुरोध करने का फ़्लो और गड़बड़ी दिखाने वाले (संभावित) एचटीटीपी स्टेटस कोड के आधार पर, शर्त के साथ जवाब देने का फ़्लो लागू करने के लिए:
<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>टारगेट एंडपॉइंट का रूट चुनना
शर्तों वाले स्टेटमेंट का इस्तेमाल करके, प्रॉक्सी एंडपॉइंट कॉन्फ़िगरेशन से शुरू किए गए टारगेट एंडपॉइंट को कंट्रोल किया जा सकता है. रूट करने का नियम, किसी अनुरोध को किसी खास टारगेट एंडपॉइंट पर फ़ॉरवर्ड करता है. एक से ज़्यादा टारगेट एंडपॉइंट उपलब्ध होने पर, रूट के नियम का आकलन उसकी शर्त के लिए किया जाता है. अगर शर्त सही होती है, तो अनुरोध को नाम वाले टारगेट एंडपॉइंट पर फ़ॉरवर्ड कर दिया जाता है.
उदाहरण के लिए, 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>ज़्यादा जानकारी के लिए, फ़्लो वैरिएबल और शर्तें देखें.
पाथ एक्सप्रेशन
पाथ एक्सप्रेशन का इस्तेमाल, यूआरआई पाथ को मैच करने के लिए किया जाता है. इसमें "*" का इस्तेमाल, एक पाथ एलिमेंट को दिखाने के लिए किया जाता है. वहीं, "**" का इस्तेमाल, एक से ज़्यादा यूआरआई लेवल को दिखाने के लिए किया जाता है.
उदाहरण के लिए:
| पैटर्न | मिलते-जुलते यूआरआई पाथ के उदाहरण |
|---|---|
/*/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 precedence का इस्तेमाल किया जाता है.
- Apigee Edge,
java.util.regexमें लागू किए गए रेगुलर एक्सप्रेशन पर निर्भर करता है.
यहां दी गई टेबल में, इस्तेमाल किए जा सकने वाले ऑपरेटर की सूची दी गई है. अपने एक्सप्रेशन में, सिंबल या शब्द का इस्तेमाल किया जा सकता है:
| चिह्न | Word | ब्यौरा |
|---|---|---|
! |
Not, not |
यूनरी ऑपरेटर (एक इनपुट लेता है) |
= |
Equals, Is |
इसके बराबर है (केस सेंसिटिव) |
!= |
NotEquals, IsNot |
इसके बराबर नहीं है (केस सेंसिटिव) |
:= |
EqualsCaseInsensitive |
इसके बराबर है, लेकिन केस-इनसेंसिटिव है |
> या > |
GreaterThan |
इससे ज़्यादा. Edge यूज़र इंटरफ़ेस में शर्त तय करते समय > का इस्तेमाल करने पर, इसे > में बदल दिया जाता है. |
>= या >= |
GreaterThanOrEquals |
इससे ज़्यादा या इसके बराबर. Edge UI में शर्त तय करते समय >= का इस्तेमाल करने पर, इसे >= में बदल दिया जाता है. |
< |
LesserThan |
इससे कम. Edge यूज़र इंटरफ़ेस (यूआई), < को स्वीकार नहीं करता. |
<= |
LesserThanOrEquals |
इससे कम या इसके बराबर. Edge यूज़र इंटरफ़ेस (यूआई), <= लिटरल के साथ काम नहीं करता. |
&& |
And, and |
और |
|| |
Or |
'या' ऑपरेटर केस-सेंसिटिव नहीं होता. उदाहरण के लिए, OR, Or, और or, ये सभी मान्य हैं. |
() |
किसी एक्सप्रेशन को ग्रुप करता है. ( से एक्सप्रेशन खुलता है और ) से बंद होता है. |
|
~~ |
JavaRegex |
|
~ |
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)
इन मामलों में, सिस्टम यहां दी गई टेबल में दिखाए गए बदलाव करता है. इसमें आरएचएस का मतलब समीकरण के दाईं ओर और एलएचएस का मतलब बाईं ओर है:
| आरएचएस एलएचएस | बूलियन | पूर्णांक | लंबा | फ़्लोट | डबल | स्ट्रिंग | दूसरे कैंपेन से तुलना की जा सकती है | ऑब्जेक्ट |
|---|---|---|---|---|---|---|---|---|
| बूलियन | बूलियन | पूर्णांक | लंबा | फ़्लोट | डबल | स्ट्रिंग | - | |
| पूर्णांक | पूर्णांक | पूर्णांक | लंबा | फ़्लोट | डबल | स्ट्रिंग | दूसरे कैंपेन से तुलना की जा सकती है | - |
| लंबा | लंबा | लंबा | लंबा | फ़्लोट | डबल | स्ट्रिंग | दूसरे कैंपेन से तुलना की जा सकती है | - |
| फ़्लोट | फ़्लोट | फ़्लोट | फ़्लोट | फ़्लोट | डबल | स्ट्रिंग | दूसरे कैंपेन से तुलना की जा सकती है | - |
| डबल | डबल | डबल | डबल | डबल | डबल | स्ट्रिंग | दूसरे कैंपेन से तुलना की जा सकती है | - |
| स्ट्रिंग | स्ट्रिंग | स्ट्रिंग | स्ट्रिंग | स्ट्रिंग | स्ट्रिंग | स्ट्रिंग | दूसरे कैंपेन से तुलना की जा सकती है | - |
| दूसरे कैंपेन से तुलना की जा सकती है | दूसरे कैंपेन से तुलना की जा सकती है | दूसरे कैंपेन से तुलना की जा सकती है | दूसरे कैंपेन से तुलना की जा सकती है | दूसरे कैंपेन से तुलना की जा सकती है | दूसरे कैंपेन से तुलना की जा सकती है | दूसरे कैंपेन से तुलना की जा सकती है | दूसरे कैंपेन से तुलना की जा सकती है | - |
| ऑब्जेक्ट | - | - | - | - | - | - | - | - |
शून्य ऑपरेंड
नीचे दी गई टेबल में दिखाया गया है कि जब ऑपरेंड की बाईं ओर (एलएचएस) और/या दाईं ओर (आरएचएस) की वैल्यू शून्य होती हैं, तब शर्तें true या false के तौर पर आंकी जाती हैं:
| ऑपरेटर | LHS null | आरएचएस शून्य है | एलएचएस और आरएचएस की वैल्यू शून्य है |
|---|---|---|---|
=, ==, := |
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>