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 通知请求正文为空的主要内容,如果未能解决你的问题,请参考以下文章
Google Drive API 推送通知订阅 400“解析错误”