3

ドライブ リソースを監視しています。時計の設定 (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
  };

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

// 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 );

return cmd; };

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

この後、私はの応答を得ています

{ kind: 'api#channel',
    id: 'id-0ZZuoVaqdWGhpUk9PZZ-1374536746592',
    resourceId: 'WT6g4bx-4or2kPWsL53z7YxZZZZ',
    resourceUri: 'https://www.googleapis.com/drive/v2/files/0AHuoVaqdWGhpUkZZZZ?updateViewedDate=false&alt=json',
    token: '101852559274654726533:0ZZuoVaqdWGhpUk9PZZ',
    expiration: '1374537347934' }
および次のヘッダーを持つ同期コールバック
  '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': 'https://www.googleapis.com/drive/v2/files/0AHuoVaqdWGhpUkZZZZ?updateViewedDate=false&alt=json',
  'x-goog-channel-token': '101852559274654726533:0ZZuoVaqdWGhpUk9PZZ',
  'user-agent': 'APIs-Google; (+http://code.google.com/apis)

ただし、これにはいくつかの問題があります。

  • これらの両方から返されたリソース ID は、ウォッチをサブスクライブしたときに渡された fileId と一致しません。resource-uri で指定された ID と一致します
  • ここで返された resourceID またはサブスクライブ時に渡された fileId を使用しようとすると、チャネルを停止しようとするとエラーが返されます。

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' } ] }
これはバグ 59 に関連していると思われますが、バグ 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エラーが発生します。

私が間違っている可能性があることや、間違っている可能性がある場所でデバッグを行う方法について何か考えはありますか?

4

1 に答える 1

6
  1. プッシュ通知は、現在変更とファイルのみをサポートしていますが、任意の API リソースを監視するように設計されています。したがって、すべてのリソース タイプに対して一意の resourceId が必要です。これが、fileId と等しくない resourceId を持っている理由です。

  2. 確認には、監視しているファイルに関する情報が返されます。応答のヘッダーを確認してください。また、トークンを使用して、必要に応じてチャネル固有の情報を保存することもできます。

  3. API エクスプローラーを使用している場合、チャンネルの登録を解除することはできません。ご存知のように、プッシュ通知には apis コンソールを介した URL の追加検証が必要であり、apis エクスプローラーは通知にアクセスするために認証されていないためです。セキュリティ上の理由により、意図したとおりに機能しています。人々が混乱するのを防ぐために、この問題について報告します。

  4. fileId はリクエストの本文には入りません。パラメータの 1 つにする必要があります。また、 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});
于 2013-07-23T04:40:26.270 に答える