gpt4 book ai didi

google-drive-api - 无法停止/取消 Google Drive API 推送通知

转载 作者:行者123 更新时间:2023-12-04 23:46:19 28 4
gpt4 key购买 nike

我正在观看云端硬盘资源。设置 watch (使用带有 node.js 和 drive.file.watch 的 googleapis 0.2.13-alpha 客户端):

exports.subscribeDriveCallbacksCmd = function( user, fileId ){
var userId = user.id;
var baseUrl = exports.BASE_URL;
var subscribeUrl = baseUrl+"/incoming/file";
var watchId = 'id-'+fileId+'-'+(new Date()).getTime();
var subscription = {
id: watchId,
token: userId+':'+fileId,
type: 'web_hook',
address: subscribeUrl,
params:{
ttl: 600
}
};
var params = {
fileId: fileId
};<p></p>

<p>//var cmd = client.drive.files.watch( params, subscription );</p>

<p>// FIXME - Hack around bug in RPC implememntation
var hack = {channel:subscription};
for( var key in params ){
hack[key] = params[key];
}
var cmd = client.drive.files.watch( hack );</p>

<p>return cmd;
};</p>

<p>var cmd = exports.subscribeDriveCallbacksCmd( user, '0ZZuoVaqdWGhpUk9PZZ' );
var batch = client.newBatchRequest();
batch.add(cmd);
batch.withAuthClient(user.auth).execute(cb);
</p>

在此之后,我得到了回应

{ kind: 'api#channel',
id: 'id-0ZZuoVaqdWGhpUk9PZZ-1374536746592',
resourceId: 'WT6g4bx-4or2kPWsL53z7YxZZZZ',
resourceUri: '<a href="https://www.googleapis.com/drive/v2/files/0AHuoVaqdWGhpUkZZZZ?updateViewedDate=false&alt=json" rel="noreferrer noopener nofollow">https://www.googleapis.com/drive/v2/files/0AHuoVaqdWGhpUkZZZZ?updateViewedDate=false&alt=json</a>',
token: '101852559274654726533:0ZZuoVaqdWGhpUk9PZZ',
expiration: '1374537347934' }
以及带有以下 header 的同步回调 <pre> 'x-goog-channel-id': 'id-0ZZuoVaqdWGhpUk9PZZ-1374536746592',
'x-goog-channel-expiration': 'Mon, 22 Jul 2013 23:55:47 GMT',
'x-goog-resource-state': 'sync',
'x-goog-message-number': '1',
'x-goog-resource-id': 'WT6g4bx-4or2kPWsL53z7YxZZZZ',
'x-goog-resource-uri': '<a href="https://www.googleapis.com/drive/v2/files/0AHuoVaqdWGhpUkZZZZ?updateViewedDate=false&alt=json" rel="noreferrer noopener nofollow">https://www.googleapis.com/drive/v2/files/0AHuoVaqdWGhpUkZZZZ?updateViewedDate=false&alt=json</a>',
'x-goog-channel-token': '101852559274654726533:0ZZuoVaqdWGhpUk9PZZ',
'user-agent': 'APIs-Google; (+<a href="http://code.google.com/apis" rel="noreferrer noopener nofollow">http://code.google.com/apis</a>)
</pre>

然而,这有几个问题:

  • 这两个返回的资源 ID 与我订阅 watch 时传递的文件 ID 不匹配。它与资源 uri 中给定的 ID 匹配
  • 尝试使用此处返回的 resourceID 或我订阅时传递的 fileId,在我尝试停止 channel 时返回错误。

drive.channel.stop 给出的错误因调用方式而异。如果我在 Channel: Stop 页面底部使用 API Explorer,为 resourceId 参数提供 resourceId 或 fileId,我得到


404 Not Found

{
"error": {
"errors": [
{
"domain": "global",
"reason": "notFound",
"message": "Channel not found"
}
],
"code": 404,
"message": "Channel not found"
}
}

如果我在这段代码中使用 node.js 库:

exports.cancelDriveCallbacksCmd = function( watchId, fileId, resourceId ){
var body = {
id: watchId,
resourceId: resourceId
};
var cmd = client.drive.channels.stop( body );
return cmd;
};
var cmd = exports.cancelDriveCallbacksCmd( 'id-0ZZuoVaqdWGhpUk9PZZ-1374536746592', '0ZZuoVaqdWGhpUk9PZZ', 'WT6g4bx-4or2kPWsL53z7YxZZZZ' );
var batch = client.newBatchRequest();
batch.add(cmd);
batch.withAuthClient(user.auth).execute(cb);

我得到了错误

{ code: 500,
message: 'Internal Error',
data:
[ { domain: 'global',
reason: 'internalError',
message: 'Internal Error' } ] }
我怀疑这与 Bug 59 有关它有一个解决方法(这是我在上面使用的黑客代码),但我知道应该在本周的某个时候修复。

所以我将其更改为这段代码,它解决了 files.watch 的错误:


exports.cancelDriveCallbacksCmd = function( watchId, fileId, resourceId ){
var params = {};
var body = {
id: watchId,
resourceId: resourceId,
fileId: fileId
};

//var cmd = client.drive.channels.stop( params, body );

// FIXME - hack around bug in RPC implementation
var hack = {channel:body};
for( var key in params ){
hack[key] = params[key];
}
var cmd = client.drive.channels.stop( hack );
console.log( 'cancelDriveCallbacksCmd', hack );

return cmd;
};

但是我得到了同样的 500 错误。

关于我可能做错了什么或者如何调试我可能出错的地方有什么想法吗?

最佳答案

  1. 推送通知旨在监视任何 api 资源,尽管它目前仅支持更改和文件。因此,它需要所有资源类型的唯一 resourceId。这就是为什么他们的 resourceId 不等于 fileId 的原因。

  2. 确认会返回有关正在查看哪个文件的信息。检查您的回复标题。此外,如果需要,您可以使用 token 来保存 channel 特定信息。

  3. 如果您使用的是 API Explorer,则无法取消订阅该 channel ,因为如您所知,推送通知需要通过 API 控制台对 URL 进行额外验证,而 API Explorer 未通过身份验证以访问您的通知。出于安全原因,它正在按预期工作。我将报告这个问题,以防止人们对此感到困惑。

  4. fileId 不会进入请求正文。它应该是参数之一。另外,您应该向Channels.stop()提出要求退订。像这样:

订阅代码:

var channel= {
'id': 'yourchannelid',
'type': 'web_hook',
'address': 'https://notification.endpoint'
};
var request = client.drive.files.watch({'fileId': fileId, 'channel':channel});

取消订阅代码

var request = client.drive.channels.stop({'id': channelId, 'resourceId':resourceId});

关于google-drive-api - 无法停止/取消 Google Drive API 推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17799733/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com