在Chrome扩展中使用Google App Engine的通道
这里是扩展程序中运行的代码,位于background.html文件里。
function onLoad()
{
var path="http://localhost:8082/index.htm?key=1234";
xhr.open('get', path, false);
xhr.send();
token=xhr.responseText;
caughtMsg=token+" *** ";
var channel = new goog.appengine.Channel(token);
var handler = {
'onopen': function(){caughtMsg+=" *** open";},
'onmessage': onMessage,
'onerror': function(e){caughtMsg+=" *** err "+e.description+" "+e.code},
'onclose': function(){caughtMsg+=" *** close";}
};
var socket = channel.open(handler);
socket.onmessage = onMessage;
}
它和一个本地服务器的脚本(用Python写的)进行交互,这个脚本会创建一个频道并返回一个令牌。然后,这个令牌会用来在客户端创建频道对象。
但是,我从聚合响应中得到的是:
channel-354645736-1234 * 错误:无效令牌 401 * 关闭
当我在扩展程序的范围之外(不使用ajax建立连接)进行操作时,一切都很顺利。
我哪里出错了呢?
1 个回答
2
根据你的评论,我看到你在本地开发环境中测试频道API时遇到了问题。
我下载了channel.js(而不是使用http://*.appspot.com/_ah/channel/jsapi),然后在后台脚本中使用了本地的副本,这样就能正常工作了。
<script type="text/javascript" src="/lib/channel.js"></script>
在channel.js中,修改定义的那一行
goog.appengine.DevSocket.BASE_URL = "http://localhost:8080/_ah/channel/";
以适应你的本地环境(也就是appengine测试服务器的端口)
另外,你在xhr.open中发送的URL必须在你的清单的“权限”部分中列出,在我的情况下是
"permissions":
[
...,
"http://localhost:8080/"
]
你本地appengine测试服务器生成的令牌和线上系统的令牌是不同的,所以这两者不能混用。