不应命名Cloud Endpoint参数
我想从JS应用程序向我的Google App发送HashMap
。 我创建了一个HashMapContainer
类,例如: Cloud Endpoints Collection Parameter 。
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); }); }
如果我不被允许使用@Named
注释,我怎么能得到param2
?
也许我的JavaScript错了?
Google Cloud Enpoints 文档说:
@Named:此注释指示在此处注入的请求中的参数名称。 未使用@Named注释的参数将注入整个请求对象。
基本上,据我所知,当您添加@Named
注释时,参数将包含在请求URL的末尾:
http://end_point_url?parameter1=xxx¶meter2=yyy
显然,支持@Named
注释的参数类型只有少数(int,long,String,Boolean及其对应的数组,我认为),因为你不能将整个hashmap附加到请求URL!
另一方面,如果不使用@Named
,则参数将包含( 注入 )在POST数据中。
要使用Google API 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 API客户端库for JavaScript文档的此部分对此进行了详细说明。
使用HashMap将获得传递给Api方法的所有参数,我建议您使用HaspMap
作为param2映射类型,然后通知我们在这个hashmap中我们可以将param2作为hashmap的键。 然后我们可以将param键的值类型转换为HashMap,然后我们可以循环遍历它,就好像是最初传递的普通初始hashMap一样。
HashMap mapR = (HashMap ) param2.get("param2"); for(Map.Entry 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(实际上是Object)。
定义端点/注释#name
传递给服务器端方法的所有非实体类型参数都需要@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 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
必须是第一个)。