4

エンドポイントを使用してローカル appengine をセットアップしました。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

パイソン:

これは 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を使用して完全に機能します。

これを、フォークで作成したブランチのサンプル アプリケーションに組み込みました。詳細については、commit を参照してください。注: Auth/https を削除するために後続のコミットdev_appserverを行ったので、 .

ジャワ:

未定

于 2013-03-18T22:14:42.107 に答える