当我尝试使用IBM Social Business ToolKit为IBM Connections构建OpenSocial小工具时,我遇到了Access-Control-Allow-Origin错误。
我有3台服务器参与此小工具:
小工具xml由CONNECTIONS从JESSE_API加载。小工具的视图加载脚本并调用JESSE_API。我想使用社交业务工具包来访问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服务器上运行,因此我不需要代理。我没有看到立即禁用此端点的代理的方法所以我只是在第160行之前在Endpoint.js中设置了一个断点,执行以下代码:
if(this.proxy) {
args.url = this.proxy.rewriteUrl(args.url,this.proxyPath);
}
当断点命中时,我设置this.proxy = null,这会导致不使用代理并正确返回社区信息。
我的问题是,我应该采取不同的方式,还是应该添加一种方法来绕过我目前正在使用的结构使用代理?
答案 0 :(得分:1)
不需要在此环境中使用SDK代理。最近我们在这个领域做了一些改变,作为支持OAuth工作的一部分。您需要做的是配置SDK库初始化,以便它知道它在Gadget上下文中运行。
看一下acme.social.sample.webapp:
在faces-config.xml中,您将看到一个用于OpenSocial
的环境<!-- OpenSocial Environment --> <managed-bean> <managed-bean-name>openSocial</managed-bean-name> <managed-bean-class>com.ibm.sbt.jslibrary.SBTEnvironment</managed-bean-class> <managed-bean-scope>application</managed-bean-scope> <managed-property> <property-name>endpoints</property-name> <value>acmeAirOS:acmeAir</value> </managed-property> </managed-bean>
端点定义使用小工具端点(在faces-config.xml中进一步向下)
<managed-bean> <managed-bean-name>acmeAirOS</managed-bean-name> <managed-bean-class>com.ibm.sbt.services.endpoints.GadgetOAuthEndpoint</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>url</property-name> <value>%{acme.url}</value> </managed-property> </managed-bean>
在小工具xml(或导入的html)中加载库时,传递一个参数来指示应该使用OpenSocial环境
<script type="text/javascript" src="../../library?ver=1.8.0&context=gadget&env=openSocial"></script>
答案 1 :(得分: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>
脚本标记的内容基本上是/library/
端点的输出。 sbt.Endpoints.connections
定义最初包含我删除的已定义代理属性。