Date post: | 16-Jul-2015 |
Category: |
Technology |
Upload: | eyal-peled |
View: | 508 times |
Download: | 4 times |
Introduction to the .NET client library
https://code.google.com/p/google-api-dotnet-client/
Eyal Peled peleyal@
AgendaRestHttp LayerClient ServiceService RequestMedia OAuth2PCL3rd parties
DiscoveryCode Generator
https://code.google.com/p/google-api-dotnet-client/
AgendaRestHttp LayerClient ServiceService RequestMedia OAuth2PCL3rd parties
DiscoveryCode Generator
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET REST● Representational State Transfer● Client and servers transfer resource representations
● The set of verbs in a REST APIis typically limited to “CRUD”
● See Google API Explorer for linksto all Google API Rest services
https://code.google.com/p/google-api-dotnet-client/
AgendaRest
Http LayerClient ServiceService RequestMedia OAuth2PCL3rd parties
DiscoveryCode Generator
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET Http LayerHttpClient●A simple programming interface to code against -
SendAsync, GetAsync, etc.●It uses the new Task based asynchronous methods, which
makes writing responsive and performant UI applications across all platforms a lot simpler.
●Targets Windows 7 and 8, WP, etc. See PCL●Part of .NET 4.5 (not PCL) and available for .NET 4.0
developers as a PCL (using NuGet)
https://code.google.com/p/google-api-dotnet-client/
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET Http LayerHttpClient●Message handlers as a key architectural component●Every request is passed through a chain of handlers
(derive from HttpMessageHandler)●HttpClientHandler uses
● System.Net.HttpWebRequest and
● System.Net.HttpWebResponse under the cover, and provides a great abstraction.
Google APIs .NET Http Layer
ConfigurableMessageHandler The main HTTP logic IHttpExecuteInterceptor Interceptor before request is made IHttpUnsuccessfulResponseHandler Handler for abnormal HTTP response IHttpExceptionHandler Handler for an exception during a request
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET Http Layer
ws
https://code.google.com/p/google-api-dotnet-client/
ConfigurableHttpClient
● Inherits from HttpClient● Contains the handler
Google APIs .NET Http Layer
https://code.google.com/p/google-api-dotnet-client/
HttpClientFactory
• Constructs a new HttpClient• Great for mocking using CreateHandler
(By default creates HttpClientHandler)
Google APIs .NET Http Layer
https://code.google.com/p/google-api-dotnet-client/
BackOffHandler
● Implements exception and unsuccessful response handlers
● Contains a BackOff logic
AgendaRestHttp Layer
Client ServiceService RequestMedia OAuth2PCL3rd parties
DiscoveryCode Generator
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET Client Service
https://code.google.com/p/google-api-dotnet-client/
IClientService
● Serialization● GZip support● Authenticator(Will be removed after a new Auth library will be created)
Google APIs .NET Client Service
https://code.google.com/p/google-api-dotnet-client/
BaseClientService
● Thread-safe uses Initializer● Expoenential back-off policy● Api Key● GZip Enabled● Client Factory
Google APIs .NET Client Service
Generated services inherit from BaseClientSerivce● They implement resource related properties • They contain resources and methods based on Discovery
Follow DriveService implementation in the next slide...
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET Client Service public class DriveService : Google.Apis.Services.BaseClientService { public DriveService(Google.Apis.Services.BaseClientService.Initializer initializer) : base(initializer) { about = new AboutResource(this); files = new FilesResource(this); ... }
public override string Name { get { return "drive"; } } public override string BaseUri { get { return "https://www.googleapis.com/drive/v2/"; } } public override string BasePath { get { return "drive/v2/"; } } public enum Scopes { /// <summary>View and manage the files and documents in your Google Drive</summary> [Google.Apis.Util.StringValueAttribute("https://www.googleapis.com/auth/drive")] Drive, /// <summary>View and manage its own configuration data in your Google Drive</summary> [Google.Apis.Util.StringValueAttribute("https://www.googleapis.com/auth/drive.appdata")] DriveAppdata,/// <summary>View your Google Drive apps</summary> … }
https://code.google.com/p/google-api-dotnet-client/
AgendaRestHttp LayerClient Service
Service RequestMedia OAuth2PCL3rd parties
DiscoveryCode Generator
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET Service Request
https://code.google.com/p/google-api-dotnet-client/
ClientServiceRequest
● ETag support● based TPLExecute \ ExecuteAsyncExecuteAsStream \ ExecuteAsStreamAsync
Google APIs .NET Service Request
Generated requests inherit from ClientServiceRequest● They Implement the concrete HttpMethod, RestPath, etc.● They are executed by calling to Execute (or ExecuteAsync)
Follow GetRequest (File) implementation in the next slide...
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET Service Request public class GetRequest : DriveBaseServiceRequest<Google.Apis.Drive.v2.Data.File> { public GetRequest(Google.Apis.Services.IClientService service, string fileId) : base(service) { FileId = fileId; InitParameters(); } [Google.Apis.Util.RequestParameterAttribute("fileId", Google.Apis.Util.RequestParameterType.Path)] public virtual string FileId { get; private set; }
[Google.Apis.Util.RequestParameterAttribute("projection", Google.Apis.Util.RequestParameterType.Query)] public virtual System.Nullable<ProjectionEnum> Projection { get; set; }
public override string MethodName { get { return "get"; } } public override string HttpMethod { get { return "GET"; } } public override string RestPath { get { return "files/{fileId}"; } }
… }
https://code.google.com/p/google-api-dotnet-client/
AgendaRestHttp LayerClient ServiceService Request
Media OAuth2PCL3rd parties
DiscoveryCode Generator
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET MediaResumable Media Upload
https://code.google.com/p/google-api-dotnet-client/
The protocol
● Recovery server errors● Chunk size● Progress changed event● Upload● UploadAsync
Google APIs .NET MediaMedia Downloader
https://code.google.com/p/google-api-dotnet-client/
● Chunk size● ProgressChanged event● Download● DownloadAsync
AgendaRestHttp LayerClient ServiceService RequestMedia
OAuth2PCL3rd parties
DiscoveryCode Generator
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET OAuth2
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET OAuth2
https://code.google.com/p/google-api-dotnet-client/
Google OAuth2 documentationGoogle API ConsoleSupport installed and web applicationsSupport service account
Current implementation ●IAuthenticator to apply authorization header to a request●Usage of DotNetOpenAuth●Implementation is in Google.Apis.Authentication.OAuth2
Google APIs .NET OAuth2
https://code.google.com/p/google-api-dotnet-client/
Roadmap● Remove DotNetOpenAuth● Create a Google.Apis.Auth PCL● Create concrete implementation for
Google.Apis.Auth.DotNet4 (installed applications) Google.Apis.Auth.Mvc4 (web applications) Google.Apis.Auth.WP (Windows Phone) Google.Apis.Auth.WinRT (Windows 8 applications)
The main reason for creating a specific assembly for a platform is based on the way we read the authorization code.
AgendaRestHttp LayerClient ServiceService RequestMedia OAuth2
PCL3rd parties
DiscoveryCode Generator
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET PCLPortable Class Library
Current status● Google.Apis is PCL ● The generated APIs are PCLs as well
Roadmap● Create a Google.Apis.Auth PCL library (see OAuth slides)
https://code.google.com/p/google-api-dotnet-client/
AgendaRestHttp LayerClient ServiceService RequestMedia OAuth2PCL
3rd parties
DiscoveryCode Generator
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET 3rd partiesNuGet packages:• Newtonsoft.Json 5.0.5Json is the client's default data format• Microsoft.Net.Http 2.1.10We use HttpClient as our transport layer.• Microsoft.Bcl.Async 1.10.16Although we target .NET 4.0 we use async-await• Zlib.Portable 1.9.2While GZip is enabled, we use this library to encode messages
• log4netThe library's logging framework
https://code.google.com/p/google-api-dotnet-client/
AgendaRestHttp LayerClient ServiceService RequestMedia OAuth2PCL3rd parties
DiscoveryCode Generator
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET Discovery
● Each Google API service exposes a discovery doc using the json format (e.g. https://www.googleapis.com/discovery/v1/apis/drive/v2/rest)
● The service generator generates a service, resources, models and requests by this doc
● Similar to wsdl● Read more about Discovery API here
https://code.google.com/p/google-api-dotnet-client/
AgendaRestHttp LayerClient ServiceService RequestMedia OAuth2PCL3rd parties
Discovery
Code Generator
https://code.google.com/p/google-api-dotnet-client/
Google APIs .NET Code Generator
https://code.google.com/p/google-api-dotnet-client/
● From 1.5.0-beta we use Google APIs client generator (which is available here)
● The .NET specific templates for 1.5.0-beta are available here.
● The decision to move to Google APIs client generator was based on the following: Share logic with other Google APIs client libraries It is easier to use Django templates It reduces library code significantly One step forward supporting End Points
Resources• code.google.com - WIKI• Google API .NET Announcements blog• StackOverflow google-api-dotnet-client tag• Google Group
• Google API Explorer• Google API Console
https://code.google.com/p/google-api-dotnet-client/
Questions?
https://code.google.com/p/google-api-dotnet-client/