Google drive webhook 通知请求正文为空

Posted

技术标签:

【中文标题】Google drive webhook 通知请求正文为空【英文标题】:Google drive webhook notifications request body is null 【发布时间】:2017-02-13 18:58:57 【问题描述】:

我已将谷歌驱动器集成到我的应用程序中。为了实现同步,我还按照链接https://developers.google.com/drive/v3/web/push中的步骤为每个帐户配置了推送通知

下面是配置账户所有文件监视的java代码

String uuid = UUID.randomUUID().toString(); 
                Channel channel = new Channel(); 
                channel.setId(uuid);
                channel.setType("web_hook");
                channel.setAddress(env.getProperty("webhookUrl"));
                StartPageToken pageToken = service.changes().getStartPageToken().execute();
                Channel response = service.changes().watch(pageToken.getStartPageToken(), channel).execute();

在实际的 google 驱动器中进行更改时,我会在上面配置的 webhook url 中收到通知。

但问题在于每次更改,我得到的以下标头的值与监视调用的响应相同&我没有得到任何与更改或请求正文相对应的正确请求标头

//Getting request headers
    String resourceId = request.getHeader("X-Goog-Resource-ID");
    String resourceState = request.getHeader("X-Goog-Resource-State");
    String expiration = request.getHeader("X-Goog-Channel-Expiration");
    String resourceChanges = request.getHeader("X-Goog-Changed");
    String channelId = request.getHeader("X-Goog-Channel-ID");

有人可以告诉我如何正确获取通知数据吗?有什么我做错了吗?

这是另一个还没有正确答案的问题所陈述的相同问题Receiving Google Drive Push Notifications

【问题讨论】:

【参考方案1】:

实际上,webhook 通知中没有发送请求正文。因此,一旦更改到达回调 url,就会通过对更改资源 uri 发出 get 请求来获取更改

Resource URI : https://www.googleapis.com/drive/v3/changes?includeRemoved=true&pageSize=100&pageToken=895&restrictToMyDrive=false&spaces=drive&alt=json

或者可以使用以下代码以编程方式获取更改

String pageToken = channelInfo.getCurrPageToken();
            List<Change> changes = service.changes().list(pageToken)
                    .execute().getChanges();

Google 推送通知文档本可以清楚地提到这一点,而不是提到请求正文中的更改是造成混淆的原因

【讨论】:

【参考方案2】:

我不明白您为什么要查看 webhook 消息的标头。如https://developers.google.com/drive/v3/reference/files/watch 所述,它是您感兴趣的主体。

获得更改文件的 ID 后,如果您想了解更改的详细信息,可以使用 Revisions https://developers.google.com/drive/v3/web/manage-revisions 提要查看详细信息。

【讨论】:

我没有收到请求正文。由于某些奇怪的原因,它以 null 的形式出现,因此我无法获取资源的 id。这可能吗? 我正在使用 Spring,这是我的回调发布方法 @RequestMapping(method = RequestMethod.POST) @ApiOperation(value = "Handling webhook notifications", notes = "", response = ApiResponse.class, tags = "" ) public void webhookNotification(HttpServletRequest request, HttpServletResponse response) throws IOException .当我在其中包含 @RequestBody 时,我收到它不存在的错误 请求正文为空的任何原因? 我需要查看订阅以及 webhook 调用的 http 请求和响应。您确定您不只是看到“同步”消息吗?检查标题中的“X-Goog-Message-Number: == 1”。应该简单地忽略同步消息。 标头名称 - x-real-ip, 值 - 64.233.172.157 标头名称 - x-forwarded-for, 值 - 64.233.172.157, 64.233.172.157 标头名称 - x-forwarded-proto, 值- http Header Name - host, Value - *** Header Name - connection, Value - close Header Name - content-length, Value - 0 Header Name - x-forwarded-host, Value - *** Header Name - x-forwarded -server, Value - *** Header Name - 接受, Value - / Header Name - x-goog-channel-id, Value - *** Header Name - x-goog-channel-expiration,值 - 2017 年 2 月 14 日星期二 12:11:12 GMT 标题名称 - x-goog-resource-state,值 - 更改

以上是关于Google drive webhook 通知请求正文为空的主要内容,如果未能解决你的问题,请参考以下文章

iOS应用可以直接接收Google Drive推送通知吗?

Google Drive API 推送通知订阅 400“解析错误”

无法将我的网站注册为用于配置来自 google 的 webhook 通知的 webhook

没有收到 Google-Drive 推送通知

Google Apps脚本中的Google Drive通知

Google Drive API - 未收到推送通知(基本身份验证)