2013-02-10 173 views
0

我試圖從我的Google日曆中使用.NET客戶端API V3獲取FreeBusy數據。Google Calendar API V3 FreeBusy請求收到錯誤請求錯誤

以下代碼允許我使用服務身份驗證登錄並獲取日曆列表和日曆設置。我也可以如圖所示獲取事件。

爲了使這項工作我已經共享我的日曆與我的發展編號:

<我-ID > @ developer.gserviceaccount.com

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Google.Apis.Calendar; 
using Google.Apis.Calendar.v3; 
using Google.Apis.Authentication; 
using Google.Apis.Authentication.OAuth2; 
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth; 
using DotNetOpenAuth.OAuth2; 
using System.Diagnostics; 
using Google.Apis.Calendar.v3.Data; 
using System.Security.Cryptography.X509Certificates; 
using Google.Apis.Discovery; 
using Google.Apis.Drive.v2; 
using Google.Apis.Util; 

namespace consoleGoogleResearch 
{ 
    class Program 
    { 
     private const string SERVICE_ACCOUNT_EMAIL = "<your-value>@developer.gserviceaccount.com"; 
     private const string SERVICE_ACCOUNT_PKCS12_FILE_PATH = @"<path-to\<your-value>-privatekey.p12"; 

     /// <summary> 
     /// Build a Calendar service object authorized with the service account. 
     /// </summary> 
     /// <returns>Drive service object.</returns> 
     static CalendarService BuildCalendarService() 
     { 
      AssertionFlowClient client = new AssertionFlowClient(
       GoogleAuthenticationServer.Description, new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret", X509KeyStorageFlags.Exportable)) 
      { 
       Scope = CalendarService.Scopes.Calendar.GetStringValue(), 
       ServiceAccountId = SERVICE_ACCOUNT_EMAIL, 
      }; 
      OAuth2Authenticator<AssertionFlowClient> authenticator = new OAuth2Authenticator<AssertionFlowClient>(client, AssertionFlowClient.GetState); 
      return new CalendarService(authenticator); 
     } 

     public static void Main(string[] args) 
     { 
      var service = BuildCalendarService(); 

      // Get the calendar service 
      Google.Apis.Calendar.v3.CalendarListResource.ListRequest clrq = service.CalendarList.List(); 
      var result = clrq.Fetch(); 

      // Prove we can get the settings. 
      SettingsResource.ListRequest slr = service.Settings.List(); 
      var sr = slr.Fetch(); 

      try 
      { 
       Console.WriteLine("Calendars: "); 
       foreach (CalendarListEntry calendar in result.Items) 
       { 
        Console.WriteLine("{0}", calendar.Id); 
        Console.WriteLine("\tAppointments:"); 
        Google.Apis.Calendar.v3.EventsResource.ListRequest elr = service.Events.List(calendar.Id); 
        var events = elr.Fetch(); 
        if (events.Items != null) 
        { 
         foreach (Event e in events.Items) 
         { 
          Console.WriteLine("\tSummary: {0}, Location: {1}", e.Summary, e.Location); 
          if (e.IsAllDayEvent()) 
          { 
           Console.WriteLine("\t\tAll Day: {0}", e.Start.GetDateTime().ToLongDateString()); 
          } 
          else 
          { 
           Console.WriteLine("\t\tFrom: {0}", e.Start.GetDateTime()); 
           Console.WriteLine("\t\tTo: {0}", e.End.GetDateTime()); 
          } 
          if (e.Attendees != null) 
          { 
           foreach (var att in e.Attendees) 
           { 
            Console.WriteLine("Attendee:\t\t\t{0}<{1}>", att.DisplayName, att.Email); 
           } 
          } 
          Console.WriteLine(); 
         } 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       log.DebugFormat("Error: {0}", ex.Message); 
      } 

      // Attempt to get free busy data. 
      FreebusyResource.QueryRequest fbq = service.Freebusy.Query(new FreeBusyRequest()); 

      FreeBusyRequestItem c = new FreeBusyRequestItem(); 
      c.Id = "<your calendar id>"; 
      fbq.Body.Items = new List<FreeBusyRequestItem>(); 
      fbq.Body.Items.Add(c); 
      fbq.Body.TimeZone = "Europe/London"; 
      fbq.Body.TimeMin = "2013-01-101T00:00:00.000Z"; 
      fbq.Body.TimeMax = "2013-01-301T00:00:00.000Z"; 

      // This call fails with global bad request 
      var fbres = fbq.Fetch(); 

      Console.ReadKey(); 
     } 
    } 

    static internal class Extensions 
    { 
     static internal DateTime GetDateTime(this EventDateTime edt) 
     { 
      if (String.IsNullOrEmpty(edt.DateTime)) 
      { 
       if (String.IsNullOrEmpty(edt.Date)) 
       { 
        return DateTime.MinValue; 
       } 
       else 
       { 
        return DateTime.Parse(edt.Date); 
       } 
      } 
      else 
      { 
       return DateTime.Parse(edt.DateTime); 
      } 
     } 

     static internal Boolean IsAllDayEvent(this Event e) 
     { 
      return (e.Start.DateTime == null && e.Start.Date != null); 
     } 
    } 
} 

然而,試圖獲取免費忙信息的代碼總是收到「錯誤的請求」錯誤。

我檢查了使用fiddler發送的請求,並且據我所見,它是正確的。

POST https://www.googleapis.com/calendar/v3/freeBusy?alt=json&prettyPrint=true HTTP/1.1 
Authorization: Bearer <removed> 
Content-Type: application/json; charset=utf-8 
User-Agent: ConsoleApplication1 google-api-dotnet-client/ Win32NT/6.1.7601.65536 (gzip) 
Host: www.googleapis.com 
Content-Length: 144 
Accept-Encoding: gzip, deflate 

{"items":[{"id":"[email protected]"}],"timeMax":"2013-01-301T00:00:00.000Z","timeMin":"2013-01-101T00:00:00.000Z","timeZone":"Europe/London"} 

有誰能告訴我爲什麼我收到錯誤的請求錯誤,更重要的是如何解決它?

非常感謝

Chris。

+2

最後我發現了自己的錯誤。檢查請求中的日期。 timeMin 2013-01-101 timeMax 2013-01-301 將它們更改爲有效日期已修復它。 我希望,考慮到我花費的時間來弄清楚如何使服務認證正常工作,這段代碼對別人來說是有用的。 Chris – 2013-02-10 18:02:38

回答

0

答案在上面的評論中,我與日期錯誤。