Java कॉलआउट एक्सटेंशन बनाने का तरीका

आपको Apigee Edge का दस्तावेज़ दिख रहा है.
Apigee X के दस्तावेज़ पर जाएं.
जानकारी

Java कॉलआउट क्या होता है?

Apigee Edge, कई तरह की नीतियां उपलब्ध कराता है. ये नीतियां, एपीआई मैनेजमेंट से जुड़ी सामान्य ज़रूरतों को पूरा करती हैं. जैसे, सुरक्षा, डेटा ट्रांसफ़ॉर्मेशन, ट्रैफ़िक मैनेजमेंट वगैरह.

हालांकि, कुछ मामलों में आपके एपीआई को कस्टम व्यवहार की ज़रूरत होती है, जिसे स्टैंडर्ड नीति में लागू नहीं किया जाता है. इन मामलों में, Apigee कई विकल्प उपलब्ध कराता है. इनकी मदद से, एपीआई के व्यवहार को अपनी ज़रूरत के मुताबिक स्क्रिप्ट या कोड किया जा सकता है. इसके लिए, Java में अपनी ज़रूरत के हिसाब से बदलाव किया जा सकता है.

Java के साथ काम करने वाले वर्शन के बारे में जानने के लिए, काम करने वाले सॉफ़्टवेयर और उनके वर्शन लेख पढ़ें.

मैं प्रॉक्सी में Java कोड का इस्तेमाल कैसे करूं?

Java कॉलआउट नीति की मदद से, Java कोड को किसी प्रॉक्सी फ़्लो में कॉल किया जा सकता है. आपके Java कोड को Edge से जुड़ी कुछ खास Java इंटरफ़ेस लागू करने होंगे. इससे कोड, एक्ज़ीक्यूट की जा रही प्रॉक्सी के साथ इंटरैक्ट कर पाएगा. उदाहरण के लिए, Java के ऐसे तरीके मौजूद हैं जिनसे प्रॉक्सी के मौजूदा फ़्लो कॉन्टेक्स्ट में हेडर, क्वेरी पैरामीटर, फ़्लो वैरिएबल, और अन्य इकाइयों को सेट और ऐक्सेस किया जा सकता है.

मुझे Java कॉलआउट का इस्तेमाल कब करना चाहिए?

आइए, उन स्थितियों पर नज़र डालते हैं जिनमें Java कॉलआउट काम के होते हैं. साथ ही, उन स्थितियों पर भी नज़र डालते हैं जिनमें आपको अन्य तरीकों का इस्तेमाल करना चाहिए.

सबसे पहले, अन्य तरीकों पर विचार करें

Java कॉलआउट का इस्तेमाल करने से पहले, ध्यान दें कि इसके बजाय इस्तेमाल किए जा सकने वाले अन्य तरीके भी हो सकते हैं. उदाहरण के लिए:

  • रिमोट सेवाओं के लिए एचटीटीपी एपीआई कॉल जैसी हल्की-फुल्की कार्रवाइयों के लिए, ServiceCallout नीति का इस्तेमाल करें. सेवा कॉलआउट एक्सटेंशन से जुड़ी नीति देखें.
  • मैसेज के कॉन्टेंट के साथ आसान इंटरैक्शन के लिए, JavaScript या Python भाषाओं का इस्तेमाल किया जा सकता है. जैसे, एचटीटीपी हेडर, पैरामीटर या मैसेज के कॉन्टेंट में बदलाव करना या उन्हें निकालना.

Java कोड में क्या किया जा सकता है

Java कॉलआउट में ये बुनियादी कार्रवाइयां की जा सकती हैं:

  • अनुरोध या जवाब के मैसेज की जांच करना या उनमें बदलाव करना
  • फ़्लो वैरिएबल को पाना और सेट करना. Edge फ़्लो वैरिएबल को ऐक्सेस करने के लिए, Java के तरीकों का इस्तेमाल किया जा सकता है. अगर आपको कुंजी-वैल्यू मैप (केवीएम) की जानकारी ऐक्सेस करनी है, तो केवीएम नीति का इस्तेमाल करें. इसके बाद, फ़्लो वैरिएबल को केवीएम वैल्यू असाइन करें. इसके बाद, Java कॉलआउट में फ़्लो वैरिएबल को ऐक्सेस किया जा सकता है.
  • बाहरी सेवाओं को कॉल करना
  • गड़बड़ियों की जानकारी देना
  • गड़बड़ी के मैसेज और स्टेटस कोड में बदलाव करना

Java कोड में क्या नहीं किया जा सकता

