आपको Apigee Edge का दस्तावेज़ दिख रहा है.
Apigee X के दस्तावेज़ पर जाएं. जानकारी
इस विषय में, Apigee Edge JavaScript ऑब्जेक्ट मॉडल के बारे में बताया गया है. अगर आपको एपीआई प्रॉक्सी में कस्टम JavaScript जोड़ने के लिए, JavaScript नीति का इस्तेमाल करना है, तो आपको इस मॉडल को समझना होगा.
Edge के JavaScript ऑब्जेक्ट मॉडल के बारे में जानकारी
Apigee Edge JavaScript ऑब्जेक्ट मॉडल, ऐसी प्रॉपर्टी से जुड़े ऑब्जेक्ट तय करता है जो Apigee Edge प्रॉक्सी फ़्लो में चलने वाले JavaScript कोड के लिए उपलब्ध होते हैं. इस कस्टम कोड को एपीआई प्रॉक्सी फ़्लो से अटैच करने के लिए, JavaScript नीति का इस्तेमाल करें.
इस मॉडल से तय किए गए ऑब्जेक्ट का स्कोप, एपीआई प्रॉक्सी फ़्लो के अंदर होता है. इसका मतलब है कि कुछ ऑब्जेक्ट और प्रॉपर्टी, फ़्लो में सिर्फ़ कुछ खास पॉइंट पर उपलब्ध होती हैं. JavaScript को एक्ज़ीक्यूट करने पर, एक स्कोप बनाया जाता है. उस स्कोप में, ये ऑब्जेक्ट रेफ़रंस बनाए जाते हैं:
- context: यह एक ऐसा ऑब्जेक्ट है जो मैसेज के कॉन्टेक्स्ट का ऐक्सेस देता है
- request: यह एक शॉर्टहैंड है, जो अनुरोध किए गए ऑब्जेक्ट को ऐक्सेस करने की अनुमति देता है
- response: यह एक शॉर्टहैंड है, जो अनुरोध ऑब्जेक्ट को ऐक्सेस करने की अनुमति देता है
- crypto: यह अलग-अलग हैश फ़ंक्शन उपलब्ध कराता है
- print: आउटपुट दिखाने वाला फ़ंक्शन
- properties: इससे नीति में कॉन्फ़िगरेशन प्रॉपर्टी को पढ़ने का ऐक्सेस मिलता है
कॉन्टेक्स्ट ऑब्जेक्ट
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 को रेफ़र करते हैं.
print() फ़ंक्शन
JavaScript ऑब्जेक्ट मॉडल में एक print() फ़ंक्शन शामिल होता है. इसका इस्तेमाल, Edge Trace टूल में डीबग करने से जुड़ी जानकारी को आउटपुट करने के लिए किया जा सकता है. 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)); }
क्रिप्टो ऑब्जेक्ट रेफ़रंस
crypto ऑब्जेक्ट की मदद से, JavaScript में क्रिप्टोग्राफ़िक हैशिंग के बुनियादी फ़ंक्शन किए जा सकते हैं.
क्रिप्टो ऑब्जेक्ट का ग्लोबल स्कोप होता है. यह एपीआई प्रॉक्सी फ़्लो में हर जगह उपलब्ध है. Crypto की मदद से, इन हैश ऑब्जेक्ट के साथ काम किया जा सकता है:
- 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 - (String) इस पैरामीटर के लिए, 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');
अभी से दस सेकंड बाद की वैल्यू पाएं:
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 object summary
- context object methods
- कॉन्टेक्स्ट ऑब्जेक्ट प्रॉपर्टी
- context object children
एपीआई प्रॉक्सी के ज़रिए किए गए हर अनुरोध/जवाब वाले ट्रांज़ैक्शन के लिए, एक context ऑब्जेक्ट बनाया जाता है. context ऑब्जेक्ट, हर लेन-देन से जुड़े वैरिएबल को पाने, सेट करने, और हटाने के तरीके दिखाता है.
वैरिएबल, किसी लेन-देन से जुड़ी प्रॉपर्टी तय करते हैं. दिन का समय, अनुरोध करने वाले क्लाइंट की जगह, अनुरोध करने वाले क्लाइंट का उपयोगकर्ता-एजेंट, और टारगेट सेवा का यूआरएल, ये सभी ऐसे वैरिएबल के उदाहरण हैं जो context में उपलब्ध हैं. इसलिए, context का इस्तेमाल करके ऐसा लॉजिक बनाया जा सकता है जो कस्टम व्यवहार को लागू करने के लिए, इन प्रॉपर्टी पर निर्भर करता है.
फ़्लो वैरिएबल का रेफ़रंस और वैरिएबल निकालने की नीति देखें.
context object summary
इस टेबल में, कॉन्टेक्स्ट ऑब्जेक्ट और उसके चाइल्ड ऑब्जेक्ट के बारे में खास जानकारी दी गई है. साथ ही, इसमें हर ऑब्जेक्ट से जुड़ी प्रॉपर्टी की सूची दी गई है.
| नाम | ब्यौरा | प्रॉपर्टी |
|---|---|---|
context |
यह मैसेज प्रोसेसिंग पाइपलाइन के कॉन्टेक्स्ट और अनुरोध और जवाब के लिए रैपर है. ProxyEndpoint और TargetEndpoint, इन फ़्लो को एक्ज़ीक्यूट करते हैं. | फ़्लो, सेशन |
context.proxyRequest |
यह एक ऐसा ऑब्जेक्ट है जो ProxyEndpoint को भेजे गए अनुरोध के मैसेज को दिखाता है. यह मैसेज, अनुरोध करने वाले ऐप्लिकेशन से एपीआई प्रॉक्सी को भेजा जाता है | हेडर, क्वेरी पैरामीटर, तरीका, मुख्य हिस्सा, यूआरएल |
context.targetRequest |
यह एक ऐसा ऑब्जेक्ट होता है जो TargetEndpoint से भेजे गए अनुरोध के मैसेज को दिखाता है. यह मैसेज, एपीआई प्रॉक्सी से बैकएंड सेवा को भेजा जाता है. | हेडर, क्वेरी पैरामीटर, तरीका, मुख्य हिस्सा, यूआरएल |
context.targetResponse |
यह एक ऐसा ऑब्जेक्ट है जो इनबाउंड टारगेट रिस्पॉन्स मैसेज (बैकएंड सेवा से एपीआई प्रॉक्सी तक) को दिखाता है | हेडर, कॉन्टेंट, स्टेटस |
context.proxyResponse |
यह एक ऐसा ऑब्जेक्ट है जो आउटबाउंड प्रॉक्सी के जवाब के मैसेज को दिखाता है. यह मैसेज, एपीआई प्रॉक्सी से अनुरोध करने वाले ऐप्लिकेशन को भेजा जाता है | हेडर, कॉन्टेंट, स्टेटस |
context.flow |
मौजूदा फ़्लो का नाम. | नीचे context.flow देखें. |
context.session |
नाम/वैल्यू के जोड़े का मैप. इसका इस्तेमाल, एक ही कॉन्टेक्स्ट में एक्ज़ीक्यूट होने वाले दो अलग-अलग चरणों के बीच ऑब्जेक्ट पास करने के लिए किया जा सकता है. उदाहरण के लिए: context.session['key'] = 123. |
इस ऑब्जेक्ट का इस्तेमाल कब करना चाहिए और कब नहीं, इस बारे में ज़्यादा जानने के लिए, Apigee Community में हुई यह चर्चा पढ़ें. |
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_FLOWPROXY_RESP_FLOWTARGET_REQ_FLOWTARGET_RESP_FLOW
हर फ़्लो के नाम में PreFlow, PostFlow, और ProxyEndpoints या TargetEndpoints में तय किए गए कोई भी शर्त वाले फ़्लो शामिल होते हैं.
यह वैकल्पिक प्रॉपर्टी तब काम आती है, जब एक से ज़्यादा फ़्लो में सामान्य JavaScript का इस्तेमाल किया जाता है. हालांकि, यह JavaScript अलग-अलग फ़्लो में अलग-अलग तरीके से काम कर सकती है. Flow प्रॉपर्टी का इस्तेमाल उन JavaScript मॉड्यूल के लिए करें जिन्हें कई एपीआई प्रॉक्सी में फिर से इस्तेमाल किया जाना है. इनमें लॉजिक को लागू करने से पहले, मौजूदा फ़्लो की जांच करने के लिए कोड की ज़रूरत होती है.
उदाहरण
सिर्फ़ targetRequest फ़्लो पर एचटीटीपी हेडर सेट करें:
if (context.flow=="TARGET_REQ_FLOW") { context.targetRequest.headers['TARGET-HEADER-X']='foo'; }
सिर्फ़ proxyResponse फ़्लो पर कॉन्टेंट सेट करें:
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: बैकएंड सेवा से मिला इनबाउंड अनुरोध मैसेज.

