5

HashMap<String, String>JS アプリケーションから Google アプリに送信したい。Cloud Endpoints Collection ParameterHashMapContainerのようなクラスを作成しました。

Endpoint メソッドは次のように定義されます。

public Entity myMethod(
        @Named('param1') String param1, 
        @Nullable @Named('param2') HashMapContainer param2) {
    //...
}

API 生成を実行すると、次のエラーが発生します。

com.google.api.server.spi.config.validation.ApiConfigInvalidException: 
    Resource type 'class com.mason.server.entity.HashMapContainer' 
    in method 'endpoint.myMethod' should not be named.

したがって、@Named注釈を削除します。API は生成されますが、明らかに、JS アプリケーションによって送信されたパラメーターを受け取りません。私のJavaScriptは次のようなものです:

function doTransaction() {
    var req = gapi.client.myApi.endpoint.myMethod({
        'param1': 'FOO',
        'param2': {
            'value1':'foofoo',
            'value2':'barbar',
            'value3':'foobar'
        }
    });
    req.execute(function(data) {
        console.log(data);
    });
}

アノテーションparam2の使用が許可されていない場合、どうすれば取得できますか? 私のJavaScriptが間違っているのでしょうか?@Named

4

4 に答える 4

2

HashMap を使用すると、Api メソッドに渡されるすべてのパラメーターが取得されます。私がアドバイスするのはHaspMap<String,Object>、param2 マップ タイプとして使用することです。これにより、このハッシュマップ内で param2 をハッシュマップのキーとして使用できることが通知されます。次に、param キーの値を HashMap に型キャストして、最初に渡された通常の初期 hashMap であるかのようにループできます。

HashMap <String,String> mapR = (HashMap <String,String>) param2.get("param2");

        for(Map.Entry<String,String> x:mapR.entrySet()){
            log.log(Level.INFO,x.getKey()+","+x.getVaue());

        }
于 2016-07-18T15:39:58.990 に答える
1

この質問をした日から、Google Cloud Endpointsを使用する「別の方法」を見つけました。ドキュメントに従えば、JavaScript スクリプトから HashMap (実際にはオブジェクト) を送信する方法を簡単に理解できます。

定義エンドポイント/注釈#named

@Named 注釈は、サーバー側メソッドに渡されるすべての非エンティティ型パラメーターに必要です。このアノテーションは、ここに挿入されるリクエスト内のパラメーターの名前を示します。@Named で注釈が付けられていないパラメータは、リクエスト オブジェクト全体に注入されます


JavaScript

REST API を介して JS オブジェクトを送信します。

function doSomething() {
    var req = gapi.client.myApi.myMethod({
        'param1': 'FOO',
        'value1': 'foofoo',
        'value2': 'barbar',
        'value3': 'foobar'
    });
    req.execute(function(data) {
        console.log(data);
    });
}


Java API

そして、アノテーションの付いていないすべてのパラメーターを Java Map で受け取ります。それらは HTTP リクエスト本文で送信されます (ドキュメントで説明されているように)。

public Entity myMethod(
    @Named('param1') String param1, 
    Map<String, Object> param2) {

    System.out.println(param1); // FOO
    System.out.println(String.valueOf(param2.get("value1"))); // foofoo
    System.out.println(String.valueOf(param2.get("value2"))); // barbar
    System.out.println(String.valueOf(param2.get("value3"))); // foobar

    //...
}

「param2」という名前はクライアント側にとって重要ではないことに注意してください。「resources」という名前にすることができます。

この例はベスト プラクティスではありませんが、リクエスト内のパラメーターとデータを本文に送信する最も簡単な方法です。(Java Map インターフェースの代わりに) 独自のクラスを使用して改善し、必要に応じて@ApiTransformerを追加できます。エンティティをパラメーターとして使用している場合は、注釈の順序を確認してください (@named最初の順序にする必要があります)。

于 2016-05-08T12:15:20.687 に答える
1

このドキュメントの例は、コードが示す順序とは異なる順序で使用される注釈を示しています。

public Resource get(@Named("id") @Nullable int id) { … }

したがって、これによると、あなたの

@Nullable @Named('param2') HashMapContainer param2) {

なるべき

@Named('param2') @Nullable HashMapContainer param2) {

私はそれを両方の方法でテストしました - 後者だけが私のために働くようです.

于 2016-05-08T02:28:31.203 に答える