ज़्यादातर सिस्टम कॉल की अनुमति नहीं है. आपके पास ये काम करने का विकल्प नहीं है:

  • फ़ाइल सिस्टम में मौजूद डेटा को पढ़ता है या उसमें डेटा लिखता है. इसका मतलब है कि इंटरनल फ़ाइल सिस्टम में पढ़ने/लिखने के लिए, किसी भी Java पैकेज का इस्तेमाल नहीं किया जा सकता. हालांकि, बाहरी रिमोट कॉल किए जा सकते हैं.
  • मशीन पर मौजूद मौजूदा प्रोसेस, प्रोसेस की सूची या सीपीयू/मेमोरी के इस्तेमाल के बारे में जानकारी पाएं.
  • `expressions-1.0.0.jar` और `message-flow-1.0.0.jar` में सोर्स कोड ऐक्सेस करें.

हालांकि, ऐसा हो सकता है कि कुछ कॉल काम करें. हालांकि, इन कॉल के लिए सहायता उपलब्ध नहीं है. साथ ही, इन्हें किसी भी समय बंद किया जा सकता है. अपने कोड में इस तरह के कॉल करने से बचें.

Apigee Edge में शामिल Java लाइब्रेरी का इस्तेमाल न करें या उन पर भरोसा न करें. ये लाइब्रेरी, सिर्फ़ Edge प्रॉडक्ट की सुविधाओं के लिए हैं. इस बात की कोई गारंटी नहीं है कि कोई लाइब्रेरी, रिलीज़ के बाद भी उपलब्ध रहेगी. अगर आपको ऐसी लाइब्रेरी का इस्तेमाल करना है, तो सिर्फ़ नॉन-प्रोडक्शन डेमोंस्ट्रेशन में इनका इस्तेमाल करें.

Hello Java कॉलआउट

आइए, Java कॉलआउट के एक बुनियादी उदाहरण को देखें. इस उदाहरण में, हम Java कॉलआउट के साथ एक सामान्य प्रॉक्सी बनाते हैं. यह "hello world" रिस्पॉन्स दिखाता है. प्रॉक्सी, इन दो जवाबों में से कोई एक जवाब दे सकती है:

  • अगर "username" हेडर में "name" वैल्यू पास की जाती है, तो प्रॉक्सी यह जवाब देती है:

    Hello, <name>!
  • अगर आपने हेडर नहीं दिया है, तो प्रॉक्सी सिर्फ़ यह जवाब देगी:

    "Hello, Guest!"

स्टार्टर प्रोजेक्ट डाउनलोड करना

हमने Apigee api-platform-samples रिपॉज़िटरी में, GitHub पर आपके लिए एक बुनियादी प्रोजेक्ट तैयार किया है.

  1. अपने सिस्टम पर api-platform-samples को डाउनलोड या क्लोन करें.
  2. अपनी पसंद के टर्मिनल या कोड एडिटर में, api-platform-samples/doc-samples/java-hello प्रोजेक्ट पर जाएं.

Java कोड लिखना

  1. Java सोर्स फ़ाइल java-hello/callout/src/main/java/HelloJava.java खोलें. यह फ़ाइल, मुख्य Java क्लास का स्केलेटन वर्शन है. हम इसे लागू करेंगे. Edge Java Callout कोड के लिए, इंपोर्ट किए गए पैकेज ज़रूरी हैं. इन क्लास में ऐसे तरीके दिए गए हैं जिनकी मदद से, प्रॉक्सी के एक्ज़ीक्यूशन कॉन्टेक्स्ट को ऐक्सेस किया जा सकता है. हम इस कोड को कंपाइल और डिप्लॉय करने का तरीका जल्द ही बताएंगे.
    package com.apigeesample;
    
    import com.apigee.flow.execution.ExecutionContext;
    import com.apigee.flow.execution.ExecutionResult;
    import com.apigee.flow.execution.spi.Execution;
    import com.apigee.flow.message.MessageContext;
    
    
    public class HelloJava implements Execution {
    
            public ExecutionResult execute(MessageContext messageContext, ExecutionContext executionContext) {
                    
                    try {
    
                            // Your code here.
                
                return ExecutionResult.SUCCESS;
    
                    } catch (Exception e) {
                            return ExecutionResult.ABORT;
                    }
            }
    
    }
  2. कमेंट की गई लाइन // Your code here की जगह यह कोड डालें:

    String name = messageContext.getMessage().getHeader("username");
    
    if (name != null && name.length()>0) {
            messageContext.getMessage().setContent("Hello, " + name + "!");
            messageContext.getMessage().removeHeader("username");
    } else {
            messageContext.getMessage().setContent("Hello, Guest!");
    }
  3. फ़ाइल सेव करें.


Maven की मदद से अपना कोड कंपाइल करें

