2

以下は、認証に成功した後、drive.realtime.get メソッドを使用して既存のリアルタイム ドキュメントの JSON エクスポートを 3 つの方法で取得しようとするページです。console.log 呼び出しの結果は、コメント内にインラインで表示されます。

ID「EXISTING-FILE-ID」のファイルが存在し、リアルタイム API を使用してコンテンツが追加されています。https://www.googleapis.com/drive/v2/files/EXISTING-FILE-ID/realtime?access_token=VALID-ACCESS-TOKENのブラウザーで JSON エクスポート データを取得でき ます。

{"appId":"CLIENT-ID","revision":10,"data":{"id":"root","type":"Map","value":{"blah":{"json":"anything"},"key":{"json":"val"},"key2":{"json":"val2"}}}}

ただし、Chrome、Firefox、および Safari では、gapi.client.drive.realtime.get および gapi.client.rpcRequest への応答は常に空です: {"result":{}}.

Chrome と Firefox では、gapi.client.request に対するレスポンスのボディは、リアルタイム API でドキュメントの内容が変更されたときに部分的に変化する文字列です。これは gzip 圧縮されたコンテンツである可能性があります (応答ヘッダーには {content-encoding: "gzip"} が含まれていますが、ガン圧縮できませんでした。ドキュメントが変更されると、応答ヘッダーの etag も変更されます。

Safari では、gapi.client.request の応答本文に Chrome や Firefox と同じ文字列 (eyJH...) が含まれますが、エクスポートされたドキュメントの正しい内容がコンソール ログに表示されます。ブラウザ ウィンドウに googleapis.com の URL が表示されます。

<!DOCTYPE html><html><head>
  <script type="text/javascript" src="https://apis.google.com/js/api.js"></script>
  <script type="text/javascript">
    var fileId = 'EXISTING-FILE-ID';
    var start = function() {
      // load apis (then call authorize)
      gapi.load('auth:client,drive-realtime', function() {
        gapi.client.load('drive', 'v2', function() {
          authorize();
        });
      });
    };
    // authorize with drive scope
    var authorize = function() {
      gapi.auth.authorize({
        'client_id': 'CLIENT-ID',
        'scope': ['https://www.googleapis.com/auth/drive',
                  'openid'],
        'immediate': true
      }, function() {
        realtimeget(fileId);
      });
    };
    // try to get realtime document export in 3 different ways
    var realtimeget = function(id) {
      gapi.client.drive.realtime.get({
        'fileId': id
      }).execute(function() {
        console.log(JSON.stringify(arguments));
        // {"0":{"result":{}},"1":"[\n {\n  \"id\": \"gapiRpc\",\n  \"result\": {}\n }\n]\n"} 
      });
      gapi.client.rpcRequest('drive.realtime.get', 'v2', {
        'fileId': id
      }).execute(function() {
        console.log(JSON.stringify(arguments));
        // {"0":{"result":{}},"1":"[\n {\n  \"id\": \"gapiRpc\",\n  \"result\": {}\n }\n]\n"} 
      });
      gapi.client.request({
        'path': '/drive/v2/files/' + id + '/realtime',
        'method': 'GET',
      }).execute(function() {
        console.log('gapi.client.request:');
        console.log(arguments[0]);
        // false
        console.log(arguments[1]);
        // {"gapiRequest":{"data":{"body":"eyJhcHBJZCI6IjEwNjY4MTY3MjA5NzQiLCJyZXZpc2lvbiI6MTAsImRhdGEiOnsiaWQiOiJyb290IiwidHlwZSI6Ik1hcCIsInZhbHVlIjp7ImJsYWgiOnsianNvbiI6ImFueXRoaW5nIn0sImtleSI6eyJqc29uIjoidmFsIn0sImtleTIiOnsianNvbiI6InZhbDIifX19fQ==","headers":{"date":"Thu, 08 Aug 2013 19:17:19 GMT","content-encoding":"gzip","x-goog-safety-encoding":"base64","server":"GSE","etag":"\"Q5ElJByAJoL0etObruYVPRipH1k/fDOlc7uypufY3ROxh-RtfV86Kmg\"","content-type":"text/plain; charset=UTF-8","cache-control":"private, max-age=0, must-revalidate, no-transform","x-goog-safety-content-type":"application/json","content-length":"183","expires":"Thu, 08 Aug 2013 19:17:19 GMT"},"status":200,"statusText":"OK"}}} 
      });
    };
  </script>
</head>
<body onload="start();"></body></html>
4

2 に答える 2

3

クライアント ライブラリの問題を調査していますが、現時点では、エクスポート URL に対して XHR GET を作成することをお勧めします。

var id = '{DOCUMENT ID}';
var accessToken = gapi.auth.getToken()['access_token'];
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.googleapis.com/drive/v2/files/' + id + '/realtime?access_token=' + accessToken);
xhr.onload = function() {
  console.log(xhr.responseText);
};
xhr.onerror = function() {
  // Handle error
};
xhr.send();
于 2013-08-16T22:33:12.030 に答える
1

このインラインをそのまま実行している場合、問題は内容が保存されるのを待ってから取得する必要があることだと思います。

変更後にドキュメントにDocumentSaveStateChangedEventリスナーを追加し、isPending と isSaving の両方が false の場合に realtimeget をトリガーします。

このコードを見ると、毎回新しいドキュメントを作成するため、別のページをロードしても何も起こりません。

于 2013-08-01T18:50:03.313 に答える