आपको Apigee Edge का दस्तावेज़ दिख रहा है.
Apigee X के दस्तावेज़ पर जाएं. जानकारी
क्या
गड़बड़ी की स्थिति में, कस्टम मैसेज जनरेट करता है. RaiseFault का इस्तेमाल करके, गड़बड़ी का ऐसा जवाब तय करें जो किसी खास स्थिति में, अनुरोध करने वाले ऐप्लिकेशन को भेजा जाता है.
गड़बड़ियों को ठीक करने के बारे में सामान्य जानकारी के लिए, गड़बड़ियों को ठीक करना लेख पढ़ें.
सैंपल
Return FaultResponse
RaiseFault नीति का इस्तेमाल, अनुरोध करने वाले ऐप्लिकेशन को कस्टम फ़ॉल्ट रिस्पॉन्स भेजने के लिए किया जाता है. उदाहरण के लिए, यह नीति बिना किसी पेलोड के 404 स्टेटस कोड दिखाएगी:
<RaiseFault name="404">
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<FaultResponse>
<Set>
<StatusCode>404</StatusCode>
<ReasonPhrase>The resource requested was not found</ReasonPhrase>
</Set>
</FaultResponse>
</RaiseFault>Return FaultResponse Payload
ज़्यादा मुश्किल उदाहरण में, एचटीटीपी हेडर और एचटीटीपी स्टेटस कोड के साथ-साथ, कस्टम फ़ॉल्ट रिस्पॉन्स पेलोड को वापस भेजना शामिल है. यहां दिए गए उदाहरण में, गड़बड़ी के रिस्पॉन्स में एक एक्सएमएल मैसेज शामिल किया गया है. इसमें Edge को बैकएंड सेवा से मिला एचटीटीपी स्टेटस कोड और गड़बड़ी का टाइप बताने वाला हेडर शामिल है:
<RaiseFault name="ExceptionHandler"> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <FaultResponse> <Set> <Payload contentType="text/xml"> <root>Please contact support@company.com</root> </Payload> <StatusCode>{response.status.code}</StatusCode> <ReasonPhrase>Server error</ReasonPhrase> </Set> <Add> <Headers> <Header name="FaultHeader">{fault.name}</Header> </Headers> </Add> </FaultResponse> </RaiseFault>
FaultResponse मैसेज में डाइनैमिक तरीके से जानकारी भरने के लिए उपलब्ध सभी वैरिएबल की सूची देखने के लिए, वैरिएबल रेफ़रंस देखें
सेवा के कॉलआउट से जुड़ी गड़बड़ियों को ठीक करना
RaiseFault नीति के बारे में जानकारी
Apigee Edge, RaiseFault टाइप की नीति का इस्तेमाल करके, कस्टम अपवाद हैंडलिंग की सुविधा देता है. RaiseFault नीति, AssignMessage नीति की तरह ही होती है. इसकी मदद से, गड़बड़ी की स्थिति में कस्टम फ़ॉल्ट रिस्पॉन्स जनरेट किया जा सकता है.
RaiseFault नीति का इस्तेमाल करके, गड़बड़ी का ऐसा जवाब तय करें जो किसी गड़बड़ी की स्थिति में, अनुरोध करने वाले ऐप्लिकेशन को भेजा जाता है. गड़बड़ी के जवाब में एचटीटीपी हेडर, क्वेरी पैरामीटर, और मैसेज पेलोड शामिल हो सकते हैं. कस्टम फ़ॉल्ट रिस्पॉन्स, ऐप्लिकेशन डेवलपर और ऐप्लिकेशन का इस्तेमाल करने वाले लोगों के लिए, सामान्य गड़बड़ी के मैसेज या एचटीटीपी रिस्पॉन्स कोड से ज़्यादा फ़ायदेमंद हो सकता है.
लागू होने पर, RaiseFault नीति, मौजूदा फ़्लो से कंट्रोल को Error फ़्लो में ट्रांसफ़र कर देती है. इसके बाद, यह फ़्लो अनुरोध करने वाले क्लाइंट ऐप्लिकेशन को तय की गई गड़बड़ी का जवाब भेजता है. जब मैसेज फ़्लो, Error फ़्लो पर स्विच होता है, तो नीति की आगे की प्रोसेसिंग नहीं होती है. प्रोसेसिंग के बाकी सभी चरणों को छोड़ दिया जाता है. साथ ही, गड़बड़ी की जानकारी देने वाला जवाब सीधे तौर पर अनुरोध करने वाले ऐप्लिकेशन को भेज दिया जाता है.
RaiseFault का इस्तेमाल ProxyEndpoint या TargetEndpoint में किया जा सकता है. आम तौर पर, RaiseFault नीति के साथ शर्त अटैच की जाती है. RaiseFault के लागू होने के बाद, Apigee सामान्य गड़बड़ी की प्रोसेस करेगा. इसमें FaultRules का आकलन करना शामिल है. अगर कोई गड़बड़ी का नियम तय नहीं किया गया है, तो यह अनुरोध की प्रोसेस को बंद कर देता है.
एलिमेंट का रेफ़रंस
इस एलिमेंट रेफ़रंस में, RaiseFault नीति के एलिमेंट और एट्रिब्यूट के बारे में बताया गया है.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <RaiseFault async="false" continueOnError="false" enabled="true" name="Raise-Fault-1"> <DisplayName>RaiseFault 1</DisplayName> <FaultResponse> <AssignVariable> <Name/> <Value/> </AssignVariable> <Add> <Headers/> </Add> <Copy source="request"> <Headers/> <StatusCode/> <ReasonPhrase/> </Copy> <Remove> <Headers/> </Remove> <Set> <Headers/> <Payload/> <ReasonPhrase/> <StatusCode/> </Set> </FaultResponse> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </RaiseFault>
<RaiseFault> एट्रिब्यूट
<RaiseFault async="false" continueOnError="false" enabled="true" name="Raise-Fault-1">
यहां दी गई टेबल में, ऐसे एट्रिब्यूट के बारे में बताया गया है जो नीति के सभी पैरंट एलिमेंट में एक जैसे होते हैं:
| एट्रिब्यूट | ब्यौरा | डिफ़ॉल्ट | मौजूदगी |
|---|---|---|---|
name |
नीति का अंदरूनी नाम. इसके अलावा, नीति को लेबल करने के लिए, |
लागू नहीं | ज़रूरी है |
continueOnError |
किसी नीति के काम न करने पर, गड़बड़ी दिखाने के लिए नीति के लागू होने के बाद भी फ़्लो को एक्ज़ीक्यूट करने के लिए, इसे |
गलत | वैकल्पिक |
enabled |
नीति को लागू करने के लिए, नीति को बंद करने के लिए, |
सही | वैकल्पिक |
async |
यह एट्रिब्यूट अब काम नहीं करता. |
गलत | बहिष्कृत |
<DisplayName> एलिमेंट
इस कॉलम में नीति को लेबल करने के लिए, name एट्रिब्यूट के साथ-साथ इस्तेमाल करें
मैनेजमेंट यूज़र इंटरफ़ेस (यूआई) प्रॉक्सी एडिटर, जिसका नाम अलग और सामान्य भाषा में है.
<DisplayName>Policy Display Name</DisplayName>
| डिफ़ॉल्ट |
लागू नहीं अगर आप इस एलिमेंट को छोड़ देते हैं, तो नीति की |
|---|---|
| मौजूदगी | वैकल्पिक |
| टाइप | स्ट्रिंग |
<IgnoreUnresolvedVariables> एलिमेंट
(ज़रूरी नहीं) इससे फ़्लो में वैरिएबल से जुड़ी किसी भी ऐसी गड़बड़ी को अनदेखा किया जाता है जिसे ठीक नहीं किया गया है. मान्य वैल्यू: true/false.
डिफ़ॉल्ट true.
<FaultResponse> एलिमेंट
(ज़रूरी नहीं) इससे अनुरोध करने वाले क्लाइंट को भेजे जाने वाले जवाब के मैसेज के बारे में पता चलता है. FaultResponse, AssignMessage नीति की तरह ही सेटिंग का इस्तेमाल करता है. यह Apigee Edge for Private Cloud में उपलब्ध नहीं है.
<FaultResponse><AssignVariable> एलिमेंट
यह फ़ंक्शन, डेस्टिनेशन फ़्लो वैरिएबल को वैल्यू असाइन करता है.
अगर फ़्लो वैरिएबल मौजूद नहीं है, तो AssignVariable इसे बनाता है.
उदाहरण के लिए, RaiseFault नीति में myFaultVar नाम के वैरिएबल को सेट करने के लिए, इस कोड का इस्तेमाल करें:
<FaultResponse>
<AssignVariable>
<Name>myFaultVar</Name>
<Value>42</Value>
</AssignVariable>
...
</FaultResponse>इसके बाद, RaiseFault नीति में मैसेज टेंप्लेट में उस वैरिएबल का इस्तेमाल किया जा सकता है. साथ ही, FaultRule से जुड़ी नीति, वैरिएबल को ऐक्सेस कर सकती है. उदाहरण के लिए, यहां दी गई AssignMessage नीति, RaiseFault में सेट किए गए वैरिएबल का इस्तेमाल करके, गड़बड़ी के रिस्पॉन्स में हेडर सेट करती है:
<AssignMessage enabled="true" name="Assign-Message-1"> <Add> <Headers> <Header name="newvar">{myFaultVar}</Header> </Headers> </Add> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
RaiseFault नीति में मौजूद <AssignVariable>, AssignMessage नीति में मौजूद <AssignVariable> एलिमेंट के सिंटैक्स का इस्तेमाल करता है. ध्यान दें कि फ़िलहाल, यह सुविधा Apigee Edge for Private Cloud में उपलब्ध नहीं है.
<FaultResponse><Add>/<Headers> एलिमेंट
यह कुकी, गड़बड़ी के मैसेज में एचटीटीपी हेडर जोड़ती है. ध्यान दें कि खाली हेडर <Add><Headers/></Add> से कोई हेडर नहीं जुड़ता. इस उदाहरण में, request.user.agent फ़्लो वैरिएबल की वैल्यू को हेडर में कॉपी किया गया है.
<Add>
<Headers>
<Header name="user-agent">{request.user.agent}</Header>
</Headers>
</Add>|
डिफ़ॉल्ट: |
लागू नहीं |
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
स्ट्रिंग |
<FaultResponse><Copy> element
यह गड़बड़ी के मैसेज में, source एट्रिब्यूट से तय किए गए मैसेज से जानकारी कॉपी करता है तक.
<Copy source="request">
<Headers/>
<StatusCode/>
<ReasonPhrase/>
</Copy>|
डिफ़ॉल्ट: |
लागू नहीं |
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
स्ट्रिंग |
विशेषताएं
<Copy source="response">
| एट्रिब्यूट | ब्यौरा | मौजूदगी | टाइप |
|---|---|---|---|
| सोर्स |
इससे कॉपी किए गए ऑब्जेक्ट के सोर्स के बारे में पता चलता है.
|
वैकल्पिक | स्ट्रिंग |
<FaultResponse><Copy>/<Headers> एलिमेंट
यह फ़ंक्शन, सोर्स से गड़बड़ी के मैसेज में बताए गए एचटीटीपी हेडर को कॉपी करता है. सभी हेडर कॉपी करने के लिए, <Copy><Headers/></Copy>. तय करें
<Copy source='request'>
<Headers>
<Header name="headerName"/>
</Headers>
</Copy>अगर एक ही नाम के कई हेडर हैं, तो इस सिंटैक्स का इस्तेमाल करें:
<Copy source='request'>
<Headers>
<Header name="h1"/>
<Header name="h2"/>
<Header name="h3.2"/>
</Headers>
</Copy>इस उदाहरण में, "h1", "h2", और "h3" की दूसरी वैल्यू कॉपी की गई है. अगर "h3" में सिर्फ़ एक वैल्यू है, तो उसे कॉपी नहीं किया जाता.
|
डिफ़ॉल्ट: |
लागू नहीं |
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
स्ट्रिंग |
<FaultResponse><Copy>/<StatusCode> element
यह एचटीटीपी स्टेटस कोड, सोर्स एट्रिब्यूट से तय किए गए ऑब्जेक्ट से गड़बड़ी के मैसेज में कॉपी किया जाता है.
<Copy source='response'>
<StatusCode>404</StatusCode>
</Copy>|
डिफ़ॉल्ट: |
गलत |
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
स्ट्रिंग |
<FaultResponse><Copy>/<ReasonPhrase> एलिमेंट
गड़बड़ी के मैसेज में, वजह की जानकारी को कॉपी करने के लिए, सोर्स एट्रिब्यूट से तय किए गए ऑब्जेक्ट का ब्यौरा.
<Copy source='response'>
<ReasonPhrase>The resource requested was not found.</ReasonPhrase>
</Copy>|
डिफ़ॉल्ट: |
गलत |
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
स्ट्रिंग |
<FaultResponse><Remove>/<Headers> एलिमेंट
यह गड़बड़ी के मैसेज से, चुने गए एचटीटीपी हेडर हटाता है. सभी हेडर हटाने के लिए, <Remove><Headers/></Remove> तय करें. इस उदाहरण में, मैसेज से user-agent हेडर को हटाया गया है.
<Remove>
<Headers>
<Header name="user-agent"/>
</Headers>
</Remove>अगर एक ही नाम के कई हेडर हैं, तो इस सिंटैक्स का इस्तेमाल करें:
<Remove>
<Headers>
<Header name="h1"/>
<Header name="h2"/>
<Header name="h3.2"/>
</Headers>
</Remove>इस उदाहरण में, "h1", "h2", और "h3" की दूसरी वैल्यू को हटाया गया है. अगर "h3" में सिर्फ़ एक वैल्यू है, तो उसे नहीं हटाया जाता.
|
डिफ़ॉल्ट: |
लागू नहीं |
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
स्ट्रिंग |
<FaultResponse><Set> element
गड़बड़ी के मैसेज में जानकारी सेट करता है.
<Set> <Headers/> <Payload> </Payload> <StatusCode/> <ReasonPhrase/> </Set>
|
डिफ़ॉल्ट: |
लागू नहीं |
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
लागू नहीं |
<FaultResponse>/<Set>/<Headers> एलिमेंट
यह कुकी, गड़बड़ी के मैसेज में एचटीटीपी हेडर सेट करती है या उन्हें बदल देती है. ध्यान दें कि खाली हेडर <Set><Headers/></Set> से कोई हेडर सेट नहीं होता. इस उदाहरण में, user-agent हेडर को <AssignTo> एलिमेंट के साथ तय किए गए मैसेज वैरिएबल पर सेट किया गया है.
<Set>
<Headers>
<Header name="user-agent">{request.header.user-agent}</Header>
</Headers>
</Set>|
डिफ़ॉल्ट: |
लागू नहीं |
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
स्ट्रिंग |
<FaultResponse>/<Set>/<Payload> एलिमेंट
इस फ़ंक्शन का इस्तेमाल, गड़बड़ी के मैसेज का पेलोड सेट करने के लिए किया जाता है.
<Set> <Payload contentType="text/plain">test1234</Payload> </Set>
JSON पेलोड सेट करें:
<Set> <Payload contentType="application/json"> {"name":"foo", "type":"bar"} </Payload> </Set>
JSON पेलोड में, variablePrefix और variableSuffix एट्रिब्यूट का इस्तेमाल करके वैरिएबल डाले जा सकते हैं. साथ ही, सीमांकक वर्णों का इस्तेमाल किया जा सकता है. इसका उदाहरण यहां दिया गया है.
<Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo", "type":"@variable_name#"} </Payload> </Set>
या, क्लाउड रिलीज़ 16.08.17 के बाद से, वैरिएबल डालने के लिए कर्ली ब्रैकेट का इस्तेमाल भी किया जा सकता है:
<Set> <Payload contentType="application/json"> {"name":"foo", "type":"{variable_name}"} </Payload> </Set>
एक्सएमएल में मिक्स्ड पेलोड सेट करना:
<Set> <Payload contentType="text/xml"> <root> <e1>sunday</e1> <e2>funday</e2> <e3>{var1}</e3> </Payload> </Set>
|
डिफ़ॉल्ट: |
|
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
स्ट्रिंग |
विशेषताएं
<Payload contentType="content_type" variablePrefix="char" variableSuffix="char">
| एट्रिब्यूट | ब्यौरा | मौजूदगी | टाइप |
|---|---|---|---|
| contentType |
अगर contentType तय किया गया है, तो इसकी वैल्यू |
वैकल्पिक | स्ट्रिंग |
| variablePrefix | यह फ़्लो वैरिएबल पर शुरुआती डिलिमिटर के बारे में बताता है. ऐसा इसलिए, क्योंकि JSON पेलोड डिफ़ॉल्ट "{" वर्ण का इस्तेमाल नहीं कर सकते. | वैकल्पिक | Char |
| variableSuffix | यह फ़्लो वैरिएबल पर ट्रेलिंग डेलिमिटर के बारे में बताता है. ऐसा इसलिए, क्योंकि JSON पेलोड डिफ़ॉल्ट "}" वर्ण का इस्तेमाल नहीं कर सकते. | वैकल्पिक | Char |
<FaultResponse>/<Set>/<StatusCode> एलिमेंट
इस कुकी से, रिस्पॉन्स का स्टेटस कोड सेट किया जाता है.
<Set source='request'>
<StatusCode>404</StatusCode>
</Set>|
डिफ़ॉल्ट: |
गलत |
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
बूलियन |
<FaultResponse>/<Set>/<ReasonPhrase> एलिमेंट
इससे जवाब की वजह का वाक्यांश सेट किया जाता है.
<Set source='request'>
<ReasonPhrase>The resource requested was not found.</ReasonPhrase>
</Set>|
डिफ़ॉल्ट: |
गलत |
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
बूलियन |
<ShortFaultReason> एलिमेंट
इस विकल्प का इस्तेमाल, जवाब में गड़बड़ी की वजह बताने के लिए किया जाता है:
<ShortFaultReason>true|false</ShortFaultReason>
नीति के उल्लंघन की वजह से, डिफ़ॉल्ट रूप से जवाब में यह जानकारी शामिल होती है:
"fault":{"faultstring":"Raising fault. Fault name : Raise-Fault-1","detail":{"errorcode":"errorCode"}}}मैसेज को ज़्यादा आसानी से पढ़ने के लिए, <ShortFaultReason> एलिमेंट को true पर सेट किया जा सकता है. इससे faultstring को छोटा करके सिर्फ़ नीति का नाम दिखाया जाएगा:
"fault":{"faultstring":"Raise-Fault-1","detail":{"errorcode":"errorCode"}}}मान्य वैल्यू: सही/गलत(डिफ़ॉल्ट).
|
डिफ़ॉल्ट: |
गलत |
|
मौजूदगी: |
वैकल्पिक |
|
टाइप: |
बूलियन |
फ़्लो वैरिएबल
फ़्लो वैरिएबल की मदद से, नीतियों और फ़्लो को रनटाइम में डाइनैमिक तरीके से लागू किया जा सकता है. ऐसा एचटीटीपी हेडर, मैसेज के कॉन्टेंट या फ़्लो के कॉन्टेक्स्ट के आधार पर किया जाता है. RaiseFault नीति लागू होने के बाद, पहले से तय किए गए ये फ़्लो वैरिएबल उपलब्ध होते हैं. फ़्लो वैरिएबल के बारे में ज़्यादा जानने के लिए, वैरिएबल का रेफ़रंस देखें.
| वैरिएबल | टाइप | अनुमति | ब्यौरा |
|---|---|---|---|
| fault.name | स्ट्रिंग | रीड-ओनली | RaiseFault नीति लागू होने पर, इस वैरिएबल को हमेशा RaiseFault स्ट्रिंग पर सेट किया जाता है. |
| fault.type | स्ट्रिंग | रीड-ओनली | यह फ़ंक्शन, गड़बड़ी में मौजूद फ़ॉल्ट टाइप दिखाता है. अगर यह उपलब्ध नहीं है, तो एक खाली स्ट्रिंग दिखाता है. |
| fault.category | स्ट्रिंग | रीड-ओनली | यह फ़ंक्शन, गड़बड़ी की कैटगरी दिखाता है. अगर यह उपलब्ध नहीं है, तो एक खाली स्ट्रिंग दिखाता है. |
RaiseFault के इस्तेमाल का उदाहरण
यहां दिए गए उदाहरण में, queryparam की मौजूदगी को लागू करने के लिए, शर्त का इस्तेमाल किया गया है. साथ ही, इनकमिंग अनुरोध पर zipcode नाम का इस्तेमाल किया गया है. अगर queryparam मौजूद नहीं है, तो फ़्लो, RaiseFault के ज़रिए गड़बड़ी की सूचना देगा:
<Flow name="flow-1">
<Request>
<Step>
<Name>RF-Error-MissingQueryParam</Name>
<Condition>request.queryparam.zipcode = null</Condition>
</Step>
...
</Request>
...
<Condition>(proxy.pathsuffix MatchesPath "/locations") and (request.verb = "GET")</Condition>
</Flow><RaiseFault name='RF-Error-MissingQueryParam'> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <FaultResponse> <Set> <Payload contentType='application/json'>{ "error" : { "code" : 400.02, "message" : "invalid request. Pass a zipcode queryparam." } } </Payload> <StatusCode>400</StatusCode> <ReasonPhrase>Bad Request</ReasonPhrase> </Set> </FaultResponse> </RaiseFault>
गड़बड़ी की जानकारी
इस सेक्शन में, गड़बड़ी के कोड और गड़बड़ी के मैसेज के साथ-साथ गड़बड़ी के वैरिएबल के बारे में बताया गया है ये सेटिंग, Edge की मदद से सेट की जाती हैं. ऐसा तब होता है, जब इस नीति की वजह से कोई गड़बड़ी होती है. यह जानकारी जानना ज़रूरी है कि क्या आप गड़बड़ियों को ठीक करता है. इस बारे में ज़्यादा जानने के लिए, यह देखें नीति से जुड़ी गड़बड़ियों के बारे में आपको क्या पता होना चाहिए और गड़बड़ियां ठीक करना.
रनटाइम की गड़बड़ियां
नीति के लागू होने पर ये गड़बड़ियां हो सकती हैं.
| गड़बड़ी कोड | एचटीटीपी कोड स्थिति | वजह |
|---|---|---|
steps.raisefault.RaiseFault |
500 | गड़बड़ी वाली स्ट्रिंग देखें. |
डिप्लॉयमेंट से जुड़ी गड़बड़ियां
कोई नहीं.
गड़बड़ी के वैरिएबल
रनटाइम की गड़बड़ी होने पर ये वैरिएबल सेट किए जाते हैं. ज़्यादा जानकारी के लिए, आपके लिए ज़रूरी जानकारी देखें नीति से जुड़ी गड़बड़ियों के बारे में जानकारी.
| वैरिएबल | कहां | उदाहरण |
|---|---|---|
fault.name="fault_name" |
fault_name गड़बड़ी का नाम है, जैसा कि रनटाइम की गड़बड़ियों की टेबल ऊपर दी गई है. गड़बड़ी का नाम आखिरी है का हिस्सा है. | fault.name = "RaiseFault" |
raisefault.policy_name.failed |
policy_name, उस नीति का नाम है जिसे उपयोगकर्ता ने तय किया है गलती हुई. | raisefault.RF-ThrowError.failed = true |
गड़बड़ी के रिस्पॉन्स का उदाहरण
{ "fault":{ "detail":{ "errorcode":"steps.raisefault.RaiseFault" }, "faultstring":"Raising fault. Fault name: [name]" } }
स्कीमा
नीति के हर टाइप को एक्सएमएल स्कीमा (.xsd) से तय किया जाता है. रेफ़रंस के लिए, नीति के स्कीमा GitHub पर उपलब्ध हैं.
मिलते-जुलते विषय
गड़बड़ियों को ठीक करना लेख पढ़ें