प्रोजेक्ट को इस तरह से सेट अप किया जाता है कि Maven के साथ कंपाइल किया जा सके. अगर आपको javac का इस्तेमाल करना है, तो हम Maven के उदाहरण के बाद एक उदाहरण शामिल करेंगे.

  1. पक्का करें कि आपने Maven इंस्टॉल किया हो:

    mvn -version
  2. स्क्रिप्ट java-hello/buildsetup.sh को लागू करें. यह स्क्रिप्ट, आपकी लोकल Maven repo में ज़रूरी JAR डिपेंडेंसी इंस्टॉल करती है.
  3. java-hello/callout डायरेक्ट्री पर जाएं.
  4. Maven को लागू करें:

    mvn clean package
  5. अगर आपको लगता है, तो पुष्टि करें कि JAR फ़ाइल edge-custom-policy-java-hello.jar को java-hello/apiproxy/resources/java में कॉपी किया गया है. यह JAR फ़ाइलों के लिए ज़रूरी जगह है. इन फ़ाइलों को प्रॉक्सी के साथ डिप्लॉय किया जाता है.

javac के साथ कंपाइल करें (ज़रूरी नहीं)

पिछले सेक्शन में, Maven कमांड का इस्तेमाल करके ज़रूरी Java JAR फ़ाइल अपने-आप जनरेट की जाती है. इसके अलावा, अगर आपको कोड को कंपाइल करने के लिए javac का इस्तेमाल करना है, तो java-hello डायरेक्ट्री से यहां दिए गए कोड की तरह कुछ कोड इस्तेमाल किया जा सकता है. ज़रूरी JAR फ़ाइलें, आपको java-hello/lib डायरेक्ट्री में मिलेंगी.

  1. cd को api-platform-samples/doc-samples/java-hello पर सेट करें.
  2. पक्का करें कि आपके पाथ में javac मौजूद हो.

    javac -version
  3. यहां दी गई javac कमांड चलाएं:

    javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/HelloJava.java
    इससे com/apigeesample/HelloJava.class बन जाता है.
  4. apiproxy/resources/java डायरेक्ट्री में कंपाइल की गई क्लास वाली JAR फ़ाइल बनाएं. यह JAR फ़ाइलों के लिए ज़रूरी जगह है. इन फ़ाइलों को प्रॉक्सी के साथ डिप्लॉय किया जाता है. इसके लिए, java-hello डायरेक्ट्री में यह कमांड चलाएं. आखिर में पीरियड लगाना न भूलें.

    jar cvf apiproxy/resources/java/edge-custom-policy-java-hello.jar -C com .
    

प्रॉक्सी को डिप्लॉय करना और कॉल करना

./java-hello डायरेक्ट्री में डिप्लॉय स्क्रिप्ट दी गई है. हालांकि, इसे चलाने से पहले, आपको इसे सेट अप करना होगा.

  1. cd api-platform-samples/doc-samples/java-hello पर सेट करें
  2. अगर आपने अब तक ऐसा नहीं किया है, तो फ़ाइल ../../setup/setenv.sh खोलें और उसमें बदलाव करें. इसके लिए, Apigee खाते की जानकारी का इस्तेमाल करें. जैसे, आपका उपयोगकर्ता नाम (आपके खाते से जुड़ा ईमेल पता), आपके संगठन का नाम, और एपीआई मैनेजमेंट कॉल करने के लिए इस्तेमाल किया जाने वाला डोमेन. उदाहरण के लिए, Edge क्लाउड के लिए डोमेन https://api.enterprise.apigee.com है. हालांकि, अगर Edge Private Cloud का इस्तेमाल किया जा रहा है, तो आपका डोमेन अलग हो सकता है.
  3. setenv.sh फ़ाइल सेव करें.
  4. डिप्लॉय स्क्रिप्ट को लागू करें:

    ./deploy.sh
  5. अगर डिप्लॉयमेंट पूरा हो जाता है, तो Invoke स्क्रिप्ट को एक्ज़ीक्यूट करें:

    ./invoke.sh

    invoke स्क्रिप्ट, cURL कमांड को कॉल करती है. यह कमांड ऐसी दिखती है:

    curl  http://$org-$env.$api_domain/java-hello -H "username:Will"

    इससे "नमस्ते, विल!

    नाम बदलने के लिए, invoke.sh स्क्रिप्ट में बदलाव किया जा सकता है. इसके अलावा, अगर हेडर हटाने के लिए cURL कॉल में बदलाव किया जाता है, तो कमांड "Hello, Guest!" दिखाती है.

प्रॉक्सी के बारे में जानकारी

