我已经设置了一个带有端点的本地应用引擎。我使用CURL成功地测试了端点,如下所示:
C:Program Files>curl.exe --header "Content-Type: application/json" -X POST -d "{g:"test",u:1,l:{x:1,y:1}}" http://localhost:8888/_ah/api/myapp/v1/move
我得到的响应是预期的:
{
"g" : "test",
"u" : 1,
"l" : {
"x" : 1,
"y" : 1
}
}
当我去我的JS客户端并尝试做同样的事情时,奇怪的事情开始发生。显然,当从Javascript调用端点时,嵌套元素"l"无法反序列化。我想知道这是为什么?
这是我在控制台中得到的错误信息:
500 (Can not deserialize instance of java.lang.String out of START_OBJECT token at [Source: N/A; line: -1, column: -1])
这是我调用端点的JS函数。
function init() {
var myapp = 'http://localhost:8888/_ah/api';
gapi.client.load('myapp', 'v1', function() {
var payload = {g:"Test",u:0,l:{x:4,y:4}};
gapi.client.myapp.unit.move(payload).execute(function(resp) {
console.log(resp);
});
}, myapp);
}
发送到服务器的有效载荷为:
[{"jsonrpc":"2.0","id":"gapiRpc","method":"myapp.unit.move","params":{"g":"Test","u":0,"l":{"x":4,"y":4}},"apiVersion":"v1"}]
当我从有效负载中删除l:{x:4,y:4}
时,我的端点被调用得很好。
似乎我做错了什么,但什么?
见也导致Google javascript api客户端json序列化错误的私有实体
Python:
这似乎是Java后端的一个问题,对于Python端点,我实现了一个API,它使用一个名为Total
的类来保存数据:
from protorpc import messages
class LeftRight(messages.Message):
x = messages.IntegerField(1)
y = messages.IntegerField(2)
class Total(messages.Message):
g = messages.StringField(1)
u = messages.IntegerField(2)
l = messages.MessageField(LeftRight, 3)
,然后有一个虚拟端点,它只返回它接收到的Total
对象
...
@endpoints.method(Total, Total,
path='total', http_method='POST',
name='total.total')
def total(self, request):
return request
,它可以完美地使用你所包含的相同的Javascript。
我将其合并到我在fork中创建的分支中的示例应用程序中。有关细节,请参阅提交。注意:我做了一个后续的提交,以摆脱Auth/https,使其在dev_appserver
中运行。
TBD
标题>