不应命名云终结点参数



我想将HashMap<String, String>从JS应用程序发送到我的Google App。我创建了一个HashMapContainer类,例如:云终结点集合参数。

终结点方法的定义如下:

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);
    });
}

如果不允许我使用@Named注释,我如何获得param2
也许我的JavaScript是错误的?

Google Cloud Enpoints文档说:

@Named: 此注释指示 在此处注入的请求。未批注的参数 使用 @Named 注入整个请求对象。

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

http://end_point_url?parameter1=xxx&parameter2=yyy

显然,支持@Named注释的参数类型只有少数(我认为是整数、长整型、字符串、布尔值及其对应的数组(,因为您无法将整个哈希映射附加到请求 URL!

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

为了使用 Google APIs Client Library for JavaScript 在 HTTP 正文中发送参数,您只需将该参数包含在 JSON-RPC 请求中名为 resource 的对象中,如下所示:

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

API 客户端将自动发送 URL 中的param1,并在 POST 数据中发送param2...

这在 Google APIs Client Library for JavaScript 文档的这一部分中进行了详细说明。

使用 HashMap 会将所有参数传递给 Api 方法,我建议您使用 HaspMap<String,Object> 作为 param2 映射类型, 然后这通知我们,在这个哈希图中,我们可以将我们的 param2 作为哈希映射的键。然后我们可以将参数键的值键入到 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());
        }

本文档中的示例显示了使用的批注,其顺序与代码显示的顺序不同。

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

所以根据这个,你的

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

应该成为

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

我用两种方式测试了它 - 只有后者似乎对我有用。

从我问这个问题的那天起,我就找到了使用Google Cloud Endpoints的"另一种方式"。通过遵循文档,弄清楚如何从JavaScript脚本发送HashMap(实际上是对象(非常简单。

定义端点/注释#命名

传递给服务器端方法的所有非实体类型参数都需要@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 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"对于客户端无关紧要,它可以命名为"资源"。

此示例不是最佳实践,而是将请求中的参数和数据发送到正文的最简单方法。您可以使用自己的类(而不是 Java Map 接口(对其进行改进,并在需要时添加@ApiTransformer。如果使用实体作为参数,请确保注释顺序(@named必须是第一个(。

相关内容

  • 没有找到相关文章

最新更新