fc2ブログ

記事一覧

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パッケージをインストールします。
・Newtonsoft.Json (v7.0.1以降)
・Microsoft.Net.Http ←必要なし
上記に伴い、以下のパッケージもインストールされます。
・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
    {
//URLを設定
string url = this.GoogleCalendarUrlHome +
this.GetCalendarEventUrl(accountId) +
this.GetApiKeyUrl());

/*******************************************************************/
        //①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(url);

/*******************************************************************/
        //②HttpWebRequestを用いた接続例
/*******************************************************************/
        var httpWebRequest = HttpWebRequest.Create(url) 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);
}
//URLにAPI_KEYを設定する
private static string GetApiKeyUrl()
{
if (Device.RuntimePlatform == Device.iOS)
{
//Google API Console でWebアプリケーションに設定したAPI_KEYをここに貼り付ける
return "?key=AIzaSyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
}
else if (Device.RuntimePlatform == Device.Android)
{
//Google API Console でWebアプリケーションに設定したAPI_KEYをここに貼り付ける
return "?key=AIzaSyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
}
return String.Empty;
}

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



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

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




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


関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


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

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

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