Google APIs के साथ इस्तेमाल करने के लिए, अलग-अलग तरह के टूल बनाने के लिए, Google APIs Discovery Service का इस्तेमाल किया जा सकता है. हालांकि, Discovery document का मुख्य मकसद, Google को अलग-अलग प्रोग्रामिंग भाषाओं में क्लाइंट लाइब्रेरी बनाने की अनुमति देना है. इस दस्तावेज़ में, Google API के लिए कस्टम क्लाइंट लाइब्रेरी बनाने का तरीका बताया गया है.
स्थिर और पूरी सुविधाओं वाली क्लाइंट लाइब्रेरी एक जटिल टूल है. इसे बनाने में महीनों लग सकते हैं. हालांकि, Google API के लिए एक सामान्य क्लाइंट लाइब्रेरी बनाने के निर्देशों को तीन आसान चरणों में बांटा जा सकता है:
- खोज से जुड़ा दस्तावेज़ फ़ेच करना और एपीआई सरफेस बनाना
- अनुरोध लिखना
- कॉल करना और जवाब पाना
इन चरणों के बारे में ज़्यादा जानकारी, यहां दी गई है. इन निर्देशों को कोड में कैसे मैप किया जाता है, यह देखने के लिए उदाहरण सेक्शन में Simple APIs client का सैंपल भी देखा जा सकता है.
खोज से जुड़ा दस्तावेज़ फ़ेच करना
क्लाइंट लाइब्रेरी को लागू करने से पहले, कुछ बुनियादी शर्तें पूरी करनी होती हैं. इनसे यह तय होता है कि आपको डेवलपमेंट के लिए कौनसे तरीके अपनाने हैं. उदाहरण के लिए, आपकी चुनी गई प्रोग्रामिंग भाषा टाइप की गई या टाइप नहीं की गई हो सकती है. अगर इसे टाइप किया गया है, तो यह स्टैटिक या डाइनैमिक टाइप की गई हो सकती है. इसे कंपाइल या इंटरप्रेट किया जा सकता है. इन ज़रूरी शर्तों से, आपको डिस्कवरी दस्तावेज़ को इस्तेमाल करने और उसे समझने में मदद मिलेगी.
डेवलपमेंट का पहला टास्क, डिस्कवरी दस्तावेज़ को फ़ेच करना है. दस्तावेज़ को कब फ़ेच करना है, यह आपकी रणनीति से तय होता है. यह रणनीति, आपकी तय की गई ज़रूरी शर्तों के हिसाब से तय होती है. उदाहरण के लिए, स्टैटिक टाइप वाली भाषा में, प्रोसेस की शुरुआत में ही डिस्कवरी दस्तावेज़ फ़ेच किया जा सकता है. इसके बाद, डिस्कवरी दस्तावेज़ में बताए गए खास एपीआई को मैनेज करने के लिए कोड जनरेट किया जा सकता है. टाइप की जानकारी देने वाली भाषा के लिए, कुछ कोड जनरेट किए जा सकते हैं और कंपाइल की गई लाइब्रेरी बनाई जा सकती है. डाइनैमिक टाइप वाली भाषा के लिए, प्रोग्रामिंग स्ट्रक्चर को लेज़ी तरीके से बनाया जा सकता है. इससे प्रोग्रामिंग सरफेस का इस्तेमाल करते समय, एपीआई से इंटरफ़ेस किया जा सकता है.
अनुरोध लिखें
अनुरोध बनाने के लिए, इन दो चरणों को पूरा करना होता है:
- अनुरोध का मुख्य हिस्सा लिखना.
- अनुरोध यूआरएल बनाया जा रहा है.
अगर अनुरोध के मुख्य हिस्से में कोई जानकारी दी गई है, तो आपको उसे भाषा के हिसाब से सही तरीके से दिखाने वाले फ़ॉर्मैट से वायर फ़ॉर्मैट में बदलना होगा. उदाहरण के लिए, Java क्लाइंट लाइब्रेरी में, हर अनुरोध टाइप के लिए एक क्लास हो सकती है. इससे अनुरोध के डेटा को टाइप-सेफ़ तरीके से बदला जा सकता है. साथ ही, इसे JSON में क्रम से लगाया जा सकता है.
अनुरोध यूआरएल बनाने की प्रोसेस थोड़ी ज़्यादा पेचीदा होती है.
एपीआई में मौजूद हर तरीके की path
प्रॉपर्टी, यूआरआई टेंप्लेट v04 सिंटैक्स का इस्तेमाल करती है. इस प्रॉपर्टी में ऐसे वैरिएबल हो सकते हैं जिन्हें घुमावदार ब्रैकेट में रखा जाता है. यहां वैरिएबल के साथ path
प्रॉपर्टी का एक उदाहरण दिया गया है:
/example/path/var
ऊपर दिए गए पाथ में, var
एक वैरिएबल है. इस वैरिएबल की वैल्यू, उस तरीके के लिए डिस्कवरी दस्तावेज़ के parameters
सेक्शन से मिलती है. हर वैरिएबल के नाम की वैल्यू, parameters
ऑब्जेक्ट में मौजूद होती है. ऊपर दिए गए उदाहरण में, parameters
सेक्शन में var
नाम का एक पैरामीटर है. इसकी location
प्रॉपर्टी path
है, ताकि यह पता चल सके कि यह पाथ वैरिएबल है.
अनुरोध करते समय, आपको यूआरएल में var
की वैल्यू बदलनी होगी.
उदाहरण के लिए, अगर लाइब्रेरी का इस्तेमाल करने वाला व्यक्ति ऐसा विकल्प चुनता है जिससे var
की वैल्यू foo
पर सेट हो जाती है, तो नया यूआरएल /example/path/foo
होगा.
यह भी ध्यान दें कि path
प्रॉपर्टी, रिलेटिव यूआरआई है. ऐब्सलूट यूआरआई का हिसाब लगाने के लिए, यह तरीका अपनाएं:
-
अगर आपको अपनी जगह (क्षेत्र) के बारे में पता है और डिस्कवरी दस्तावेज़ में
endpoints
प्रॉपर्टी है, तो देखें कि आपकी जगहendpoints
सूची में मौजूद है या नहीं. अगर ऐसा है, तोendpoints
सूची में से वहendpointUrl
चुनें जिसकाlocation
आपकेlocation
से मेल खाता हो. -
अगर डिस्कवरी दस्तावेज़ में
endpoints
प्रॉपर्टी मौजूद नहीं है या आपकी जगह की जानकारीendpoints
सूची में मौजूद नहीं है या आपको ग्लोबल एंडपॉइंट को टारगेट करना है, तो डिस्कवरी दस्तावेज़ के टॉप लेवल सेrootUrl
प्रॉपर्टी पाएं.उदाहरण के लिए, Service Usage API के लिए खोज से जुड़े दस्तावेज़ में
rootUrl
प्रॉपर्टी यह है:https://serviceusage.googleapis.com/
-
डिस्कवरी दस्तावेज़ के सबसे ऊपर के लेवल से
servicePath
को पाएं. उदाहरण के लिए, Service Usage API के लिए Discovery document मेंservicePath
प्रॉपर्टी खाली है. -
इन दोनों को एक साथ जोड़ने पर, यह मिलेगा:
https://serviceusage.googleapis.com/
-
path
प्रॉपर्टी को चुनें. इसे यूआरआई टेंप्लेट के तौर पर बड़ा करें. इसके बाद, इस बड़े किए गए टेंप्लेट के नतीजों को पिछले चरण के यूआरआई के साथ जोड़ें. उदाहरण के लिए, v1 Service Usage API केserviceusage.services.enable
तरीके में,path
प्रॉपर्टी की वैल्यूv1/{+name}:enable
है. इसलिए, इस तरीके का पूरा यूआरआई यह है:https://serviceusage.googleapis.com/v1/{+name}:enable
Service Usage API को कॉल करने के लिए, आपको एपीआई पासकोड की ज़रूरत नहीं होती. हालांकि, अगर जिस एपीआई को कॉल किया जा रहा है उसके लिए एपीआई कुंजी की ज़रूरत है, तो यूआरआई की क्वेरी स्ट्रिंग में एपीआई कुंजी जोड़ी जा सकती है:
REQUEST_URI?key=API_KEY
कॉल करना और जवाब मैनेज करना
अनुरोध भेजने के बाद, आपको जवाब को सही भाषा में बदलना होगा. साथ ही, आपको गड़बड़ी की उन स्थितियों को भी हैंडल करना होगा जो हो सकती हैं. ये गड़बड़ियां, एचटीटीपी ट्रांसपोर्ट और एपीआई सेवा से जनरेट होने वाले गड़बड़ी के मैसेज, दोनों में हो सकती हैं. गड़बड़ियों के फ़ॉर्मैट के बारे में, Google JSON स्टाइल गाइड में बताया गया है.
उदाहरण
यहां एपीआई क्लाइंट लाइब्रेरी का एक आसान उदाहरण दिया गया है.
Simple APIs क्लाइंट
यहां Python3 में लिखी गई एक सामान्य क्लाइंट लाइब्रेरी का उदाहरण दिया गया है. क्लाइंट, Service Usage API के साथ इंटरैक्ट करने के लिए एक इंटरफ़ेस बनाता है. इसके बाद, उस इंटरफ़ेस का इस्तेमाल करके प्रोजेक्ट my-project
में Compute Engine API (compute.googleapis.com
) चालू करता है.
import httplib2 import json import uritemplate import urllib # Step 1: Fetch Discovery document DISCOVERY_URI = "https://serviceusage.googleapis.com/$discovery/rest?version=v1" h = httplib2.Http() resp, content = h.request(DISCOVERY_URI) discovery = json.loads(content) location = None # Set this to your location if appropriate use_global_endpoint = True # Set this to False if you want to target the endpoint for your location # Step 2.a: Construct base URI BASE_URL = None if not use_global_endpoint and location: if discovery['endpoints']: BASE_URL = next((item['endpointUrl'] for item in discovery['endpoints'] if item['location'] == location), None) if not BASE_URL: BASE_URL = discovery['rootUrl'] BASE_URL += discovery['servicePath'] class Collection(object): pass def createNewMethod(name, method): # Step 2.b Compose request def newMethod(**kwargs): body = kwargs.pop('body', None) url = urllib.parse.urljoin(BASE_URL, uritemplate.expand(method['path'], kwargs)) for pname, pconfig in method.get('parameters', {}).items(): if pconfig['location'] == 'path' and pname in kwargs: del kwargs[pname] if kwargs: url = url + '?' + urllib.parse.urlencode(kwargs) return h.request(url, method=method['httpMethod'], body=body, headers={'content-type': 'application/json'}) return newMethod # Step 3.a: Build client surface def build(discovery, collection): for name, resource in discovery.get('resources', {}).items(): setattr(collection, name, build(resource, Collection())) for name, method in discovery.get('methods', {}).items(): setattr(collection, name, createNewMethod(name, method)) return collection # Step 3.b: Use the client service = build(discovery, Collection()) print (serviceusage.services.enable(name='projects/my-project/services/compute.googleapis.com'))
क्लाइंट के मुख्य कॉम्पोनेंट ये हैं:
- पहला चरण: डिस्कवरी दस्तावेज़ फ़ेच करें. Service Usage API के लिए डिस्कवरी दस्तावेज़ को वापस पाया जाता है और उसे डेटा स्ट्रक्चर में पार्स किया जाता है. Python एक डाइनैमिक टाइप वाली भाषा है. इसलिए, डिस्कवरी दस्तावेज़ को रनटाइम में फ़ेच किया जा सकता है.
- दूसरा चरण: बेस यूआरआई बनाना. बेस यूआरआई का हिसाब लगाया जाता है.
-
दूसरा चरण: अनुरोध लिखना. जब किसी कलेक्शन पर कोई तरीका कॉल किया जाता है, तो यूआरआई टेंप्लेट को उस तरीके में पास किए गए पैरामीटर के साथ बड़ा किया जाता है. साथ ही,
query
लोकेशन वाले पैरामीटर को यूआरएल के क्वेरी पैरामीटर में रखा जाता है. आखिर में, डिस्कवरी दस्तावेज़ में बताई गई एचटीटीपी विधि का इस्तेमाल करके, कंपोज़ किए गए यूआरएल पर अनुरोध भेजा जाता है. -
तीसरा चरण: क्लाइंट सरफेस बनाना. क्लाइंट सरफेस को पार्स किए गए डिस्कवरी दस्तावेज़ पर बार-बार नीचे की ओर जाकर बनाया जाता है.
methods
सेक्शन में मौजूद हर तरीके के लिए,Collection
ऑब्जेक्ट से एक नया तरीका अटैच किया जाता है. कलेक्शन को नेस्ट किया जा सकता है. इसलिए, हमresources
की तलाश करते हैं. अगर कोईresources
मिल जाता है, तो हम उसके सभी सदस्यों के लिए, बार-बारCollection
ऑब्जेक्ट बनाते हैं. हर नेस्ट किए गए कलेक्शन कोCollection
ऑब्जेक्ट के एट्रिब्यूट के तौर पर भी अटैच किया जाता है. -
तीसरा चरण: क्लाइंट का इस्तेमाल करना. इससे पता चलता है कि एपीआई की बनाई गई सतह का इस्तेमाल कैसे किया जाता है. सबसे पहले, डिस्कवरी दस्तावेज़ से एक सेवा ऑब्जेक्ट बनाया जाता है. इसके बाद, Compute Engine API को प्रोजेक्ट
my-project
में चालू करने के लिए, Service Usage API का इस्तेमाल किया जाता है.