Apigee Edge दस्तावेज़ देखा जा रहा है.
Apigee X दस्तावेज़ पर जाएं. जानकारी
इस विषय में, Apigee Edge के JavaScript ऑब्जेक्ट मॉडल पर चर्चा की गई है. अगर आपको एपीआई प्रॉक्सी में कस्टम JavaScript जोड़ने के लिए JavaScript नीति का इस्तेमाल करना है, तो इस मॉडल को समझना ज़रूरी है.
EDGE JavaScript ऑब्जेक्ट मॉडल के बारे में जानकारी
Apigee Edge का JavaScript ऑब्जेक्ट मॉडल, संबंधित प्रॉपर्टी वाले ऑब्जेक्ट के बारे में बताता है. ये ऐसे ऑब्जेक्ट होते हैं जो Apigee Edge के प्रॉक्सी फ़्लो में, JavaScript कोड को चलाने के लिए उपलब्ध होते हैं. इस कस्टम कोड को एपीआई प्रॉक्सी फ़्लो में अटैच करने के लिए, JavaScript की नीति का इस्तेमाल किया जाता है.
इस मॉडल के बनाए गए ऑब्जेक्ट का एपीआई प्रॉक्सी फ़्लो में दायरा होता है. इसका मतलब है कि कुछ ऑब्जेक्ट और प्रॉपर्टी, फ़्लो के खास पॉइंट पर ही उपलब्ध होती हैं. जब आपका JavaScript लागू किया जाता है, तो उसे लागू करने के लिए एक स्कोप बनाया जाता है. इस स्कोप में, ये ऑब्जेक्ट रेफ़रंस बनाए जाते हैं:
- context: यह एक ऑब्जेक्ट है, जो मैसेज के कॉन्टेक्स्ट का ऐक्सेस देता है
- request: एक शॉर्टहैंड, जो अनुरोध ऑब्जेक्ट को ऐक्सेस करने की अनुमति देता है
- response: एक शॉर्टहैंड, जो अनुरोध ऑब्जेक्ट को ऐक्सेस करने की अनुमति देता है
- crypto: अलग-अलग हैश फ़ंक्शन देता है
- print: आउटपुट उत्सर्जित करने वाला फ़ंक्शन
- प्रॉपर्टी: इससे नीति में मौजूद कॉन्फ़िगरेशन प्रॉपर्टी को पढ़ने का ऐक्सेस मिलता है
कॉन्टेक्स्ट ऑब्जेक्ट
context
ऑब्जेक्ट का स्कोप ग्लोबल है. यह एपीआई प्रॉक्सी फ़्लो में हर जगह उपलब्ध है. इसमें चार चाइल्ड ऑब्जेक्ट हैं: proxyRequest
, proxyResponse
,
targetRequest
, targetResponse
. ये चाइल्ड ऑब्जेक्ट, ऐंबियंट अनुरोध और रिस्पॉन्स के दायरे में आते हैं. इनमें प्रॉक्सी अनुरोध और रिस्पॉन्स या टारगेट अनुरोध और
रिस्पॉन्स शामिल है. उदाहरण के लिए, अगर JavaScript नीति, फ़्लो के प्रॉक्सी एंडपॉइंट वाले हिस्से में काम करती है,
तो इसका मतलब है कि context.proxyRequest
और context.proxyResponse
ऑब्जेक्ट स्कोप में
हैं. अगर JavaScript टारगेट फ़्लो में चलता है, तो context.targetRequest
और
context.targetResponse
ऑब्जेक्ट स्कोप में हैं.
context
ऑब्जेक्ट में, प्रॉपर्टी और तरीके भी होते हैं, जिनके बारे में इस विषय में ज़्यादा जानकारी दी गई है. उदाहरण के लिए, JavaScript कोड के इस उदाहरण में दिए गए उदाहरण में,
context.flow
प्रॉपर्टी का इस्तेमाल किया गया है और
context
पर get/setVariable()
तरीकों को कॉल किया गया है.
if (context.flow=="PROXY_REQ_FLOW") { var username = context.getVariable("request.formparam.user"); context.setVariable("USER.name", username); }
ये तरीके सीधे फ़्लो वैरिएबल के साथ इंटरैक्ट करते हैं.
context.flow
प्रॉपर्टी की वैल्यू, फ़्लो का मौजूदा स्कोप है. प्रॉक्सी
के अनुरोध फ़्लो में, इसे PROXY_REQ_FLOW
पर सेट किया जाता है. अगर टारगेट
रिस्पॉन्स फ़्लो में, यह TARGET_RESP_FLOW
पर सेट है. स्कोप के हिसाब से कोड को एक्ज़ीक्यूट करने के लिए,
इस कॉन्सटेंट का इस्तेमाल किया जा सकता है. गैटर की मदद से आपको फ़्लो वैरिएबल मिल सकते हैं और सेटर, आपको फ़्लो वैरिएबल सेट करने की सुविधा देता है. आम तौर पर, ये वैरिएबल प्रॉक्सी फ़्लो में उपलब्ध होते हैं और दूसरी नीतियों के तहत इनका इस्तेमाल किया जा सकता है.
ज़्यादा जानकारी और उदाहरणों के लिए, नीचे कॉन्टेक्स्ट ऑब्जेक्ट का रेफ़रंस देखें.
क्रिप्टो ऑब्जेक्ट
क्रिप्टो ऑब्जेक्ट, JavaScript ऑब्जेक्ट मॉडल में बेसिक और बेहतर परफ़ॉर्म करने वाले क्रिप्टोग्राफ़िक सपोर्ट जोड़ता है. ज़्यादा जानकारी और उदाहरणों के लिए नीचे क्रिप्टो ऑब्जेक्ट का रेफ़रंस देखें.
अनुरोध और रिस्पॉन्स ऑब्जेक्ट
request
और response
ऑब्जेक्ट ऐंबियंट अनुरोध और उसके रिस्पॉन्स के शॉर्टहैंड रेफ़रंस हैं, चाहे वह प्रॉक्सी अनुरोध और रिस्पॉन्स हो या टारगेट अनुरोध और रिस्पॉन्स. जिन ऑब्जेक्ट के लिए इन वैरिएबल का इस्तेमाल किया जाता है वे उस कॉन्टेक्स्ट पर निर्भर करते हैं जिसमें JavaScript नीति काम करती है. अगर JavaScript किसी प्रॉक्सी एंडपॉइंट के फ़्लो में चलता है, तो अनुरोध और
रिस्पॉन्स वैरिएबल से context.proxyRequest
और
context.proxyResponse
का पता चलता है. अगर JavaScript किसी टारगेट फ़्लो में चलता है, तो वैरिएबल
context.targetRequest
और context.targetResponse
के बारे में बताते हैं.
प्रिंट() फ़ंक्शन
JavaScript ऑब्जेक्ट मॉडल में एक print()
फ़ंक्शन होता है. इसका इस्तेमाल करके, एज ट्रेस टूल को डीबग
करने की जानकारी जनरेट की जा सकती है. JavaScript Print() स्टेटमेंट की मदद से डीबग करना देखें.
प्रॉपर्टी ऑब्जेक्ट
नीति के कॉन्फ़िगरेशन में किसी properties
वैरिएबल का इस्तेमाल करके, उन प्रॉपर्टी की वैल्यू को ऐक्सेस कर सकता है.
उदाहरण के लिए, अगर आपके JavaScript कॉन्फ़िगरेशन में ये शामिल हैं:
<Javascript name='JS-1' > <Properties> <Property name="number">8675309</Property> <Property name="firstname">Jenny</Property> </Properties> <ResourceURL>jsc://my-code.js</ResourceURL> </Javascript>
इसके बाद, my-code.js
में ये काम किए जा सकते हैं:
print(properties.firstname); // prints Jenny print(properties.number); // 8675309
बुनियादी तौर पर, कॉन्फ़िगरेशन की मदद से कोड को अलग-अलग माहौल में, अलग-अलग समय पर या किसी भी वजह से अलग-अलग तरीके से काम करने में मदद मिल सकती है.
उदाहरण के लिए, यहां बताया गया है कि "वैरिएबल का नाम" क्या है और इसके आउटपुट की स्टाइल, जिसके आधार पर JavaScript को जानकारी देनी चाहिए:
<Javascript name='JS-2' > <Properties> <Property name="output">my_output_variable</Property> <Property name="prettyPrint">true</Property> </Properties> <ResourceURL>jsc://emit-results.js</ResourceURL> </Javascript>इसके बाद,
emit-results.js
में, कोड यह काम कर सकता है:
var result = { prop1: "something", prop2 : "something else" } ; if (properties.prettyPrint == "true") { context.setVariable(properties.output, JSON.stringify(result, null, 2)); } else { context.setVariable(properties.output, JSON.stringify(result)); }
क्रिप्टो ऑब्जेक्ट का रेफ़रंस
क्रिप्टो ऑब्जेक्ट, आपको JavaScript में बुनियादी क्रिप्टोग्राफ़िक हैशिंग फ़ंक्शन करने देता है.
क्रिप्टो ऑब्जेक्ट का स्कोप ग्लोबल स्कोप है. यह एपीआई प्रॉक्सी फ़्लो में हर जगह उपलब्ध है. क्रिप्टो की मदद से, इन हैश ऑब्जेक्ट के साथ काम किया जा सकता है:
- SHA-1
- SHA256
- SHA512
- MD5
SHA-1 ऑब्जेक्ट के साथ काम करना
SHA-1 ऑब्जेक्ट बनाए जा सकते हैं, उन्हें अपडेट किया जा सकता है, और उन्हें हेक्स और base64 मानों में बदला जा सकता है.
नया SHA-1 ऑब्जेक्ट बनाना
var _sha1 = crypto.getSHA1();
SHA-1 ऑब्जेक्ट को अपडेट करना
सिंटैक्स
_sha1.update(value);
पैरामीटर
- value - (स्ट्रिंग) कोई भी स्ट्रिंग वैल्यू.
उदाहरण
SHA-1 ऑब्जेक्ट को अपडेट करें:
_sha1.update("salt_value"); _sha1.update("some text");
SHA-1 ऑब्जेक्ट को हेक्स स्ट्रिंग के तौर पर दिखाना
var _hashed_token = _sha1.digest();
SHA-1 ऑब्जेक्ट को base64 स्ट्रिंग के तौर पर वापस करना है
var _hashed_token = _sha1.digest64();
SHA-256 ऑब्जेक्ट के साथ काम करना
SHA-256 ऑब्जेक्ट बनाए जा सकते हैं, उन्हें अपडेट किया जा सकता है, और उन्हें हेक्स और base64 मानों में बदला जा सकता है.
नया SHA-256 ऑब्जेक्ट बनाना
var _sha256 = crypto.getSHA256();
SHA-256 ऑब्जेक्ट को अपडेट करना
सिंटैक्स
_sha256.update(value);
पैरामीटर
- value - (स्ट्रिंग) कोई भी स्ट्रिंग वैल्यू.
उदाहरण
SHA-256 ऑब्जेक्ट को अपडेट करें:
_sha256.update("salt_value"); _sha256.update("some text");
SHA-256 ऑब्जेक्ट को हेक्स स्ट्रिंग के तौर पर दिखाना
var _hashed_token = _sha256.digest();
SHA-256 ऑब्जेक्ट को base64 स्ट्रिंग के तौर पर वापस करना है
var _hashed_token = _sha256.digest64();
SHA-512 ऑब्जेक्ट के साथ काम करना
SHA-512 ऑब्जेक्ट बनाए जा सकते हैं, उन्हें अपडेट किया जा सकता है, और उन्हें हेक्स और base64 मानों में बदला जा सकता है.
नया SHA-512 ऑब्जेक्ट बनाना
var _sha512 = crypto.getSHA512();
SHA-512 ऑब्जेक्ट को अपडेट करना
सिंटैक्स
_sha512.update(value);
पैरामीटर
- value - (स्ट्रिंग) कोई भी स्ट्रिंग वैल्यू.
उदाहरण
SHA-512 ऑब्जेक्ट को अपडेट करें:
_sha512.update("salt_value"); _sha512.update("some text");
SHA-512 ऑब्जेक्ट को हेक्स स्ट्रिंग के तौर पर दिखाना
var _hashed_token = _sha512.digest();
SHA-512 ऑब्जेक्ट को base64 स्ट्रिंग के तौर पर वापस करना है
var _hashed_token = _sha512.digest64();
MD5 ऑब्जेक्ट के साथ काम करना
MD5 ऑब्जेक्ट बनाए जा सकते हैं, उन्हें अपडेट किया जा सकता है, और उन्हें हेक्स और base64 वैल्यू में बदला जा सकता है.
नया MD5 ऑब्जेक्ट बनाना
var _md5 = crypto.getMD5();
MD5 ऑब्जेक्ट को अपडेट करना
सिंटैक्स
_md5.update(value);
पैरामीटर
- value - (स्ट्रिंग) कोई भी स्ट्रिंग वैल्यू.
उदाहरण
MD5 ऑब्जेक्ट को अपडेट करना:
_md5.update("salt_value"); _md5.update("some text");
MD5 ऑब्जेक्ट को हेक्स स्ट्रिंग के तौर पर दिखाना
var _hashed_token = _md5.digest();
MD5 ऑब्जेक्ट को base64 स्ट्रिंग के तौर पर दिखाना
var _hashed_token = _md5.digest64();
क्रिप्टो तारीख/समय से जुड़ी सहायता
क्रिप्टो ऑब्जेक्ट, तारीख/समय के फ़ॉर्मैट वाले पैटर्न के साथ काम करता है.
crypto.dateFormat()
स्ट्रिंग फ़ॉर्मैट में तारीख दिखाता है.
सिंटैक्स
crypto.dateFormat(format, [timezone], [time])
पैरामीटर
- format - (स्ट्रिंग) इस पैरामीटर को लागू करने का मुख्य तरीका java.text.SimpleDateFormat है. उदाहरण के लिए: 'yyyy-MM-DD HH:mm:ss.SSS'
- timezone - (स्ट्रिंग, ज़रूरी नहीं) इस पैरामीटर को लागू करने का मुख्य तरीका java.util.TimeZone है. यह पैरामीटर समान डिफ़ॉल्ट है: UTC
- time - (संख्या, ज़रूरी नहीं) फ़ॉर्मैट करने के लिए यूनिक्स टाइमस्टैंप की वैल्यू. डिफ़ॉल्ट: मौजूदा समय
उदाहरण
मिलीसेकंड तक मौजूदा समय की जानकारी पाएं:
var _now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS');
पैसिफ़िक टाइम ज़ोन का मौजूदा समय जानें:
var _pst = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST');
अब से 10 सेकंड की वैल्यू पाएं:
var _timeNow = Number(context.getVariable('system.timestamp')); var ten_seconds = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);
दूसरे उदाहरण. java.text.SimpleDateFormat का दस्तावेज़ भी देखें.
var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
इस्तेमाल किए जा सकने वाले किसी भी हैश ऑब्जेक्ट को पाने के लिए, getHash() का इस्तेमाल करें
उदाहरण
var _hash1 = crypto.getHash('MD5'); var _hash2 = crypto.getHash('SHA-1'); var _hash3 = crypto.getHash('SHA-256'); var _hash4 = crypto.getHash('SHA-512');
क्रिप्टो के साथ सैंपल
try { // get values to use with hash functions var salt = context.getVariable("salt") || 'SomeHardCodedSalt'; var host = context.getVariable("request.header.Host"); var unhashed_token = ""; var _timeNow = Number(context.getVariable('system.timestamp')); var now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow); unhashed_token = "|" + now + "|" + host // generate a hash with the unhashedToken: var sha512 = crypto.getSHA512(); sha512.update(salt); sha512.update(unhashed_token); // convert to base64 var base64_token = sha512.digest64(); // set headers context.setVariable("request.header.now", now); context.setVariable("request.header.token", base64_token); } catch(e) { throw 'Error in Javascript'; }
कॉन्टेक्स्ट ऑब्जेक्ट रेफ़रंस
- कॉन्टेक्स्ट ऑब्जेक्ट की खास जानकारी
- कॉन्टेक्स्ट ऑब्जेक्ट के तरीके
- कॉन्टेक्स्ट ऑब्जेक्ट प्रॉपर्टी
- कॉन्टेक्स्ट ऑब्जेक्ट चिल्ड्रन
हर अनुरोध/रिस्पॉन्स के लेन-देन के लिए, एक context
ऑब्जेक्ट बनाया जाता है. इसे एपीआई प्रॉक्सी की मदद से बनाया जाता है. context
ऑब्जेक्ट, हर ट्रांज़ैक्शन से जुड़े वैरिएबल पाने, उन्हें सेट करने, और हटाने के तरीके दिखाता है.
वैरिएबल किसी ट्रांज़ैक्शन से जुड़ी खास प्रॉपर्टी को परिभाषित करते हैं. दिन का समय, अनुरोध करने वाले क्लाइंट की स्थान-भाषा, अनुरोध करने वाले क्लाइंट का उपयोगकर्ता एजेंट, और टारगेट सेवा का यूआरएल,
context
में उपलब्ध सभी वैरिएबल के उदाहरण हैं. इसलिए,
context
, लॉजिक बनाने के लिए काम का है, जो पसंद के मुताबिक कार्रवाई करने के लिए
इन प्रॉपर्टी का इस्तेमाल करता है.
फ़्लो वैरिएबल का रेफ़रंस और वैरिएबल एक्सट्रैक्ट करने से जुड़ी नीति देखें.
context ऑब्जेक्ट की खास जानकारी
इस टेबल में, कॉन्टेक्स्ट ऑब्जेक्ट और इसके चाइल्ड पेजों के बारे में कम शब्दों में जानकारी दी गई है. साथ ही, इसमें उन प्रॉपर्टी की जानकारी दी गई है जो हर एलिमेंट से जुड़ी हैं.
नाम | ब्यौरा | प्रॉपर्टी |
---|---|---|
context |
मैसेज प्रोसेस करने वाले पाइपलाइन संदर्भ और अनुरोध और रिस्पॉन्स फ़्लो के लिए एक रैपर, जिन्हें प्रॉक्सीEndpoint और TargetEndpoint चलाते हैं. | फ़्लो, सेशन |
context. proxyRequest |
एक ऐसा ऑब्जेक्ट जो प्रॉक्सीEndpoint को भेजे जाने वाले इनबाउंड अनुरोध मैसेज को दिखाता है (अनुरोध करने वाले ऐप्लिकेशन से एपीआई प्रॉक्सी तक) | शीर्षलेख, क्वेरी पैरामीटर, विधि, मुख्य भाग, url |
context. targetRequest |
यह एक ऑब्जेक्ट है, जो TargetEndpoint (एपीआई प्रॉक्सी से बैकएंड सेवा) से मिलने वाले आउटबाउंड अनुरोध मैसेज को दिखाता है. | शीर्षलेख, क्वेरी पैरामीटर, विधि, मुख्य भाग, url |
context. targetResponse |
ऐसा ऑब्जेक्ट जो इनबाउंड टारगेट रिस्पॉन्स मैसेज (बैकएंड सेवा से लेकर एपीआई प्रॉक्सी तक) को दिखाता है | हेडर, कॉन्टेंट, स्टेटस |
context. proxyResponse |
एक ऑब्जेक्ट जो आउटबाउंड प्रॉक्सी रिस्पॉन्स मैसेज (एपीआई प्रॉक्सी से अनुरोध करने वाले ऐप्लिकेशन तक) दिखाता है | हेडर, कॉन्टेंट, स्टेटस |
context.flow |
मौजूदा फ़्लो का नाम. | नीचे context.flow देखें. |
context.session |
नाम/वैल्यू पेयर का मैप, जिसका इस्तेमाल करके ऑब्जेक्ट को एक ही कॉन्टेक्स्ट में, दो अलग-अलग चरणों के बीच
पास किया जा सकता है. उदाहरण के लिए: context.session['key'] = 123 . |
इस ऑब्जेक्ट का इस्तेमाल कब और कब न करना चाहिए, इस बारे में ज़्यादा जानकारी के लिए, यह Apigee समुदाय की चर्चा देखें. |
context ऑब्जेक्ट वाले तरीके
context.getVariable()
पहले से तय या कस्टम वैरिएबल की वैल्यू दिखाता है.
सिंटैक्स
context.getVariable("variable-name");
उदाहरण
मौजूदा साल का मान पाने के लिए:
var year = context.getVariable('system.time.year');
context.setVariable()
कस्टम वैरिएबल या लिखने वाले पहले से तय वैरिएबल के लिए वैल्यू सेट करता है.
सिंटैक्स
context.setVariable("variable-name", value);
उदाहरण
वैरिएबल सेट करने का सामान्य उदाहरण यह है कि एपीआई प्रॉक्सी को डाइनैमिक तौर पर
टारगेट यूआरएल लिखने की ज़रूरत होती है. नीचे दिया गया JavaScript, USER.name
नाम के वैरिएबल की वैल्यू हासिल करता है और उस वैल्यू को यूआरएल
http://mocktarget.apigee.net?user=
में क्वेरी पैरामीटर के रूप में जोड़ता है. इसके बाद, पहले से तय
target.url
को उस वैल्यू में सेट करता है.
context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));
context.removeVariable()
कॉन्टेक्स्ट से वैरिएबल हटा देता है.
सिंटैक्स
context.removeVariable('variable-name');
कॉन्टेक्स्ट ऑब्जेक्ट प्रॉपर्टी
flow
प्रॉपर्टी एक ऐसी स्ट्रिंग है जो मौजूदा एपीआई प्रॉक्सी फ़्लो की पहचान करती है. इस
प्रॉपर्टी का इस्तेमाल उस फ़्लो को दिखाने के लिए किया जाता है जिससे JavaScript जुड़ा है. इन वैल्यू का इस्तेमाल
किया जा सकता है:
PROXY_REQ_FLOW
PROXY_RESP_FLOW
TARGET_REQ_FLOW
TARGET_RESP_FLOW
हर फ़्लो के नाम में PreFlow, PostFlow, और प्रॉक्सीEndpoints या TargetEndpoints में बताया गया कोई भी कंडिशनल फ़्लो शामिल है.
यह वैकल्पिक प्रॉपर्टी तब काम आती है, जब सामान्य JavaScript को एक से ज़्यादा फ़्लो में एक्ज़ीक्यूट किया जाता है. हालांकि, जिस फ़्लो में उसे एक्ज़ीक्यूट किया जाता है उसके हिसाब से इसका व्यवहार अलग-अलग हो सकता है. ऐसे JavaScript मॉड्यूल के लिए फ़्लो प्रॉपर्टी का इस्तेमाल करें जिसे एक से ज़्यादा एपीआई प्रॉक्सी में फिर से इस्तेमाल किया जाना है. इसमें लॉजिक को लागू करने से पहले, मौजूदा फ़्लो की जांच करना ज़रूरी है.
उदाहरण
सिर्फ़ targetRequest फ़्लो पर एचटीटीपी हेडर सेट करें:
if (context.flow=="TARGET_REQ_FLOW") { context.targetRequest.headers['TARGET-HEADER-X']='foo'; }
कॉन्टेंट को सिर्फ़ प्रॉक्सी रिस्पॉन्स फ़्लो पर सेट करें:
if (context.flow=="PROXY_RESP_FLOW") { context.proxyResponse.content='bar'; }
नाम/वैल्यू पेयर का मैप, जिसका इस्तेमाल एक ही मैसेज कॉन्टेक्स्ट में लागू की जाने वाली दो नीतियों के बीच ऑब्जेक्ट को पास करने के लिए किया जा सकता है.
उदाहरण
सेशन में कोई वैल्यू सेट करें:
context.session['key'] = 123;
सेशन से वैल्यू पाएं:
var value = context.session['key']; // 123
कॉन्टेक्स्ट ऑब्जेक्ट चाइल्ड
जैसा कि नीचे दिखाया गया है, एक पूरे एपीआई प्रॉक्सी फ़्लो में चार अलग-अलग चरण होते हैं. हर चरण में एक मैसेज ऑब्जेक्ट होता है जो कॉन्टेक्स्ट ऑब्जेक्ट का चाइल्ड होता है:
context.proxyRequest
: अनुरोध करने वाले क्लाइंट से मिला इनबाउंड अनुरोध का मैसेज.context.targetRequest
: बैकएंड सेवा को भेजे गए आउटबाउंड अनुरोध का मैसेज.context.proxyResponse
: अनुरोध करने वाले क्लाइंट को आउटबाउंड रिस्पॉन्स मैसेज वापस चला गया.context.targetResponse
: बैकएंड सेवा से मिला इनबाउंड अनुरोध का मैसेज.
इन सेक्शन में, इन ऑब्जेक्ट के तरीकों और प्रॉपर्टी के बारे में बताया गया है:
कॉन्टेक्स्ट.*चाइल्ड ऑब्जेक्ट का अनुरोध करें
हर एचटीटीपी लेन-देन, एपीआई प्रॉक्सी में एक्ज़ीक्यूट होता है, के लिए दो अनुरोध मैसेज ऑब्जेक्ट बनाए जाते हैं: एक inbound (क्लाइंट से अनुरोध) और एक inbound (एपीआई प्रॉक्सी से जनरेट किया गया और बैकएंड टारगेट को सबमिट किया गया अनुरोध).
context
ऑब्जेक्ट में वे चाइल्ड ऑब्जेक्ट हैं जो इन अनुरोध मैसेज को दिखाते हैं:
context.proxyRequest
और context.targetRequest
. इन ऑब्जेक्ट की मदद से,
आपके JavaScript कोड के काम करने पर,
अनुरोध फ़्लो में मौजूद उन प्रॉपर्टी को ऐक्सेस किया जा सकता है.
ध्यान दें: अनुरोध के फ़्लो में, इन प्रॉपर्टी को ऐक्सेस करने के लिए, शॉर्टहैंड ऑब्जेक्ट request
का
भी इस्तेमाल किया जा सकता है. आपका JavaScript कोड, फ़्लो में कहां ट्रिगर होता है, इसके आधार पर request
ऑब्जेक्ट,
context.proxyRequest
या context.targetRequest
के बारे में बताता है.
कॉन्टेक्स्ट.*चाइल्ड ऑब्जेक्ट प्रॉपर्टी का अनुरोध करें
प्रॉपर्टी का नाम | ब्यौरा |
---|---|
url |
अनुरोध का पूरा यूआरएल, इन प्रॉपर्टी से मिलकर बना होता है:
|
उदाहरण: context.targetRequest.url = 'http://www.example.com/path?q1=1' context.targetRequest.protocol ='https'; |
|
headers |
|
उदाहरण: इस एचटीटीपी अनुरोध के लिए: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Zयह JavaScript: context.proxyRequest.headers['Content-Type']; context.proxyRequest.headers['Authorization']; ये वैल्यू दिखेंगी application/json Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z |
|
queryParams |
|
उदाहरण: "?city=PaloAlto&city=NewYork" को इस तरह से ऐक्सेस किया जा सकता है: context.proxyRequest.queryParams['city']; // == 'PaloAlto' context.proxyRequest.queryParams['city'][0] // == 'PaloAlto' context.proxyRequest.queryParams['city'][1]; // == 'NewYork' context.proxyRequest.queryParams['city'].length(); // == 2 |
|
method |
अनुरोध से जुड़ी एचटीटीपी कार्रवाई ( |
उदाहरण: इस अनुरोध के लिए: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z नीचे दिया गया JavaScript: context.proxyRequest.method; नीचे दी गई वैल्यू दिखाएगा POST |
|
body |
एचटीटीपी अनुरोध का मैसेज का मुख्य हिस्सा (पेलोड). अनुरोध के मुख्य हिस्से में ये सदस्य शामिल हैं:
|
उदाहरण: एक्सएमएल के मुख्य हिस्से के लिए: <customer number='1'> <name>Fred<name/> <customer/> एक्सएमएल ऑब्जेक्ट के एलिमेंट को इस तरह ऐक्सेस करने के लिए: var name = context.targetRequest.body.asXML.name; एक्सएमएल एट्रिब्यूट के एट्रिब्यूट ऐक्सेस करने के लिए, var number = context.targetRequest.body.asXML.@number; JSON अनुरोध के मुख्य हिस्से के लिए: { "a": 1 , "b" : "2" } var a = context.proxyRequest.body.asJSON.a; // == 1 var b = context.proxyRequest.body.asJSON.b; // == 2 फ़ॉर्म पैरामीटर पढ़ने के लिए: "vehicle=Car&vehicle=Truck" v0 = context.proxyRequest.body.asForm['vehicle'][0]; v1 = context.proxyRequest.body.asForm['vehicle'][1]; |
context.*चाइल्ड ऑब्जेक्ट को रिस्पॉन्स देना
हर एचटीटीपी लेन-देन के लिए, एपीआई प्रॉक्सी में रिस्पॉन्स देने वाले दो ऑब्जेक्ट बनाए जाते हैं: एक inbound (बैकएंड सेवा से मिलने वाला रिस्पॉन्स) और एक inbound (क्लाइंट को वापस भेजा जाने वाला रिस्पॉन्स.)
कॉन्टेक्स्ट ऑब्जेक्ट में वे चाइल्ड ऑब्जेक्ट हैं जो इन रिस्पॉन्स मैसेज को दिखाते हैं:
context.proxyResponse
और context.targetResponse
. इन ऑब्जेक्ट की मदद से, रिस्पॉन्स फ़्लो में मौजूद उन प्रॉपर्टी को ऐक्सेस किया जा सकता है जो JavaScript कोड के काम करने के दौरान दायरे में हैं.
ध्यान दें: शॉर्टहैंड ऑब्जेक्ट response
का इस्तेमाल करके भी, रिस्पॉन्स फ़्लो से इन प्रॉपर्टी को ऐक्सेस किया जा सकता है. आपका JavaScript कोड, फ़्लो में कहां ट्रिगर होता है, इसके आधार पर response
ऑब्जेक्ट,
context.proxyResponse
या context.targetResponse
के बारे में बताता है.
कॉन्टेक्स्ट.*रिस्पॉन्स ऑब्जेक्ट प्रॉपर्टी
प्रॉपर्टी का नाम | ब्यौरा |
---|---|
headers |
|
उदाहरण: var cookie = context.targetResponse.headers['Set-Cookie']; |
|
status |
प्रॉपर्टी के तौर पर, स्थिति बताने वाले मैसेज के साथ स्टेटस कोड. स्टेटस कोड और स्टेटस मैसेज, दोनों प्रॉपर्टी के तौर पर उपलब्ध होते हैं. |
उदाहरण: var status = context.targetResponse.status.code; // 200 var msg = context.targetResponse.status.message; // "OK" |
|
content |
रिस्पॉन्स मैसेज का एचटीटीपी मुख्य हिस्सा (पेलोड कॉन्टेंट). जवाब वाले कॉन्टेंट में ये सदस्य शामिल हैं: context.targetResponse.content.asXML; context.targetResponse.content.asJSON; |
.asXML नोटेशन का इस्तेमाल करना
.asXML
नोटेशन का इस्तेमाल करके, एक्सएमएल दस्तावेज़ में पढ़ने का एक आसान तरीका है.
इस सेक्शन में बताया गया है कि इस नोटेशन को कैसे इस्तेमाल किया जा सकता है. साथ ही, यह भी बताया गया है कि यह
request.content
और context.proxyRequest.content
से कैसे अलग है.
उदाहरण के लिए:
request.content.asXML
या
context.proxyRequest.content.asXML
*.content
और *.content.asXML
, दोनों फ़ॉर्म का इस्तेमाल स्ट्रिंग के संदर्भ में किया जा सकता है.
साथ ही, JavaScript उन्हें स्ट्रिंग बनने के लिए मजबूर कर देगा. पुराने केस (*.content
) के मामले में, स्ट्रिंग में सभी एलानों के साथ-साथ एक्सएमएल टिप्पणियां भी शामिल हैं. बाद के मामले (*.content.asXML
) में, नतीजे की स्ट्रिंग की वैल्यू को एलानों और टिप्पणियों से हटा दिया जाता है.
उदाहरण
msg.content:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error> <!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->
msg.content.asXML:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error>
इसके अलावा, एक्सएमएल हैरारकी को पार करने के लिए, .asXML
फ़ॉर्म का इस्तेमाल किया जा सकता है. इसके लिए, एलिमेंट और एट्रिब्यूट के नाम बताएं. किसी दूसरे सिंटैक्स का इस्तेमाल करके हैरारकी पार नहीं की जा सकती.
JavaScript Print() स्टेटमेंट की मदद से डीबग करना
अगर कस्टम JavaScript कोड को लागू करने के लिए, JavaScript नीति का इस्तेमाल किया जा रहा है, तो ध्यान रखें कि ट्रेस टूल में डीबग की जानकारी आउटपुट करने के लिए, Print() फ़ंक्शन का इस्तेमाल किया जा सकता है. यह फ़ंक्शन सीधे JavaScript ऑब्जेक्ट मॉडल के ज़रिए उपलब्ध है. उदाहरण के लिए:
if (context.flow=="PROXY_REQ_FLOW") { print("In proxy request flow"); var username = context.getVariable("request.queryparam.user"); print("Got query param: " + username); context.setVariable("USER.name", username); print("Set query param: " + context.getVariable("USER.name")); } if (context.flow=="TARGET_REQ_FLOW") { print("In target request flow"); var username = context.getVariable("USER.name"); var url = "http://mocktarget.apigee.net/user?" context.setVariable("target.url", url + "user=" + username); print("callout to URL: ", context.getVariable("target.url")); }
आउटपुट देखने के लिए, ट्रेस विंडो के सबसे नीचे
सभी ट्रांज़ैक्शन से मिले आउटपुट को चुनें. आउटपुट को stepExecution-stdout
नाम की ट्रेस प्रॉपर्टी में भी देखा जा सकता है.
httpClient की मदद से JavaScript कॉलआउट बनाना
एपीआई प्रॉक्सी फ़्लो में, कस्टम JavaScript कोड का इस्तेमाल करके किसी भी यूआरएल से कई, पैरलल, एसिंक्रोनस एचटीटीपी अनुरोध करने के लिए, httpClient
का इस्तेमाल करें.
httpClient
ऑब्जेक्ट को, Apigee Edge JavaScript ऑब्जेक्ट
मॉडल की मदद से दिखाया जाता है.
httpClient के बारे में
httpClient
ऑब्जेक्ट, JavaScript ऑब्जेक्ट मॉडल के ज़रिए Apigee Edge पर चल रहे कस्टम JavaScript कोड के संपर्क में आता है. एपीआई प्रॉक्सी में कस्टम JavaScript अटैच करने के लिए, JavaScript की नीति का इस्तेमाल करें. इस नीति के चलने पर, कस्टम JavaScript कोड काम करता है.
httpClient
ऑब्जेक्ट, कंपोज़िट सेवाएं या
मैशअप बनाने के लिए उपयोगी है. उदाहरण के लिए, कई बैकएंड कॉल को एक एपीआई तरीके में इकट्ठा किया जा सकता है.
आम तौर पर, इस ऑब्जेक्ट का इस्तेमाल, सेवा कॉलआउट की नीति के विकल्प के तौर पर किया जाता है.
यहां इस्तेमाल का बुनियादी पैटर्न दिया गया है. अनुरोध ऑब्जेक्ट को इंस्टैंशिएट करें, उसे कोई यूआरएल असाइन करें (उदाहरण के लिए, उस बैकएंड सेवा के लिए जिसे आपको कॉल करना है), और उस अनुरोध ऑब्जेक्ट के साथ httpClient.send
को कॉल करें.
var myRequest = new Request(); myRequest.url = "http://www.example.com"; var exchangeObj = httpClient.send(myRequest);
httpक्लाइंट संदर्भ
एचटीटीपी क्लाइंट दो तरीके दिखाता है: get()
और send()
.
httpClient.get()
आसान एचटीटीपी GET
अनुरोधों के लिए एक आसान तरीका, जिसमें एचटीटीपी हेडर का इस्तेमाल नहीं किया जा सकता.
इस्तेमाल किए जाने से जुड़ी जानकारी
var exchangeObj = httpClient.get(url);
लौटाए गए सामान
यह तरीका exchange
ऑब्जेक्ट दिखाता है. इस ऑब्जेक्ट में कोई प्रॉपर्टी नहीं है और यह
इन तरीकों को दिखाता है:
isError()
: (बूलियन) अगर httpClient, सर्वर से कनेक्ट नहीं हो पाता है, तोtrue
दिखाता है. एचटीटीपी स्टेटस कोड4xx
और5xx
की वजह से,isError()
false
मिला. कनेक्शन पूरा होने और मान्य रिस्पॉन्स कोड मिलने की वजह से ऐसा हुआ. अगरisError()
,true
दिखाता है, तोgetResponse()
को किए जाने वाले कॉल से JavaScriptundefined
दिखता है.isSuccess()
: (बूलियन) भेजने की प्रक्रिया पूरी होने और सफल होने परtrue
दिखाता है.isComplete()
: (बूलियन) अनुरोध पूरा होने परtrue
दिखाता है.waitForComplete()
: अनुरोध पूरा होने तक, थ्रेड को रोकता है. ऐसा तब तक होता है, जब तक अनुरोध पूरा नहीं होता या गड़बड़ी हो जाती है.getResponse()
: (Object)httpClient.send()
के पूरा और सफल होने पर, रिस्पॉन्स ऑब्जेक्ट दिखाता है. नतीजे के तौर पर दिखाए गए ऑब्जेक्ट में, context.कुकी रिस्पॉन्स ऑब्जेक्ट की तरह ही तरीके और प्रॉपर्टी हैं. कॉन्टेक्स्ट ऑब्जेक्ट की खास जानकारी देखें.getError()
: (स्ट्रिंग) अगरhttpClient.send()
को कॉल करने पर कोई गड़बड़ी होती है, तो गड़बड़ी के मैसेज को स्ट्रिंग के तौर पर दिखाता है.
उदाहरण
पूरी तरह से कॉन्फ़िगर किया गया अनुरोध ऑब्जेक्ट भेजें, जिसमें एचटीटीपी अनुरोध की प्रॉपर्टी शामिल हों. जवाब को प्रोसेस करने के लिए, ऐसे कॉलबैक का इस्तेमाल करें जो ब्लॉक न हो.
// Add the required the headers for making a specific API request var headers = {'X-SOME-HEADER' : 'some value' }; // Make a GET API request along with headers var myRequest = new Request("http://www.example.com","GET",headers); // Define the callback function and process the response from the GET API request function onComplete(response,error) { // Check if the HTTP request was successful if (response) { context.setVariable('example.status', response.status); } else { context.setVariable('example.error', 'Woops: ' + error); } } // Specify the callback Function as an argument httpClient.get(myRequest, onComplete);
JavaScript की नीति का इस्तेमाल करना
प्रॉक्सी फ़्लो में कस्टम JavaScript कोड अटैच करने के लिए, JavaScript नीति का इस्तेमाल करें. JavaScript की नीति देखें.
मिलते-जुलते विषय
- JavaScript की नीति
- JavaScript ऑब्जेक्ट मॉडल
- बुनियादी सैंपल और निर्देशों के लिए, JavaScript के साथ प्रोग्रामिंग एपीआई प्रॉक्सी देखें.
- JavaScript कोड के सैंपल पर काम करने के लिए, GitHub पर Apigee Edge के सैंपल देखें.
Apigee समुदाय के लेख
आपको इन मिलते-जुलते लेख, Apigee कम्यूनिटी पर मिल सकते हैं: