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

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

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

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

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

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

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

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

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

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

सबसे पहले, दूसरे तरीकों पर विचार करें,

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

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

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

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

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

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

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

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

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

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

नमस्ते Java कॉलआउट

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

  • अगर "name" वैल्यू के साथ "उपयोगकर्ता नाम" हेडर पास किया जाता है, तो प्रॉक्सी यह दिखाता है:

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

    "Hello, Guest!"
    

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

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

  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 कॉलआउट कोड के लिए, इंपोर्ट किए गए पैकेज ज़रूरी हैं. इन क्लास में ऐसे तरीके बताए गए हैं जिनका इस्तेमाल करके, प्रॉक्सी प्रोग्राम चलाने का कॉन्टेक्स्ट ऐक्सेस किया जा सकता है. हम जल्द ही इस कोड को कंपाइल और डिप्लॉय करने का तरीका बताएंगे.
    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 रेपो में ज़रूरी JAR डिपेंडेंसी इंस्टॉल करती है.
  3. cd को 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 है. हालांकि, अगर एज प्राइवेट क्लाउड का इस्तेमाल किया जा रहा है, तो आपका डोमेन अलग हो सकता है.
  3. setenv.sh फ़ाइल सेव करें.
  4. डिप्लॉय स्क्रिप्ट चलाएं:

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

    ./invoke.sh
    

    शुरू करने की स्क्रिप्ट एक cURL निर्देश को कॉल करती है, जो ऐसा दिखता है:

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

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

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

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

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

मैसेज असाइन करने की नीति

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

<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 डायरेक्ट्री में शामिल किया जा सकता है.
  • एक्ज़ीक्यूशन इंटरफ़ेस लागू करता है. एपीआई प्रॉक्सी में एक्ज़ीक्यूट किए जाने वाले किसी भी Java कोड को, एक्ज़ीक्यूशन लागू करना होगा.
  • Java की कॉलआउट नीति में कोई असल कोड नहीं है. इसके बजाय, Java कॉलआउट नीति ऐसे Java 'रिसॉर्स' के बारे में बताती है जिसे आपको JAR में पैकेज करना होगा.
  • पैकेज के ऐसे नाम जिनसे बचें: Java कॉलआउट में, पैकेज के नाम के तौर पर io.apigee या com.apigee का इस्तेमाल न करें. इन्हें रिज़र्व किया जाता है और अन्य Apigee मॉड्यूल में इनका इस्तेमाल किया जाता है.
  • अगर आपका Java कॉलआउट स्वतंत्र JAR फ़ाइलों के रूप में पैकेज की गई तीसरे पक्ष की कुछ और लाइब्रेरी पर निर्भर करता है, तो उन JAR फ़ाइलों को /resources/java डायरेक्ट्री में भी रखें, ताकि यह पक्का किया जा सके कि वे रनटाइम के दौरान सही तरीके से लोड हों.
  • अगर कई JAR हैं, तो उन्हें अतिरिक्त संसाधनों के तौर पर जोड़ें. आपको दूसरी JAR फ़ाइलों के लिए, नीति के कॉन्फ़िगरेशन में बदलाव करने की ज़रूरत नहीं है. उन्हें /resources/java में डालना काफ़ी है.
  • Java JAR अपलोड करने के बारे में ज़्यादा जानकारी के लिए, संसाधन फ़ाइलें देखें.