يمكنك استخدام خدمة Google APIs Discovery Service لإنشاء مجموعة متنوعة من الأدوات المختلفة لاستخدامها مع Google APIs. ومع ذلك، فإنّ الغرض الأساسي من مستند Discovery هو السماح لشركة Google بإنشاء مكتبات برامج للعملاء بلغات برمجة مختلفة. يوضّح هذا المستند كيفية إنشاء مكتبة برامج مخصّصة لعميل Google APIs.
إنّ مكتبة البرامج الثابتة والكاملة الميزات هي أداة معقّدة قد يستغرق تطويرها شهورًا. في المقابل، يمكن تقسيم التعليمات العامة لإنشاء مكتبة برامج بسيطة لواجهات Google API إلى ثلاث خطوات بسيطة:
- استرجاع مستند Discovery وإنشاء مساحة واجهة برمجة التطبيقات
- إنشاء طلب
- إجراء مكالمة واسترداد الردّ
يتم وصف هذه الخطوات بمزيد من التفصيل في الأقسام التالية. يمكنك أيضًا الاطّلاع على نموذج برنامج Simple APIs client في قسم "الأمثلة" لمعرفة كيفية ربط هذه التعليمات بالرمز.
استرجاع مستند Discovery
قبل البدء في تنفيذ مكتبة برامج، هناك بعض المتطلبات الأساسية التي تؤثر في طريقة المتابعة في مسار التطوير. على سبيل المثال، قد تكون لغة البرمجة التي تختارها ذات نوع أو بدون نوع، وإذا كانت ذات نوع، فقد تكون ذات نوع ثابت أو ديناميكي. وقد يتم تجميعها أو تفسيرها. ستوجّه هذه المتطلبات طريقة استهلاكك لمستند Discovery واستخدامه.
مهمة التطوير الأولى هي استرداد مستند Discovery. تحدّد المتطلبات التي حدّدتها استراتيجيتك بشأن الوقت الذي يجب فيه جلب المستند. على سبيل المثال، في لغة ذات كتابة ثابتة، يمكنك استرداد مستند Discovery في وقت مبكر من العملية ثم إنشاء رمز للتعامل مع واجهة برمجة التطبيقات المحددة الموضّحة في مستند Discovery. بالنسبة إلى لغة ذات كتابة قوية، يمكنك إنشاء بعض الرموز البرمجية وإنشاء مكتبة مجمّعة. بالنسبة إلى لغة ذات كتابة ديناميكية، يمكنك إنشاء بنى البرمجة بشكل غير مباشر للتفاعل مع واجهة برمجة التطبيقات أثناء استخدام مساحة البرمجة.
إنشاء طلب
يتضمّن إنشاء الطلبات خطوتَين منفصلتَين:
- إنشاء نص الطلب
- إنشاء عنوان URL للطلب
عليك تحويل نص الطلب، إن وُجد، من تمثيل مناسب للغة إلى تنسيق النقل الصحيح. على سبيل المثال، في مكتبة عميل Java، قد يكون هناك فئة لكل نوع طلب تتيح معالجة بيانات الطلب الآمنة من حيث النوع ويمكن تسلسلها إلى JSON.
إنشاء عنوان URL للطلب هو عملية أكثر تعقيدًا بعض الشيء.
تستخدِم السمة path
لكل طريقة في واجهة برمجة التطبيقات بنية نموذج معرّف الموارد المنتظم (URI) الإصدار 04. قد تحتوي هذه السمة على متغيرات محاطة بأقواس معقوفة. في ما يلي مثال على السمة path
مع متغيرات:
/example/path/var
في المسار أعلاه، var
هو متغيّر. تأتي قيمة هذا المتغيّر من القسم parameters
في مستند Discovery الخاص بهذه الطريقة. يحتوي كل اسم متغيّر على قيمة مقابلة في الكائن parameters
. في المثال أعلاه، هناك معلَمة باسم var
في القسم parameters
(وقيمتها location
هي path
، للإشارة إلى أنّها متغيّر مسار).
عند تقديم طلب، عليك استبدال القيمة var
في عنوان URL.
على سبيل المثال، إذا اختار مستخدم المكتبة خيارًا يضبط var
على القيمة foo
، سيكون عنوان URL الجديد هو /example/path/foo
.
يُرجى أيضًا العِلم أنّ السمة path
هي معرّف موارد منتظم (URI) نسبي. لاحتساب معرّف الموارد الموحّد المطلق، اتّبِع الخطوات التالية:
-
إذا كنت تعرف موقعك الجغرافي (المنطقة)، وكان مستند Discovery يتضمّن السمة
endpoints
، تحقّق مما إذا كان موقعك الجغرافي مدرجًا في قائمةendpoints
. إذا كان الأمر كذلك، احصل علىendpointUrl
من قائمةendpoints
التي تتطابق فيها قيمةlocation
مع القيمة التي أدخلتها. -
إذا لم يكن هناك موقع إلكتروني
endpoints
في مستند Discovery أو لم يكن موقعك الجغرافي مضمّنًا في قائمةendpoints
أو أردت استهداف نقطة النهاية العامة، يمكنك الحصول على الموقع الإلكترونيrootUrl
من المستوى الأعلى لمستند Discovery.على سبيل المثال، تكون قيمة السمة
rootUrl
في مستند الاكتشاف الخاص بواجهة برمجة التطبيقات Service Usage API كما يلي:https://serviceusage.googleapis.com/
-
احصل على
servicePath
من المستوى الأعلى لمستند Discovery. على سبيل المثال، تكون السمةservicePath
في مستند Discovery الخاص بواجهة برمجة التطبيقات Service 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
لا تحتاج إلى مفتاح واجهة برمجة تطبيقات لطلب بيانات من Service Usage API. ومع ذلك، إذا كانت واجهة برمجة التطبيقات التي تستدعيها تتطلّب مفتاح واجهة برمجة تطبيقات، يمكنك إضافة مفتاح واجهة برمجة التطبيقات إلى سلسلة طلب البحث في معرّف الموارد المنتظم (URI) على النحو التالي:
REQUEST_URI?key=API_KEY
إجراء مكالمة والتعامل مع الرد
بعد إرسال الطلب، عليك إلغاء تسلسل الردّ إلى التمثيل المناسب للغة، مع الحرص على معالجة حالات الخطأ التي قد تحدث، سواء في نقل HTTP الأساسي أو رسائل الخطأ التي يتم إنشاؤها من خدمة واجهة برمجة التطبيقات. تم توثيق تنسيق الأخطاء كجزء من دليل أسلوب JSON من Google.
أمثلة
يعرض القسم التالي مثالاً بسيطًا على مكتبة برامج لواجهات برمجة التطبيقات.
برنامج واجهة برمجة التطبيقات البسيطة
في ما يلي مثال على مكتبة برامج بسيطة جدًا مكتوبة بلغة Python3. ينشئ العميل واجهة للتفاعل مع Service 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 لواجهة برمجة التطبيقات Service Usage API وتحليله إلى بنية بيانات. بما أنّ Python هي لغة ذات كتابة ديناميكية، يمكن جلب مستند Discovery في وقت التشغيل.
- الخطوة 2.أ: إنشاء معرّف الموارد المنتظم الأساسي يتم احتساب معرّف الموارد المنتظم الأساسي.
-
الخطوة 2(ب): إنشاء الطلب عند استدعاء طريقة في مجموعة، يتم توسيع نموذج URI باستخدام المَعلمات التي تم تمريرها إلى الطريقة، ويتم وضع المَعلمات التي تتضمّن الموقع
query
في مَعلمات طلب البحث لعنوان URL. وأخيرًا، يتم إرسال طلب إلى عنوان URL الذي تم إنشاؤه باستخدام طريقة HTTP المحدّدة في مستند Discovery. -
الخطوة 3 (أ): إنشاء مساحة عرض العميل يتم إنشاء واجهة العميل من خلال الانتقال بشكل متكرّر إلى أسفل مستند Discovery الذي تم تحليله. لكل طريقة في القسم
methods
، يتم إرفاق طريقة جديدة بالكائنCollection
. بما أنّه يمكن تضمين المجموعات في مجموعات أخرى، نبحث عنresources
وننشئ بشكل متكرّر عنصرCollection
لجميع العناصر المضمّنة فيه إذا تم العثور على عنصر. يتم أيضًا إرفاق كل مجموعة مدمجة كسمة بكائنCollection
. -
الخطوة 3.ب: استخدام العميل يوضّح هذا المثال كيفية استخدام مساحة واجهة برمجة التطبيقات المضمّنة. يتم أولاً إنشاء عنصر خدمة من مستند Discovery، ثم يتم استخدام واجهة برمجة التطبيقات Service Usage لتفعيل Compute Engine API في المشروع
my-project
.