VB.NET Google 日历 API - 事件获取 (GetRequest) 失败

VB.NET Google Calendar API - Event Get (GetRequest) failing

我想做的应该很简单。这是我的问题:

使用 VB.NET(如果你使用 C#,那也很酷。)与 Google 日历 API,在一个事件的简单 GetRequest 上,有四行代码作为如下所示,我到底为什么会得到

Message[Not Found] Location[ - ] Reason[notFound] Domain[global]

Private Function GetEvent(ByVal CalID As String, ByVal EventID As String) As [Event]
    Dim service As CalendarService = GetCalendarService()
    Dim request As EventsResource.GetRequest = service.Events.Get(CalID, EventID)
    Dim ThisEvent As [Event] = request.Execute()
    Return ThisEvent
End Function

看起来这应该很容易...我已经可以检索我所有日历的列表、来自任何日历的事件列表,并且我可以将事件插入任何日历。所有这些都很好用。我几乎以为我知道自己在做什么,直到突然出现。

因为我认为 reader 可能倾向于指向范围、正确的凭据,或者我的 EventID 和 CalendarID 不匹配,所以不是。 EventID 和 CalendarID 都是从之前的事件 ListRequest 中获取的。

我知道我可以“作弊”并使用事件 ListRequest(因为我成功地做到了)来获得一个事件,但这不是正确的方法,我是很确定 GetRequest(使用 EventID)会更快。我只想要一个活动。

任何指导将不胜感激。

解决方案

如果你看一下 Events.Get 方法的 implementation 你会发现参数以相反的方式传递:首先是 calendarId,然后是 eventId

  /// <summary>Returns an event.</summary>
  /// <param name="calendarId">Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you
  /// want to access the primary calendar of the currently logged in user, use the "primary" keyword.</param>
  ///
  /// <param name="eventId">Event identifier.</param>
  public virtual GetRequest Get(string calendarId, string eventId)
   {
         return new GetRequest(service, calendarId, eventId);
   }

参考

.NET Google Client API

老实说,我不知道我是怎么解决的。我决定从头开始一个全新的项目来测试 API 目前为止我尝试过的所有功能:

  • 获取日历列表
  • 获取日历中的事件列表
  • 正在插入事件
  • 和(之前失败的)获取请求。 ...现在有效。

为什么它有效而以前没有,我仍然不知道。问题一定出在我项目的其他地方,但我会找到的。

对于那些可能会觉得有用的人(很少有 VB 示例),请使用 Form1 创建一个新项目,添加四个按钮、一个文本框和一个具有默认名称的组合框。

代码如下:

Imports System.IO
Imports System.Threading
Imports Google.Apis.Auth.OAuth2
Imports Google.Apis.Calendar.v3
Imports Google.Apis.Calendar.v3.Data
Imports Google.Apis.Services
Imports Google.Apis.Util.Store
Imports System.Windows.Forms


Public Class Form1
    Private Shared Scopes() As String = {CalendarService.Scope.CalendarEvents, CalendarService.Scope.CalendarReadonly} ', CalendarService.Scope.Calendar}
    'If I ever need to create calendars, or read them
    Private objCalendars As Data.CalendarList '///Holds all calendars.
    Private selectedCalendarID As String = "" '//Holds the currently selected Calendar ID.
    Private Const calendarTimeZone = "America/Los_Angeles"
    'Both of these are for testing purposes.
    Dim TestEventID As String = ""
    Dim TestCalendarID As String = "primary"

    Private Function GetCalendarService() As CalendarService
        Dim credential As UserCredential
        Using stream = New FileStream("credentials.json", FileMode.Open, FileAccess.ReadWrite)
            Dim credPath As String = "token.json"
            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, New FileDataStore(credPath, True)).Result
        End Using
        Return New CalendarService(New BaseClientService.Initializer() With {.HttpClientInitializer = credential})

    End Function

    Private Sub LoadCalendars()
        Dim service As CalendarService = GetCalendarService()
        Dim objCalendarListRequest As CalendarListResource.ListRequest = service.CalendarList.List
        objCalendars = objCalendarListRequest.Execute()
        If objCalendars Is Nothing Or objCalendars.Items.Count = 0 Then
            '** No calendars.  Something is wrong.  Give up and die.
            MsgBox("No calendars found?  That's weird.")
            End
        Else
            ComboBox1.Items.Clear()
            ComboBox1.Items.Add("primary")
            For Each objCal As Data.CalendarListEntry In objCalendars.Items
                Console.WriteLine(objCal.Summary)
                ComboBox1.Items.Add(objCal.Summary)
            Next
            ComboBox1.SelectedIndex = 0
        End If
    End Sub

    Private Function GetCalendarIDFromSummary(ByVal Summary) As String
        If Summary = "primary" Then Return Summary
        If objCalendars IsNot Nothing AndAlso objCalendars.Items.Count > 0 Then
            For Each objCal As Data.CalendarListEntry In objCalendars.Items
                If objCal.Summary = Summary Then
                    Return objCal.Id
                End If
            Next
        End If
        Return "" 'Should have found a match if objCalendars was properly loaded.
    End Function

    Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
        Call LoadCalendars()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim summary As String = "Hello World"
        If Trim(TextBox1.Text) <> "" Then summary = Trim(TextBox1.Text)
        Call InsertEvent(summary, "1600 Pennsylvania Avenue NW, Washington, DC 20500", "My Description of this event.", Now, 60, GetCalendarIDFromSummary(ComboBox1.SelectedItem.ToString))
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        If TestEventID <> "" Then
            MsgBox(GetEvent(TestCalendarID, TestEventID).Summary)
        End If
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Call SearchEvents()
    End Sub


    Private Sub SearchEvents()
        Me.Cursor = Cursors.WaitCursor
        Dim EventCount As Integer = 0
        Dim service As CalendarService = GetCalendarService()
        If objCalendars IsNot Nothing AndAlso objCalendars.Items.Count > 0 Then
            For Each objCal As Data.CalendarListEntry In objCalendars.Items
                If InStr(objCal.Description, "#") = 1 Then 'OPTIONAL: I decided adding this character in the first postion of the description of the calendar is a flag to indicate we search it.
                    Console.WriteLine("***NEW CALENDAR***: " & objCal.Summary)
                    Dim request As EventsResource.ListRequest = service.Events.List(objCal.Id)
                    If TextBox1.Text <> "" Then request.Q = Trim(TextBox1.Text)
                    request.SingleEvents = True
                    request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime
                    Dim events As Events = request.Execute()
                    If events.Items IsNot Nothing AndAlso events.Items.Count > 0 Then
                        For Each eventItem In events.Items
                            If eventItem.Start.DateTime IsNot Nothing Then
                                Dim DateToShow As String = Format(eventItem.Start.DateTime, "MMM dd, \'yy hh:mmtt")
                                Console.WriteLine(DateToShow & ":" & eventItem.Summary & " > EventID: " & eventItem.Id & " > CalID:" & objCal.Id)
                            End If
                            EventCount += 1
                            Me.Text = EventCount.ToString
                        Next eventItem
                    End If
                End If
            Next objCal
        End If
        Me.Cursor = Cursors.Default
        MsgBox("Total items: " & EventCount.ToString)
    End Sub

    Private Sub InsertEvent(ByVal Summary As String, ByVal Location As String, ByVal Description As String, ByVal StartDateTime As DateTime, ByVal DurationMinutes As Integer, ByVal CalendarID As String)
        Dim service As CalendarService = GetCalendarService()
        Dim newEvent As New [Event]() With {
        .Summary = Summary,
        .Location = Location,
        .Description = Description,
        .Start = New EventDateTime() With {.DateTime = StartDateTime, .TimeZone = calendarTimeZone},
        .End = New EventDateTime() With {.DateTime = DateAdd(DateInterval.Minute, DurationMinutes, StartDateTime), .TimeZone = calendarTimeZone}
        }
        Dim request As EventsResource.InsertRequest = service.Events.Insert(newEvent, CalendarID)
        Dim createdEvent As [Event] = request.Execute()
        TestEventID = createdEvent.Id
        TestCalendarID = CalendarID
        Console.WriteLine("Event created:", createdEvent.Id)
    End Sub

    Private Function GetEvent(ByVal CalID As String, ByVal EventID As String) As [Event]
        Dim service As CalendarService = GetCalendarService()
        Dim request As EventsResource.GetRequest = service.Events.Get(CalID, EventID)
        Dim ThisEvent As [Event] = request.Execute()
        Return ThisEvent
    End Function

End Class