आइए, इस प्रॉक्सी में इस्तेमाल की गई नीतियों की तुरंत जांच करें. ध्यान दें कि प्रॉक्सी फ़्लो में नीतियां कहाँ और क्यों लागू की जाती हैं.

AssignMessage नीति

ProxyEndpoint के अनुरोध फ़्लो में, AssignMessage नीति अटैच की गई है. यह अनुरोध से उपयोगकर्ता नाम वाले हेडर को कॉपी करता है और उसे रिस्पॉन्स को असाइन करता है. इस ऑपरेशन से, रिस्पॉन्स फ़्लो से जुड़ी Java Callout नीति को उपयोगकर्ता नाम वाले हेडर को ऐक्सेस करने की अनुमति मिलती है. साथ ही, वह हेडर की वैल्यू का इस्तेमाल करके कस्टम रिस्पॉन्स बॉडी बना सकती है.

<AssignMessage async="false" continueOnError="false" enabled="true" name="CopyHeader">     
    <DisplayName>CopyHeader</DisplayName>     
    <Copy source="request">         
        <Headers>             
          <Header name="username"/>         
        </Headers>     
    </Copy>     
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>     
    <AssignTo createNew="false" transport="http" type="response"/> 
</AssignMessage>

Java कॉलआउट से जुड़ी नीति

Java कॉलआउट नीति, रिस्पॉन्स फ़्लो से जुड़ी होती है. ऐसा इसलिए होता है, क्योंकि कस्टम Java कोड, रिस्पॉन्स हेडर और मैसेज में बदलाव करता है. नीति के ClassName एलिमेंट से, उस मुख्य क्लास के बारे में पता चलता है जिसे नीति लागू करने के लिए इस्तेमाल किया जाता है. ResourceURL एलिमेंट, उस JAR फ़ाइल का नाम है जिसे आपने बनाया है और प्रॉक्सी की resources/java डायरेक्ट्री में जोड़ा है.

<JavaCallout name="hello-java">         
    <ClassName>com.apigeesample.HelloJava</ClassName>         
    <ResourceURL>java://edge-custom-policy-java-hello.jar</ResourceURL> 
</JavaCallout>

Java कॉलआउट के बारे में ज़रूरी जानकारी

Java कॉलआउट लागू करने के बारे में ध्यान रखने वाली ज़रूरी बातें ये हैं:

  • यह com.apigee.flow.execution और com.apigee.flow.message पैकेज से क्लास इंपोर्ट करता है. इन पैकेज को JAR फ़ाइल में शामिल किया जाना चाहिए. इस फ़ाइल को पैकेज और डिप्लॉय किया जाता है. मैनेजमेंट यूज़र इंटरफ़ेस (यूआई) प्रॉक्सी एडिटर की मदद से, Java JAR अपलोड किया जा सकता है. इसके अलावा, इसे एपीआई प्रॉक्सी में /resources/java डायरेक्ट्री में शामिल किया जा सकता है. ये एपीआई प्रॉक्सी, स्थानीय तौर पर डेवलप की जाती हैं.
  • यह Execution इंटरफ़ेस को लागू करता है. एपीआई प्रॉक्सी में एक्ज़ीक्यूट किए गए किसी भी Java कोड में, Execution को लागू करना ज़रूरी है.
  • Java कॉलआउट नीति में कोई कोड शामिल नहीं होता. इसके बजाय, Java Callout नीति, Java 'resource' का रेफ़रंस देती है. इसे आपको JAR में पैकेज करना होगा.
  • इन पैकेज के नामों का इस्तेमाल न करें: Java कॉलआउट में पैकेज के नाम के तौर पर io.apigee या com.apigee का इस्तेमाल न करें. ये आरक्षित हैं और इनका इस्तेमाल Apigee के अन्य मॉड्यूल करते हैं.
  • अगर आपका Java कॉलआउट, तीसरे पक्ष की उन अतिरिक्त लाइब्रेरी पर निर्भर करता है जिन्हें अलग-अलग JAR फ़ाइलों के तौर पर पैकेज किया गया है, तो उन JAR फ़ाइलों को /resources/java डायरेक्ट्री में भी रखें. इससे यह पक्का किया जा सकेगा कि वे रनटाइम के दौरान सही तरीके से लोड हो रही हैं.
  • अगर एक से ज़्यादा JAR हैं, तो उन्हें अतिरिक्त संसाधनों के तौर पर जोड़ें. अतिरिक्त JAR फ़ाइलों को रेफ़र करने के लिए, आपको नीति के कॉन्फ़िगरेशन में बदलाव करने की ज़रूरत नहीं है. उन्हें /resources/java में शामिल करना काफ़ी है.
  • Java JAR अपलोड करने के बारे में ज़्यादा जानने के लिए, संसाधन फ़ाइलें देखें.