Google推送通知java处理程序

Google推送通知java处理程序,java,push-notification,google-api,google-calendar-api,google-api-java-client,Java,Push Notification,Google Api,Google Calendar Api,Google Api Java Client,我已经订阅了我的应用程序来收听谷歌推送通知。频道详细信息被保留。我可以从google接收到我的端点的通知 @PostMapping("/google/calendars/") public void watch(HttpServletRequest request, @RequestHeader(value = "X-Goog-Channel-ID", required = false) String googleChannelId, @RequestHeader(value = "X-

我已经订阅了我的应用程序来收听谷歌推送通知。频道详细信息被保留。我可以从google接收到我的端点的通知

@PostMapping("/google/calendars/")
public void watch(HttpServletRequest request,
  @RequestHeader(value = "X-Goog-Channel-ID", required = false) String googleChannelId,
  @RequestHeader(value = "X-Goog-Channel-Token", required = false) String googleChannelToken,
  @RequestHeader(value = "X-Goog-Channel-Expiration", required = false) String googleChannelExpiration,
  @RequestHeader(value = "X-Goog-Resource-ID", required = false) String googleResourceId,
  @RequestHeader(value = "X-Goog-Resource-URI", required = false) String googleResourceUri,
  @RequestHeader(value = "X-Goog-Resource-State", required = false) String googleResourceState,
  @RequestHeader(value = "X-Goog-Message-Number", required = false) String googleMessageNumber,
使用收到的信息,我可以打开
客户端
到谷歌服务。但我不知道如何得到改变

googleChannelId=354a78aa-0cc0-4b5b-96c5-e54e03a51e68
googleChannelToken=<null>
googleChannelExpiration=Sat, 18 Mar 2017 17:01:56 GMT
googleResourceId=eVHbdUeaWhfQPpvJPU7VZRxYzUs
googleResourceUri=https://www.googleapis.com/calendar/v3/calendars/sergii_vlasiuk@ukr.net/events?maxResults=250&alt=json
googleResourceState=exists
googleMessageNumber=403802722
其中:

  • client
    是带有正确令牌的
    com.google.api.services.calendar.calendar
    对象
  • ginalCalendarId
    -是众所周知的谷歌日历Id,一个用于订阅
  • googleResourceId
    -来自标题消息
    X-google-Resource-ID
    值。 ->

    404找不到 { “代码”:404, “错误”:[{ “域”:“全局”, “消息”:“未找到”, “原因”:“未找到” } ], “消息”:“未找到” }

  • 但我不知道如何得到改变

    googleChannelId=354a78aa-0cc0-4b5b-96c5-e54e03a51e68
    googleChannelToken=<null>
    googleChannelExpiration=Sat, 18 Mar 2017 17:01:56 GMT
    googleResourceId=eVHbdUeaWhfQPpvJPU7VZRxYzUs
    googleResourceUri=https://www.googleapis.com/calendar/v3/calendars/sergii_vlasiuk@ukr.net/events?maxResults=250&alt=json
    googleResourceState=exists
    googleMessageNumber=403802722
    
    GoogleCalendarAPI提供推送通知,允许您监视资源的更改。您可以使用此功能来提高应用程序的性能。它允许您消除额外的网络,并计算轮询资源所涉及的成本,以确定资源是否已更改。每当监视的资源发生变化时,谷歌日历API就会通知您的应用程序

    一旦您正确设置了watch,当发生更改时,将通知您的应用程序。你不需要检查它

    示例

    POST https://www.googleapis.com/calendar/v3/calendars/my_calendar@gmail.com/events/watch
    Authorization: Bearer auth_token_for_current_user
    Content-Type: application/json
    
    {
      "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
      "type": "web_hook",
      "address": "https://example.com/notifications", // Your receiving URL.
      ...
      "token": "target=myApp-myCalendarChannelDest", // (Optional) Your channel token.
      "expiration": 1426325213000 // (Optional) Your requested channel expiration time.
      }
    }
    
    有一篇关于如何设置此文档的完整文章

    注意:

    此语句不起作用,因为它需要
    事件Id
    作为第二个参数,而不是您的GoogleResourceId

     client.events().get(originalCalendarId, googleResourceId).execute()
    
    手表的工作原理:

  • 您决定要监视用户事件上的更改。您创建了一个。谷歌返回给你resourceId,这可以识别手表
  • 谷歌以HTTP Post的形式向您发送了一个变更。它包含手表中的资源id
  • 您知道,具有此资源id的手表类似于用户事件。您可以使用刷新令牌访问用户帐户。您可以对每个事件执行一次扫描,以查找哪些事件发生了更改 资源Id不能用于请求事件。手表不会告诉你到底换了什么或者什么时候换的。您必须查询API才能找到答案

    但我不知道如何得到改变

    googleChannelId=354a78aa-0cc0-4b5b-96c5-e54e03a51e68
    googleChannelToken=<null>
    googleChannelExpiration=Sat, 18 Mar 2017 17:01:56 GMT
    googleResourceId=eVHbdUeaWhfQPpvJPU7VZRxYzUs
    googleResourceUri=https://www.googleapis.com/calendar/v3/calendars/sergii_vlasiuk@ukr.net/events?maxResults=250&alt=json
    googleResourceState=exists
    googleMessageNumber=403802722
    
    GoogleCalendarAPI提供推送通知,允许您监视资源的更改。您可以使用此功能来提高应用程序的性能。它允许您消除额外的网络,并计算轮询资源所涉及的成本,以确定资源是否已更改。每当监视的资源发生变化时,谷歌日历API就会通知您的应用程序

    一旦您正确设置了watch,当发生更改时,将通知您的应用程序。你不需要检查它

    示例

    POST https://www.googleapis.com/calendar/v3/calendars/my_calendar@gmail.com/events/watch
    Authorization: Bearer auth_token_for_current_user
    Content-Type: application/json
    
    {
      "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
      "type": "web_hook",
      "address": "https://example.com/notifications", // Your receiving URL.
      ...
      "token": "target=myApp-myCalendarChannelDest", // (Optional) Your channel token.
      "expiration": 1426325213000 // (Optional) Your requested channel expiration time.
      }
    }
    
    有一篇关于如何设置此文档的完整文章

    注意:

    此语句不起作用,因为它需要
    事件Id
    作为第二个参数,而不是您的GoogleResourceId

     client.events().get(originalCalendarId, googleResourceId).execute()
    
    手表的工作原理:

  • 您决定要监视用户事件上的更改。您创建了一个。谷歌返回给你resourceId,这可以识别手表
  • 谷歌以HTTP Post的形式向您发送了一个变更。它包含手表中的资源id
  • 您知道,具有此资源id的手表类似于用户事件。您可以使用刷新令牌访问用户帐户。您可以对每个事件执行一次扫描,以查找哪些事件发生了更改
    资源Id不能用于请求事件。手表不会告诉你到底换了什么或者什么时候换的。你必须查询API才能找到答案。

    如果谷歌没有一个方便的方法来区分哪些实体已经被更新,我想我们应该考虑一个解决方法。在我看来,获取所有事件并通过遍历和重写所有数据来更新数据库状态将导致一些性能问题

    为了解决这个问题,我会选择使用每个事件具有的“etag”值。每次更新事件时,ETag都会更改(在CalDav协议中工作)

    如果您将etag与事件一起保存到数据库中,那么一旦您从Google获得事件列表,您只需检查etag值并仅更新真正更改的元素。这必须在更新条目时优化零件

    谷歌支持etag。 你可以在这里找到它:

    更新:

    有一种更方便的方法来执行同步。 您可以使用增量同步方法。增量同步允许您检索自上次同步请求以来已修改的所有资源

    您只需在每次更新数据时保存同步令牌,并在请求中使用它来获取新数据。在这种情况下,您将只获得已修改的数据

    Calendar.Events.List request = client.events().list("primary");
    request.setSyncToken(syncToken);
    
    如果你打电话:

    events = request.execute();
    List<Event> items = events.getItems();
    
    events=request.execute();
    List items=events.getItems();
    

    您将只获得已更新的数据

    如果谷歌没有一个方便的方法来区分哪些实体已经被更新,我想我们应该考虑一个解决方案。在我看来,获取所有事件并通过遍历和重写所有数据来更新数据库状态将导致一些性能问题

    为了解决这个问题,我会选择使用每个事件具有的“etag”值。每次更新事件时,ETag都会更改(在CalDav协议中工作)

    如果您将etag与事件一起保存到数据库中,那么一旦您从Google获得事件列表,您就可以检查etag值并仅更新t