不应命名Cloud Endpoint参数

Mas*_*son 5 javascript java google-app-engine google-api google-cloud-endpoints

我想HashMap<String, String>从JS应用程序发送一个到我的Google App.我创建了一个HashMapContainer类,例如:Cloud Endpoints Collection Parameter.

Endpoint方法定义如下:

public Entity myMethod(
        @Named('param1') String param1, 
        @Nullable @Named('param2') HashMapContainer param2) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

当我运行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.
Run Code Online (Sandbox Code Playgroud)

因此,我删除了@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);
    });
}
Run Code Online (Sandbox Code Playgroud)

param2如果我不被允许使用@Named注释,我怎么能得到?
也许我的JavaScript错了?

Mik*_*ikO 7

Google Cloud Enpoints 文档说:

@Named:此注释指示在此处注入的请求中的参数名称.未使用@Named注释的参数将注入整个请求对象.

基本上,据我所知,当您添加@Named注释时,参数将包含在请求URL的末尾:

http://end_point_url?parameter1=xxx&parameter2=yyy
Run Code Online (Sandbox Code Playgroud)

显然,支持@Named注释的参数类型只有少数(int,long,String,Boolean及其对应的数组,我认为),因为你不能将整个hashmap附加到请求URL!

另一方面,如果不使用@Named,则参数将包含(注入)在POST数据中.

要使用适用于JavaScript的Google API客户端库在HTTP正文中发送参数,您只需将该参数包含resource在JSON-RPC请求中调用的对象中,如下所示:

var req = gapi.client.myApi.endpoint.myMethod({
    'param1': 'FOO',
    'resource': {
        'param2': {
            'value1':'foofoo',
            'value2':'barbar',
            'value3':'foobar'
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

API客户端将自动发送param1URL和param2POST数据...

这在Google API Client Library for JavaScript文档的这一部分中有详细说明.