草庐IT

javascript - 从本地 html/javascript(没有网络服务器)访问 google apis

coder 2024-07-25 原文

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

如果我从

提供我的文件,它就会工作
http://localhost/ 

通过网络服务器。 在 google api 控制台中,我有一个“Web 应用程序的客户端 ID”:

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

和浏览器应用程序的“简单 api 访问” key (带引用)

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。跨站点(或跨协议(protocol))原因的协议(protocol)。您看到有效的 GET 不是 XHR/AJAX,而是 <script>标签,所以对于大多数现代浏览器来说答案是否定的。查看discussion here .如果您使用 --allow-file-access-from-files 运行 Chrome,您可能会得到它的工作和 --disable-web-security (link)。

关于javascript - 从本地 html/javascript(没有网络服务器)访问 google apis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11914119/

有关javascript - 从本地 html/javascript(没有网络服务器)访问 google apis的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  4. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  5. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  6. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  7. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  8. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  9. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  10. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

随机推荐