我想将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¶meter2=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
必须是第一个(。