記事一覧

GoogleカレンダーにREST APIで接続する | Xamarin.Forms


今回はXamarinでGoogle SignInの認証結果を元にGoogleカレンダーにアクセスする方法についてご紹介いたします。
尚、Google SignIn の認証方法についてはiOSの場合は前々回の記事を、Androidの場合は前回の記事をご確認ください。


xamarin_rest_01.png


前提条件
・Windows10 Pro 64Bit
・Visual Studio 2015 Community Update3
・Xamarin 4.4.0.34 (NuGet Xamarin.Forms 2.3.4.247)
・macOS Sierra 10.12.4 / Xcode8.3.1 / Xamarin.iOS 10.8.0.1


1.NuGetパッケージをインストール

PCLプロジェクトに 以下のNuGetパッケージをインストールします。
・Microsoft.Net.Http
・Newtonsoft.Json
上記に伴い、以下のパッケージもインストールされます。
・Microsoft.Bcl
・Microsoft.Bcl.Build


2.認証されたトークンの取得方法

前回前々回の記事の追記分のみの記載となります。
(1)iOSの場合
Google.SignIn.SignIn.SharedInstance.SignedIn += (sender, e) => {
    // サインイン成功時の処理
    if (e.User != null && e.Error == null)
    {
        GoogleSignInService.MailAddress = e.User.Profile.Email;
        GoogleSignInService.AccessToken = e.User.Authentication.AccessToken;
    }
};

  今回はカレンダーに接続するので、以下のスコープを追加しています。
  SignIn.SharedInstance.Scopes = new string[] { "https://www.googleapis.com/auth/calendar" };

(2)Androidの場合、MainActivityに以下を追加します。
public void OnConnected(Bundle connectionHint)
{
    //接続成功時の処理が必要であれば記述します。
    Task.Run(() =>
    {
        try
        {
            GoogleSignInService.MailAddress = PlusClass.AccountApi.GetAccountName(GoogleSignInService.GoogleApiClient);
            GoogleSignInService.AccessToken = Android.Gms.Auth.GoogleAuthUtil.GetToken(
                                                this,
                                                new Android.Accounts.Account(GoogleSignInService.MailAddress, "com.google"),
                                                "oauth2:" + "https://www.googleapis.com/auth/calendar");
        }
        catch (Exception ex)
        {
            LogUtility.OutPutError(ex.Message + System.Environment.NewLine + ex.StackTrace);
        }
    }).ConfigureAwait(false);
}

  また、カレンダーへの接続の為、以下のスコープをMainActivityで追加します。
  .AddScope(new Scope("https://www.googleapis.com/auth/calendar"))


3.PCLの実装方法

PCLでGoogleカレンダーに接続するサンプルコードを以下に記載いたします。

TestPage.xaml.cs
using System.IO;
using System.Net;
using System.Net.Http;
async void OnGoogleCalendarClick(object sender, EventArgs e)
{
    string email = DependencyService.Get<IGoogleSignInService>().GetSignInMailAddress();
    string token = DependencyService.Get<IGoogleSignInService>().GetAccessToken();
    //カレンダーを取得します。
    string url = await this.GetGoogleCalendar(email, token); 
}

private const string GoogleCalendarUrlHome = "https://www.googleapis.com/calendar/v3";       

async Task<string> GetGoogleCalendar(string accountId, string token)
{
    string result = String.Empty;
    try
    {
/*******************************************************************/
        //①HttpClientを用いた接続例
/*******************************************************************/
        var client = new System.Net.Http.HttpClient();
        //HTTPヘッダーに取得したトークンを設定
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
        //URLを設定
        result = await client.GetStringAsync(this.GoogleCalendarUrlHome + this.GetCalendarUrl(accountId));

/*******************************************************************/
        //②HttpWebRequestを用いた接続例
/*******************************************************************/
        var httpWebRequest = HttpWebRequest.Create(this.GoogleCalendarUrlHome + this.GetCalendarEventUrl(accountId)) as HttpWebRequest;
        httpWebRequest.Method = "GET";
        httpWebRequest.Accept = "*/*";
        httpWebRequest.CookieContainer = new CookieContainer();
        httpWebRequest.Headers["Authorization"] = String.Format("Bearer {0}", token);   //HTTPヘッダーに取得したトークンを設定
        using (HttpWebResponse response = await httpWebRequest.GetResponseAsync() as HttpWebResponse)
        {
            Stream stream = response.GetResponseStream();
            using (StreamReader reader = new StreamReader(stream))
            {
                result = reader.ReadToEnd();
            }
        }

        return Newtonsoft.Json.JsonConvert.DeserializeObject<EventInfo>(result).ToString();

    }
    catch (System.Net.Http.HttpRequestException hre)
    {
        //サインインしていないと認証エラーが発生する場合がある
        return hre.Message;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine + ex.StackTrace);
        return ex.Message;
    }
}

//URLは以下を参照
//https://developers.google.com/google-apps/calendar/v3/reference/

//カレンダーを取得するURL
string GetCalendarUrl(string accountId)
{
    const string url = "/users/me/calendarList/{0}";
    return String.Format(url, accountId);
}
//イベントを取得するURL
string GetCalendarEventUrl(string accountId)
{
    const string url = "/calendars/{0}/events";
    return String.Format(url, accountId);
}

※Googleカレンダーから取得できる文字列はJson形式となっています。
以下のサイトでJson形式の文字列からModelクラスを生成することができます。
http://json2csharp.com/


4.うまくいかないときは

次回の記事にてブラウザで確認する方法をご紹介しています。




当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html


関連記事

コメント

コメントの投稿
非公開コメント

アルバム

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。