从本地HTML / JavaScript(没有Web服务器)访问Google API

access google api's from local html/javascript (without webserver)

本文关键字:服务器 Web 访问 API Google 没有 HTML JavaScript      更新时间:2023-09-26

是否可以从本地html文件(使用javascript)访问Google API(日历v3)?我想在我的浏览器中打开 c:''temp''gsotto''gsotto.htm 而不是通过 IIS 提供文件。

如果我从以下位置提供我的文件,它可以工作

http://localhost/ 

通过网络服务器。在谷歌 api 控制台中,我有一个"Web 应用程序的客户端 ID",其中包含:

Redirect URIs:  http://localhost
JavaScript origins:     http://localhost

以及浏览器应用程序的"简单 api 访问"密钥(带引用)

Firebug shows me this when accessing through http://localhost/gsotto/gsotto.htm
GET http://localhost/gsotto/gsotto.htm
GET https://apis.google.com/js/client.js?onload=handleClientLoad
GET https://apis.google.com/_/apps-static/_/js/gapi/client....cb=gapi.loaded_0
GET https://ssl.gstatic.com/accounts/o/...-postmessagerelay.js
GET https://accounts.google.com/o/oauth2/auth?client_id=.....&authuser=0
GET https://ssl.gstatic.com/accounts/o/....-postmessage.js
and this when access through c:'...
GET https://apis.google.com/js/client.js?onload=handleClientLoad
GET https://apis.google.com/_/apps-static/_/js/gapi/client.....cb=gapi.loaded_0
GET https://ssl.gstatic.com/accounts/o/.....-postmessagerelay.js
and nothing more....
do i need to use other settings in the google api console for this to work?

<!DOCTYPE html>
<html>
  <head>
    <meta charset='utf-8' />
  </head>
  <body>
    <!--Add a button for the user to click to initiate auth sequence -->
    <button id="authorize-button" style="visibility: hidden">Authorize</button>
    <script type="text/javascript">
        // google calendar id
      var calId = "....";
      var clientId = "..."; // oAuth2 webapp
      var apiKey = "....";// Key for browser apps (with referers) 
      // google authentication scopes
      var scopes = 'https://www.googleapis.com/auth/calendar';
              //https://www.googleapis.com/auth/calendar.readonly
      // Use a button to handle authentication the first time.
      function handleClientLoad() {
          console.log('handleClientLoad');
        gapi.client.setApiKey(apiKey);
        window.setTimeout(checkAuth,1);
      }
      function checkAuth() {
          console.log('checkAuth');
          try {
        gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: true}, handleAuthResult);
          }
          catch(e)
          {
              console.log('e');
              console.log(e);
          }
      }

      function handleAuthResult(authResult) {
          console.log('handleAuthResult');
        var authorizeButton = document.getElementById('authorize-button');
        if (authResult && !authResult.error) {
            console.log('result ok');
          authorizeButton.style.visibility = 'hidden';
          makeApiCall();
        } else {
          console.log('authresult null or error');
          console.log(authResult);
          authorizeButton.style.visibility = '';
          authorizeButton.onclick = handleAuthClick;
        }
      }
      function handleAuthClick(event) {
        console.log('handleAuthClick');
        gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: false}, handleAuthResult);
        return false;
      }
function makeApiCall() {
        console.log('makeApiCall');
  gapi.client.load('calendar', 'v3', function() {
    var request = gapi.client.calendar.events.list({
      'calendarId': calId
    });
    request.execute(function(resp) {
        console.log('result:');
        console.log(resp);
      for (var i = 0; i < resp.items.length; i++) {
        var li = document.createElement('li');
        li.appendChild(document.createTextNode(resp.items[i].summary));
        document.getElementById('events').appendChild(li);
      }
    });
  });
}
    </script>
    <script src="https://apis.google.com/js/client.js?onload=handleClientLoad"></script>
    <div id="content">
    <ul id="events"></ul>
    </div>
  </body>
</html>

根据您的浏览器,您会发现由于跨站点(或跨协议)原因,从file://协议运行时无法实现 AJAX。您看到工作的 GET 不是 XHR/AJAX,而是<script>标签,因此对于大多数现代浏览器来说,答案是否定的。请参阅此处的讨论。如果您运行带有--allow-file-access-from-files--disable-web-security的 Chrome(链接),您可能会让它正常工作。