使用Google云端终端JS API客户端时出现反序列化错误。

4

我已经搭建了一个带有Endpoints的本地App Engine。使用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序列化错误
1个回答

1

Python:

这似乎是Java后端的问题,对于Python端点,我实现了一个使用名为Total的类来保存数据的API:

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,它可以完美运行。

我将其整合到了我的分支中的示例应用程序中。有关详细信息,请参见分支提交。注意:我进行了后续提交以摆脱Auth / https,使其在dev_appserver中运行。

Java:

待定


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接