Usługi Discovery API Google możesz używać do tworzenia różnych narzędzi do korzystania z interfejsów API Google. Głównym celem dokumentu Discovery jest jednak umożliwienie Google tworzenia bibliotek klienta w różnych językach programowania. W tym dokumencie opisujemy, jak utworzyć niestandardową bibliotekę klienta interfejsów API Google.
Stabilna i w pełni funkcjonalna biblioteka klienta to złożone narzędzie, którego opracowanie może zająć wiele miesięcy. Ogólne instrukcje tworzenia prostej biblioteki klienta interfejsów API Google można jednak podzielić na 3 proste kroki:
- Pobieranie dokumentu Discovery i tworzenie interfejsu API
- Tworzenie prośby
- Wykonywanie połączenia i pobieranie odpowiedzi
Szczegółowe informacje o tych krokach znajdziesz w kolejnych sekcjach. Możesz też zapoznać się z przykładowym klientem Simple APIs w sekcji Przykłady, aby zobaczyć, jak te instrukcje są odwzorowywane w kodzie.
Pobieranie dokumentu opisującego
Zanim zaczniesz wdrażać bibliotekę klienta, musisz spełnić kilka podstawowych wymagań, które wpłyną na dalszy proces rozwoju. Na przykład wybrany język programowania może być typowany lub nietypowany. Jeśli jest typowany, może być typowany statycznie lub dynamicznie. Może być skompilowany lub interpretowany. Te wymagania pomogą Ci w korzystaniu z dokumentu Discovery.
Pierwszym zadaniem programistycznym jest pobranie dokumentu Discovery. Twoja strategia dotycząca tego, kiedy dokładnie ma zostać pobrany dokument, zależy od zidentyfikowanych przez Ciebie wymagań. Na przykład w języku o statycznym typowaniu możesz pobrać dokument Discovery na wczesnym etapie procesu, a następnie wygenerować kod do obsługi konkretnego interfejsu API opisanego w tym dokumencie. W przypadku języka o silnym typowaniu możesz wygenerować kod i utworzyć skompilowaną bibliotekę. W przypadku języka o dynamicznym typowaniu możesz leniwie tworzyć struktury programowania, aby na bieżąco łączyć się z interfejsem API w miarę korzystania z platformy programowania.
Tworzenie prośby
Tworzenie żądań obejmuje 2 osobne etapy:
- Tworzenie treści żądania.
- Tworzenie adresu URL żądania.
Treść żądania (jeśli występuje) musisz przekonwertować z odpowiedniej dla danego języka reprezentacji na prawidłowy format transmisji. Na przykład w bibliotece klienta Java API może istnieć klasa dla każdego typu żądania, która umożliwia bezpieczną pod względem typów manipulację danymi żądania i może być serializowana do formatu JSON.
Konstruowanie adresu URL żądania jest nieco bardziej skomplikowane.
Właściwość path
każdej metody w interfejsie API korzysta ze składni szablonu URI w wersji 04. Ta właściwość może zawierać zmienne ujęte w nawiasy klamrowe. Oto przykład właściwości path
ze zmiennymi:
/example/path/var
W ścieżce powyżej var
to zmienna. Wartość tej zmiennej pochodzi z sekcji parameters
w dokumencie Discovery dla tej metody. Każda nazwa zmiennej ma odpowiednią wartość w obiekcie parameters
. W przykładzie powyżej w sekcji parameters
znajduje się parametr o nazwie var
(a jego właściwość location
ma wartość path
, co oznacza, że jest to zmienna ścieżki).
Podczas wysyłania żądania zastąp w adresie URL wartość var
.
Jeśli na przykład użytkownik biblioteki dokona wyboru, który ustawi wartość parametru var
na foo
, nowy adres URL będzie wyglądać tak: /example/path/foo
.
Pamiętaj też, że właściwość path
to względny identyfikator URI. Aby obliczyć bezwzględny URI, wykonaj te czynności:
-
Jeśli znasz swoją lokalizację (region), a dokument Discovery zawiera właściwość
endpoints
, sprawdź, czy Twoja lokalizacja znajduje się na liścieendpoints
. Jeśli tak, wybierzendpointUrl
z listyendpoints
, któregolocation
pasuje do Twojego. -
Jeśli w dokumencie Discovery nie ma usługi
endpoints
lub Twoja lokalizacja nie występuje na liścieendpoints
albo chcesz kierować reklamy na globalny punkt końcowy, pobierz usługęrootUrl
z najwyższego poziomu dokumentu Discovery.Na przykład właściwość
rootUrl
w dokumencie Discovery dla interfejsu Service Usage API to:https://serviceusage.googleapis.com/
-
Pobierz wartość
servicePath
z najwyższego poziomu dokumentu Discovery. Na przykład właściwośćservicePath
w dokumencie Discovery interfejsu Service Usage API jest pusta. -
Połącz je, aby uzyskać:
https://serviceusage.googleapis.com/
-
Pobierz właściwość
path
, rozwiń ją jako szablon URI i połącz wyniki tego rozwinięcia z identyfikatorem URI z poprzedniego kroku. Na przykład w metodzieserviceusage.services.enable
interfejsu Service Usage API w wersji 1 wartość właściwościpath
tov1/{+name}:enable
. Pełny identyfikator URI metody to:https://serviceusage.googleapis.com/v1/{+name}:enable
Do wywoływania interfejsu Service Usage API nie jest potrzebny klucz interfejsu API. Jeśli jednak wywoływany interfejs API wymaga klucza interfejsu API, możesz dodać go do ciągu zapytania URI:
REQUEST_URI?key=API_KEY
Wykonywanie połączeń i obsługa odpowiedzi
Po wysłaniu żądania musisz zdeserializować odpowiedź do odpowiedniej reprezentacji w języku, pamiętając o obsłudze warunków błędów, które mogą wystąpić zarówno w bazowym transporcie HTTP, jak i w komunikatach o błędach generowanych przez usługę API. Format błędów jest opisany w przewodniku po stylu JSON Google.
Przykłady
W następnej sekcji znajdziesz prosty przykład biblioteki klienta interfejsów API.
Klient Simple APIs
Poniżej znajdziesz przykład bardzo prostej biblioteki klienta napisanej w Pythonie 3. Klient tworzy interfejs do interakcji z Service Usage API, a następnie używa tego interfejsu, aby włączyć Compute Engine API (compute.googleapis.com
) w projekcie 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'))
Kluczowe komponenty klienta to:
- Krok 1. Pobierz dokument Discovery Dokument Discovery interfejsu Service Usage API jest pobierany i parsowany do struktury danych. Python to język o dynamicznym typowaniu, więc dokument Discovery można pobrać w czasie działania programu.
- Krok 2a.Skonstruuj podstawowy identyfikator URI. Obliczany jest podstawowy identyfikator URI.
-
Krok 2.b. Utwórz prośbę. Gdy metoda jest wywoływana w kolekcji, szablon URI jest rozwijany z parametrami przekazanymi do metody, a parametry z lokalizacją
query
są umieszczane w parametrach zapytania adresu URL. Na koniec żądanie jest wysyłane na utworzony adres URL za pomocą metody HTTP określonej w dokumencie Discovery. -
Krok 3a.Utwórz interfejs klienta. Interfejs klienta jest tworzony przez rekursywne przechodzenie przez przeanalizowany dokument Discovery. Dla każdej metody w sekcji
methods
do obiektuCollection
dołączana jest nowa metoda. Kolekcje mogą być zagnieżdżone, dlatego szukamy elementuresources
i rekurencyjnie tworzymy obiektCollection
dla wszystkich jego elementów, jeśli taki element zostanie znaleziony. Każda zagnieżdżona kolekcja jest też dołączana jako atrybut do obiektuCollection
. -
Krok 3b. Użyj klienta Pokazuje, jak używana jest wbudowana powierzchnia interfejsu API. Najpierw obiekt usługi jest tworzony na podstawie dokumentu Discovery, a potem interfejs Service Usage API jest używany do włączenia interfejsu Compute Engine API w projekcie
my-project
.