google-api-python-client
google-api-python-client
google-api-javascript-client
google-api-java-client
google-api-objectivec-client
google-api-ruby-client
google-api-go-client
google-api-php-client
google-api-nodejs-client
google-api-dart-client
google-api-dotnet-client
gwt-google-apis
oauth2.userinfo.get
"auth": { "oauth2": { "scopes": { "https://www.googleapis.com/auth/userinfo.email": { "description": "View your email address" }, ... "methods": { "get": { "scopes": [ "https://www.googleapis.com/auth/plus.me", "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile" ] }
urlshortener.url.get
"parameters": { "projection": { "type": "string", ... "enum": ["ANALYTICS_CLICKS", "ANALYTICS_TOP_STRINGS", "FULL"], "enumDescriptions": [ ... ], }, "shortUrl": { "type": "string", ... "required": true, } }
drive.files.get
"parameters": { "fileId": { "type": "string", "description": "The ID for the file in question.", "required": true, "location": "path" }, "projection": { ... "enum": ["BASIC", "FULL"], } ... }
google-api-python-client
>>> from apiclient.discovery import build >>> service = build('urlshortener', 'v1') >>> result = service.url().get(shortUrl='http://goo.gl/cyY1U').execute() >>> result {u'id': u'http://goo.gl/cyY1U', u'kind': u'urlshortener#url', u'longUrl': u'https://pycon2013-discovery.appspot.com/', u'status': u'OK'}
apiclient/discovery.py
from apiclient.http import HttpRequest DISCOVERY_URI = ('https://www.googleapis.com/discovery/v1/apis/' '{api}/{apiVersion}/rest') def build(serviceName, version, http=None, discoveryServiceUrl=DISCOVERY_URI, developerKey=None, model=None, requestBuilder=HttpRequest): ... return build_from_document(content, base=discoveryServiceUrl, http=http, developerKey=developerKey, model=model, requestBuilder=requestBuilder)
apiclient/discovery.py
def build_from_document( service, base=None, http=None, developerKey=None, model=None, requestBuilder=HttpRequest): ... return Resource(http=http, baseUrl=base, model=model, developerKey=developerKey, requestBuilder=requestBuilder, resourceDesc=service, rootDesc=service, schema=schema)
apiclient/discovery.py
class Resource(object): def __init__(self, http, baseUrl, model, requestBuilder, developerKey, resourceDesc, rootDesc, schema): ... self._set_service_methods() def _set_dynamic_attr(self, attr_name, value): self._dynamic_attrs.append(attr_name) self.__dict__[attr_name] = value
def _set_service_methods(self): self._add_basic_methods(self._resourceDesc, self._rootDesc, self._schema) self._add_nested_resources(self._resourceDesc, self._rootDesc, self._schema) self._add_next_methods(self._resourceDesc, self._schema)
apiclient/discovery.py
def _add_basic_methods(self, resourceDesc, rootDesc, schema): ... for methodName, methodDesc in resourceDesc['methods'].iteritems(): fixedMethodName, method = createMethod( methodName, methodDesc, rootDesc, schema) self._set_dynamic_attr(fixedMethodName, method.__get__(self, self.__class__)) ...
protorpc
from protorpc import messages class Task(messages.Message): name = messages.StringField(1, required=True) owner = messages.StringField(2)
protorpc
protorpc
to talk to Google's
API infrastructure
"Task": { "id": "Task", "properties": { "name": { "required": true, "type": "string" }, "owner": { "type": "string" } }, "type": "object" }
protorpc
from google.appengine.ext import endpoints from protorpc import remote @endpoints.api(name='tasks', version='v1', description='API for Task Management') class TaskApi(remote.Service): @endpoints.method(Task, Task, name='task.insert', path='task') def insert_task(self, request): ... return request
protorpc
@endpoints.api
decorator provides
API level metadata
@endpoints.method
decorator helps
determine method specific metadata
"descriptor": { "methods": { "TaskApi.insert_task": { "request": { "$ref": "Task" }, "response": { "$ref": "Task" } }, ...
"tasks.task.insert": { ... "httpMethod": "POST", "path": "task", "request": { "body": "autoTemplate(backendRequest)", "bodyName": "resource" }, "response": { "body": "autoTemplate(backendResponse)", "bodyName": "resource" }, "rosyMethod": "TaskApi.insert_task"
... @endpoints.method(Task, Task, name='task.get', path='task/{name}', http_method='GET') def get_task(self, request): ... return Task(...)
"tasks.task.get": { ... "httpMethod": "GET", "path": "task/{name}", "request": { "body": "empty", "parameterOrder": ["name"], "parameters": { "name": { "required": true, "type": "string" }, "owner": { "type": "string" ...
"get": { "id": "tasks.task.get", "path": "task/{name}", "httpMethod": "GET", "parameters": { "name": { "type": "string", "required": true, "location": "path" }, ... "response": { "$ref": "Task" }
>>> from apiclient.discovery import build >>> DISCOVERY_URI = ('https://pycon2013-discovery.appspot.com/_ah/api/discovery/' ... 'v1/apis/{api}/{apiVersion}/rest') >>> service = build('tasks', 'v1', discoveryServiceUrl=DISCOVERY_URI) >>> body = {'name': 'Stop Talking', 'owner': 'Danny'} >>> result = service.task().insert(body=body).execute() >>> result {u'name': u'Stop Talking', u'owner': u'Danny'}