1

当我尝试使用 IBM Social Business ToolKit for IBM Connections 构建 OpenSocial Gadget 时,我遇到了 Access-Control-Allow-Origin 错误。

我有 3 台服务器参与此小工具:

  • 连接:将托管小工具的 IBM Connections 4.0 服务器
  • IBMSBT:托管 Social Business Toolkit 脚本和应用程序的服务器
  • JESSE_API:我的应用服务器托管小工具将使用的 API

小工具 xml 由 CONNECTIONS 从 JESSE_API 加载。小工具的视图加载脚本并调用 JESSE_API。我想使用 Social Business Toolkit 来访问 Connections 的各个部分,因此小工具视图也会从 IBMSBT 加载这些组件。

我目前只是对此进行原型设计——我能够仅使用 Connections 4.0 API 来完成这项工作,但宁愿使用 SBT 库。

开始时,我只是将“获取我的社区 - 主窗口”片段放入我的小工具视图中,并包含以下脚本:

<script type="text/javascript">
    var djConfig = {
        parseOnLoad: true
    };
</script>

<script src="//IBMSBT/sbt.dojo180/dojo/dojo.js"></script>
<script src="//IBMSBT/sbt.sample.web/library?ver=1.8.0"></script>

重新加载小工具会在控制台中出现以下错误:

XMLHttpRequest cannot load http://IBMSBT/sbt.sample.web/service/proxy/connections/http/CONNECTIONS/communities/service/atom/communities/my?ps=5

由于我的小工具在 CONNECTIONS 服务器上运行,因此我不需要代理。我没有看到立即禁用此端点代理的方法,因此我只是在 Endpoint.js 中的第 160 行之前设置了一个断点,其中执行以下代码:

if(this.proxy) {
    args.url = this.proxy.rewriteUrl(args.url,this.proxyPath);
}

当断点命中时,我设置 this.proxy = null 导致代理不被使用并且社区信息正确返回。

我的问题是我应该以不同的方式执行此操作,还是应该添加一种方法来绕过给定我当前使用的结构的代理的使用?

4

2 回答 2

1

在此环境中不需要使用 SDK 代理。作为支持 OAuth 工作的一部分,我们最近在这方面进行了一些更改。您需要做的是配置 SDK 库初始化,以便它知道它在 Gadget 上下文中运行。

看看 acme.social.sample.webapp:

  1. 在 faces-config.xml 中,您将看到一个用于 OpenSocial 的环境

    <!-- 开放社会环境 -->
    <托管豆>
        <managed-bean-name>openSocial</managed-bean-name>
        <managed-bean-class>com.ibm.sbt.jslibrary.SBTEnvironment</managed-bean-class>
        <managed-bean-scope>应用程序</managed-bean-scope>
        <托管属性>
            <property-name>端点</property-name>
            <value>acmeAirOS:acmeAir</value>
        </托管属性>
    </托管豆>
    
  2. 端点定义使用了一个小工具端点(在 faces-config.xml 的下方)

    <托管豆>
        <managed-bean-name>acmeAirOS</managed-bean-name>
        <managed-bean-class>com.ibm.sbt.services.endpoints.GadgetOAuthEndpoint</managed-bean-class>
        <managed-bean-scope>会话</managed-bean-scope>
        <托管属性>
            <property-name>url</property-name>
            <value>%{acme.url}</value>
        </托管属性>
    </托管豆>
    
  3. 在加载库时在小工具 xml(或导入的 html)中传递一个参数以指示应使用 OpenSocial 环境

    <script type="text/javascript" src="../../library?ver=1.8.0&context=gadget&env=openSocial"></script>
    
于 2012-12-07T11:44:27.727 回答
1

根据 Mark Wallace 提供的信息,我更仔细地了解了/library/端点在做什么。

我无法使它完全与该代码完全一致,但以下代码可以很好地工作:

<script data-dojo-config="parseOnLoad:true"
        src="//IBMSBT/sbt.dojo180/dojo/dojo.js.uncompressed.js"></script>

<script>
if(typeof _sbt=='undefined' || window._sbt_bridge_compat){
    _sbt=0;
    dojo.registerModulePath('sbt','http://IBMSBT/sbt/js/sdk/sbt');
    dojo.registerModulePath('sbt/_bridge','http://IBMSBT/sbt/js/sdk/_bridges/dojo-amd');
    dojo.registerModulePath('sbt/dojo','http://IBMSBT/sbt/js/sdk/dojo');
    define('sbt/config',['sbt/Proxy','sbt/_bridge/Transport','sbt/authenticator/Basic','sbt/Endpoint'],function(Proxy,Transport,Basic,Endpoint){
        window.sbt = {};
        sbt.Properties={
            "sbtUrl":"http:\/\/IBMSBT\/sbt\/js\/sdk"
        };
        sbt.Endpoints={
            'connections':new Endpoint({
                "baseUrl":"http:\/\/connectionsww.demos.ibm.com",
                "transport":new Transport({}),
                "authType":"basic",
                "authenticator":new Basic({}),
                "proxyPath":"connections"})
        };
        return sbt;
    });
}
</script>

script 标签的内容基本上是/library/端点的输出。该sbt.Endpoints.connections定义最初包括我删除的已定义代理属性。

于 2012-12-07T21:59:24.833 回答