यहां दिए गए सेक्शन में, इन ऑब्जेक्ट के तरीकों और प्रॉपर्टी के बारे में बताया गया है:
context.*Request child objects
एपीआई प्रॉक्सी में एक्ज़ीक्यूट होने वाले हर एचटीटीपी लेन-देन के लिए, दो अनुरोध मैसेज ऑब्जेक्ट बनाए जाते हैं: एक इनबाउंड (क्लाइंट से मिला अनुरोध) और दूसरा आउटबाउंड (एपीआई प्रॉक्सी से जनरेट किया गया अनुरोध, जिसे बैकएंड टारगेट को सबमिट किया जाता है.)
context ऑब्जेक्ट में चाइल्ड ऑब्जेक्ट होते हैं, जो अनुरोध के इन मैसेज को दिखाते हैं:
context.proxyRequest और context.targetRequest. इन ऑब्जेक्ट की मदद से, अनुरोध फ़्लो में मौजूद उन प्रॉपर्टी को ऐक्सेस किया जा सकता है जो आपके JavaScript कोड के दायरे में आती हैं.
ध्यान दें: अनुरोध फ़्लो में इन प्रॉपर्टी को ऐक्सेस करने के लिए, शॉर्टहैंड ऑब्जेक्ट request का भी इस्तेमाल किया जा सकता है. request ऑब्जेक्ट, context.proxyRequest या context.targetRequest में से किसी एक को रेफ़र करता है. यह इस बात पर निर्भर करता है कि आपके JavaScript कोड को फ़्लो में कहां लागू किया जाता है.
context.*Request child object properties
| प्रॉपर्टी का नाम | ब्यौरा |
|---|---|
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 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/> XML ऑब्जेक्ट के एलिमेंट को इस तरह ऐक्सेस करें: 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.*Response child objects
एपीआई प्रॉक्सी में एक्ज़ीक्यूट होने वाले हर एचटीटीपी लेन-देन के लिए, दो रिस्पॉन्स मैसेज ऑब्जेक्ट बनाए जाते हैं: एक इनबाउंड (बैकएंड सेवा से मिला जवाब) और दूसरा आउटबाउंड (क्लाइंट को वापस भेजा गया जवाब).
कॉन्टेक्स्ट ऑब्जेक्ट में चाइल्ड ऑब्जेक्ट होते हैं. ये ऑब्जेक्ट, जवाब के इन मैसेज को दिखाते हैं:
context.proxyResponse और context.targetResponse. इन ऑब्जेक्ट की मदद से, रिस्पॉन्स फ़्लो में मौजूद प्रॉपर्टी को ऐक्सेस किया जा सकता है. जब आपका JavaScript कोड चलता है, तब यह स्कोप में होता है.
ध्यान दें: रिस्पॉन्स फ़्लो से इन प्रॉपर्टी को ऐक्सेस करने के लिए, शॉर्टहैंड ऑब्जेक्ट response का भी इस्तेमाल किया जा सकता है. response ऑब्जेक्ट, context.proxyResponse या context.targetResponse में से किसी एक को रेफ़र करता है. यह इस बात पर निर्भर करता है कि आपके JavaScript कोड को फ़्लो में कहां लागू किया जाता है.
context.*Response ऑब्जेक्ट की प्रॉपर्टी
| प्रॉपर्टी का नाम | ब्यौरा |
|---|---|
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 फ़ॉर्म का इस्तेमाल करके XML के क्रम में आगे बढ़ा जा सकता है. दूसरे सिंटैक्स का इस्तेमाल करके, क्रम में मौजूद सभी आइटम को ऐक्सेस नहीं किया जा सकता.
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 कॉलआउट करना
httpClient का इस्तेमाल करके, किसी भी यूआरएल पर एक साथ कई एसिंक्रोनस एचटीटीपी अनुरोध किए जा सकते हैं. ऐसा एपीआई प्रॉक्सी फ़्लो में एक्ज़ीक्यूट होने वाले कस्टम JavaScript कोड से किया जा सकता है.
httpClient ऑब्जेक्ट, Apigee Edge JavaScript ऑब्जेक्ट मॉडल से दिखता है.
httpClient के बारे में जानकारी
httpClient ऑब्जेक्ट, JavaScript ऑब्जेक्ट मॉडल के ज़रिए Apigee Edge पर चलने वाले कस्टम JavaScript कोड के लिए उपलब्ध कराया जाता है. किसी एपीआई प्रॉक्सी में कस्टम JavaScript अटैच करने के लिए, JavaScript नीति का इस्तेमाल करें. नीति लागू होने पर, कस्टम JavaScript कोड लागू होता है.
httpClient ऑब्जेक्ट, कंपोज़िट सेवाओं या मैशअप को डेवलप करने के लिए फ़ायदेमंद होता है. उदाहरण के लिए, कई बैकएंड कॉल को एक ही एपीआई तरीके में इकट्ठा किया जा सकता है.
आम तौर पर, इस ऑब्जेक्ट का इस्तेमाल ServiceCallout नीति के विकल्प के तौर पर किया जाता है.
यहां इस्तेमाल का सामान्य पैटर्न दिया गया है. Request ऑब्जेक्ट को इंस्टैंशिएट करें. इसे कोई यूआरएल असाइन करें. उदाहरण के लिए, उस बैकएंड सेवा के लिए जिसे आपको कॉल करना है. इसके बाद, उस Request ऑब्जेक्ट के साथ httpClient.send को कॉल करें.
var myRequest = new Request(); myRequest.url = "http://www.example.com"; var exchangeObj = httpClient.send(myRequest);
httpClient रेफ़रंस
एचटीटीपी क्लाइंट दो तरीके दिखाता है: 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.proxyResponse ऑब्जेक्ट की तरह ही तरीके और प्रॉपर्टी होती हैं. कॉन्टेक्स्ट ऑब्जेक्ट की खास जानकारी देखें.getError(): (string) अगर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 कम्यूनिटी पर, इससे जुड़े ये लेख मिल सकते हैं: