我正在使用云端点在Google App引擎上开发一个简单的Tic Tac Toe。我的API名称是tictactoe2D。 我在我的API中只有一个名为tictactoe2D.compute2DMove()的端点方法,我在API资源管理器中测试过,并且工作正常。
现在我正在努力创建游戏的前端,并使用Google API JavaScript Client库与我的端点方法进行通信。我遵循了与Getting Started页面中显示的完全相同的过程,这是一个关于使用该库的完整教程。
以下是来自board.html的代码段,加载了Javascript库 -
<head>
<title>Tic Tac Toe 3D</title>
<meta http-equiv="content-type" charset="utf-8" content="text/html"/>
<link href="css/main.css" rel="stylesheet" type="text/css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://apis.google.com/js/client.js?onload=onLoadCallback"></script>
<script type="text/javascript">
function onLoadCallback() {
gapi.client.setApiKey('AIzaSyB7p7mH_vZGgtrbF4ntmKN2nBcsRyRFY1w');
gapi.client.load('tictactoe2D', 'v1');
}
</script>
<script type="text/javascript" src="js/render.js"></script>
</head>
以下是render.js,中的代码,它添加了处理所有方块的click事件的功能,并且还与我的端点方法进行通信 -
$(document).ready(function() {
$("#board td").click(function() {
$(this).html("X");
var boardString = [];
var buttons = document.querySelectorAll('td');
for (var i=0; i<buttons.length; i++) {
boardString.push(buttons[i].innerHTML);
}
boardString.join('');
gapi.client.tictactoe2D.compute2DMove({'state': boardString}).execute(function(resp) {
document.write(resp.result.state);
});
});
});
以下是整个代码的JSFiddle。
当我尝试点击游戏板上的一个方块时出现问题。出乎意料的是,没有任何事情发生。 我在Chrome中打开了JavaScript控制台,发现只要我点击一个正方形,控制台就会出现以下错误 -
Uncaught TypeError: Cannot read property 'compute2DMove' of undefined
我无法弄清楚为什么会发生这种情况,我该如何解决它。有人可以帮帮我吗? 非常感谢你。
答案 0 :(得分:2)
在我观察JS控制台上的新错误后,我最终自己修复了错误 - 错误是 -
Failed to load resource: The server responded with a status of 403 (Forbidden)
我检查了服务器返回的JSON对象,对象是这样的 -
{"error":{"errors":[{"domain":"global","reason":"sslRequired","message":"SSL is required to perform this operation."}],"code":403,"message":"SSL is required to perform this operation."}}
看到这个后,我猜测没有使用安全连接(HTTPS)连接到应用程序,这就是服务器没有加载所需数据的原因。为了解决这个问题,我需要强制每次加载应用程序时都使用安全连接。 为此,我将以下标记添加到web.xml -
<security-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
我在appspot上更新了我的应用程序,并检查了JS控制台。 那里没有错误,我的端点方法也被执行了。我希望这些信息对任何面临类似问题的人都有帮助。
此外,我发现gapi
库在过去存在一些稳定性问题,并且保护API调用以防止任何可能的缺陷的最佳方法是使用 gapi.client.request()
,而不是发出JSON-RPC请求。(请参阅Constructing REST requests using gapi.client.request)。构建REST请求可能既冗长又繁琐,但也很安全。