4

我已经设置了一个带有端点的本地应用引擎。使用 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 序列化错误的自有实体

4

1 回答 1

1

Python:

这似乎是 Java 后端的一个问题,对于 Python 端点,我实现了一个 API,该 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.

爪哇:

待定

于 2013-03-18T22:14:42.107 回答