میتوانید از Google APIs Discovery Service برای ساخت انواع ابزارهای مختلف برای استفاده با Google API استفاده کنید. با این حال، هدف اصلی سند Discovery این است که به Google اجازه دهد تا کتابخانه های مشتری را به زبان های برنامه نویسی مختلف ایجاد کند. این سند توضیح میدهد که چگونه میتوانید یک کتابخانه مشتری سفارشی برای APIهای Google بسازید.
یک کتابخانه مشتری پایدار و با ویژگی های کامل ابزار پیچیده ای است که توسعه آن ممکن است ماه ها طول بکشد. با این حال، دستورالعمل های کلی برای ساخت یک کتابخانه کلاینت ساده برای Google API را می توان به سه مرحله ساده تقسیم کرد:
- واکشی سند Discovery و ساختن سطح API
- نوشتن یک درخواست
- برقراری تماس و دریافت پاسخ
این مراحل در قسمت های بعدی با جزئیات بیشتر توضیح داده شده است. همچنین میتوانید به نمونه سرویس گیرنده Simple APIs در بخش Examples نگاهی بیندازید تا ببینید این دستورالعملها چگونه به کد منطبق میشوند.
سند Discovery را واکشی کنید
قبل از شروع اجرای کتابخانه مشتری، برخی الزامات اساسی وجود دارد که بر نحوه ادامه مسیر توسعه خود تأثیر می گذارد. برای مثال، زبان برنامه نویسی انتخابی شما ممکن است تایپ شده یا بدون تایپ باشد. اگر تایپ شود می تواند به صورت استاتیک یا پویا تایپ شود. ممکن است تالیف یا تفسیر شود. این الزامات رویکرد شما را برای مصرف و استفاده از سند Discovery راهنمایی می کند.
اولین وظیفه توسعه واکشی سند Discovery است. استراتژی شما برای اینکه دقیقا چه زمانی سند باید واکشی شود، با الزاماتی که شناسایی کرده اید تعیین می شود. به عنوان مثال، در یک زبان تایپ ایستا، ممکن است سند Discovery را در مراحل اولیه واکشی کنید و سپس کدی را برای مدیریت API خاصی که توسط سند Discovery توضیح داده شده است، تولید کنید. برای یک زبان با تایپ قوی، ممکن است مقداری کد ایجاد کنید و یک کتابخانه کامپایل شده بسازید. برای یک زبان تایپ شده پویا، میتوانید ساختارهای برنامهنویسی را با تنبلی بسازید تا همزمان با استفاده از سطح برنامهنویسی، به API متصل شوند.
یک درخواست بنویسید
نوشتن یک درخواست شامل دو مرحله جداگانه است:
- تنظیم بدن درخواست.
- ساخت URL درخواست
شما باید بدنه درخواست را، در صورت وجود، از یک نمایش مناسب زبان به قالب سیم درست تبدیل کنید. به عنوان مثال، در یک کتابخانه کلاینت جاوا، ممکن است یک کلاس برای هر نوع درخواست وجود داشته باشد که امکان دستکاری دادههای درخواست را به صورت ایمن میدهد و در JSON قابل سریالسازی است.
ساخت URL درخواست فرآیند کمی پیچیده تر است.
ویژگی path
هر روش در API از دستور URI Template v04 استفاده می کند. این ویژگی ممکن است شامل متغیرهایی باشد که توسط بریس های فرفری احاطه شده اند. در اینجا یک مثال از یک ویژگی path
با متغیرها آورده شده است:
/example/path/var
در مسیر بالا، var
یک متغیر است. مقدار این متغیر از بخش parameters
سند Discovery برای آن روش میآید. نام هر متغیر دارای یک مقدار متناظر در شیء parameters
است. در مثال بالا، پارامتری به نام var
در قسمت parameters
وجود دارد (و خاصیت location
آن path
است که نشان می دهد متغیر مسیر است).
هنگام درخواست، باید مقدار var
را در URL جایگزین کنید. برای مثال، اگر کاربر کتابخانه انتخابی را انجام دهد که var
روی مقدار foo
قرار دهد، URL جدید /example/path/foo
خواهد بود.
همچنین توجه داشته باشید که ویژگی path
یک URI نسبی است. برای محاسبه URI مطلق، مراحل زیر را دنبال کنید:
- اگر مکان (منطقه) خود را میدانید و سند Discovery دارای ویژگی
endpoints
است، بررسی کنید که آیا مکان شما در لیستendpoints
وجود دارد یا خیر. اگر چنین است،endpointUrl
از لیستendpoints
کهlocation
آن با شما مطابقت دارد، بردارید. اگر ویژگی
endpoints
در سند Discovery وجود ندارد یا مکان شما در لیستendpoints
وجود ندارد یا میخواهید نقطه پایانی جهانی را هدف قرار دهید، ویژگیrootUrl
را از سطح بالای سند Discovery بگیرید.به عنوان مثال، ویژگی
rootUrl
در سند Discovery برای سرویس Usage API عبارت است از:https://serviceusage.googleapis.com/
servicePath
از سطح بالای سند Discovery بگیرید. برای مثال، ویژگیservicePath
در سند Discovery برای سرویس Usage API خالی است.آنها را به هم متصل کنید تا به دست آورید:
https://serviceusage.googleapis.com/
ویژگی
path
را بگیرید، آن را به عنوان یک الگوی URI گسترش دهید و نتایج آن بسط را با URI مرحله قبل ترکیب کنید. برای مثال، در متدserviceusage.services.enable
در v1 Service Usage API، مقدار ویژگیpath
v1/{+name}:enable
. بنابراین، URI کامل متد به صورت زیر است:https://serviceusage.googleapis.com/v1/{+name}:enable
برای تماس با سرویس Usage API نیازی به کلید API ندارید. با این حال، اگر API مورد نظر شما به یک کلید API نیاز دارد، میتوانید کلید API را به رشته درخواست URI اضافه کنید:
REQUEST_URI?key=API_KEY
تماس بگیرید و پاسخ را رسیدگی کنید
پس از ارسال درخواست، باید پاسخ را در بازنمایی زبان مناسب غیرمستقیم کنید، و مراقب باشید که شرایط خطایی که ممکن است رخ دهد - هم در انتقال HTTP اصلی و هم در پیام های خطای تولید شده از سرویس API. قالب خطاها به عنوان بخشی از راهنمای سبک JSON Google مستند شده است.
نمونه ها
بخش زیر یک مثال ساده از یک کتابخانه سرویس گیرنده API را ارائه می دهد.
سرویس گیرنده APIهای ساده
در زیر نمونه ای از یک کتابخانه کلاینت بسیار ساده نوشته شده در Python3 آورده شده است. مشتری یک رابط برای تعامل با سرویس Usage API می سازد، سپس از آن رابط برای فعال کردن Compute Engine API ( compute.googleapis.com
) در پروژه my-project
استفاده می کند.
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'))
اجزای حیاتی مشتری عبارتند از:
- مرحله 1: سند Discovery را واکشی کنید . سند Discovery برای سرویس Usage API بازیابی و در یک ساختار داده تجزیه می شود. از آنجایی که پایتون یک زبان تایپ پویا است، سند Discovery را می توان در زمان اجرا واکشی کرد.
- مرحله 2.a: URI پایه را بسازید . URI پایه محاسبه می شود.
- مرحله 2.b: درخواست را بنویسید . هنگامی که یک متد در مجموعه ای فراخوانی می شود، الگوی URI با پارامترهای ارسال شده به متد گسترش می یابد و پارامترهای دارای مکان
query
در پارامترهای پرس و جو URL قرار می گیرند. در نهایت یک درخواست با استفاده از روش HTTP که در سند Discovery مشخص شده است، به URL تشکیل شده ارسال می شود. - مرحله 3.a: ساختن سطح مشتری . سطح کلاینت با نزول بازگشتی بر روی سند Discovery تجزیه شده ساخته می شود. برای هر متد در بخش
methods
یک متد جدید به شیCollection
پیوست میشود. از آنجا که مجموعهها را میتوان تودرتو کرد، ما به دنبالresources
میگردیم و در صورت یافتن یک شیCollection
برای همه اعضای آن به صورت بازگشتی میسازیم. هر مجموعه تو در تو نیز به عنوان یک ویژگی به شیCollection
متصل می شود. - مرحله 3.b: از مشتری استفاده کنید . این نشان می دهد که چگونه از سطح API ساخته شده استفاده می شود. ابتدا یک شیء سرویس از سند Discovery ساخته میشود، سپس از Service Usage API برای فعال کردن Compute Engine API در پروژه
my-project
استفاده میشود.