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

问题描述 投票:0回答:3

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

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

消息[未找到]位置[-]原因[未找到]域[全局]

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

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

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

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

任何指导将不胜感激。

vb.net google-calendar-api
3个回答
2
投票

我必须说实话,我不知道我是如何解决的。我决定从头开始一个全新的项目来测试我迄今为止尝试过的 API 的所有功能:

  • 获取日历列表
  • 获取日历中的事件列表
  • 插入事件
  • 以及(之前失败的)get 请求。 ...现在可以了。

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

对于那些可能觉得它有帮助的人(那里的 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

1
投票

解决方案

如果您查看 Events.Get 方法的

实现
,您会发现参数以相反的方式传递:首先是
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 客户端 API


0
投票

我觉得这篇文章很有趣。 我只想更改您获取凭据的部分:

   Using stream = New FileStream("creds.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 结束使用

我想使用用户名/密码,只是为了尝试所有其他代码。 我不想使用 json 文件来存储凭据。 谢谢 卢卡

© www.soinside.com 2019 - 2024. All rights reserved.