在GAE端点中传递数组

时间:2016-06-28 18:45:45

标签: java google-app-engine google-cloud-endpoints

我只是尝试了GAE端点的第一个例子,我修改了示例API方法以使其类似于此。

@ApiMethod(name = "sayHi")
public MyBean sayHi(@Named("name") String[] names) {

我的期望是收到一串字符串。 现在,当我使用Google API Explorer测试时,[https://apis-explorer.appspot.com/apis-explorer/] 它生成像这样的API

POST https://myprojectid.appspot.com/_ah/api/myApi/v1/sayHi/arg1/arg2/arg3?fields=data

API explorer screenshot

最终返回404错误。由于无法识别端点。

我在这里做错了什么?实际上,资源管理器将name显示为String而非String[]。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

您应该将包含数组的对象(java bean)作为属性放置,而不是将数组作为端点方法的参数。

然后你得到方法中的对象,你只需读取属性并将其视为一个数组。

根据您的评论进行更多研究后进行修改

实际上,当您尝试将数组作为Path参数传递时,它并不起作用。您的数组的不同元素将添加到URL(如您在问题中显示),并生成404 Not Found错误。诀窍是你应该将此数组作为Query参数而不是Path参数传递。请参阅此文档:https://cloud.google.com/appengine/docs/java/endpoints/parameter-and-return-types#path_parameters

事实上,如果你做了类似的事情,它的效果非常好:

@ApiMethod(name = "sayHi",
        path = "sayHiWithName")
public MyBean sayHi(@Named("name") String[] names) {
    MyBean response = new MyBean();
    response.setData("Hi, " + names[0] + names[1]);

    return response;
}

请注意,该参数未添加到路径中(即我们没有像sayHiWithName / {name}这样的路径。)

答案 1 :(得分:1)

首先要做的事情:当有一个String参数时,这是否有效?有一些servlet映射魔法需要发生以暴露端点,如果在项目中不存在,那么事情就不会起作用。请参阅this link以确保您的web.xml正常。

看看这个link,似乎你的方法参数是一个基本类型(不是一个真正的Java对象),如果它没有特别包含在@Path注释中,那么有一些你的Api会发生什么的不确定性:

  

路径参数是@ApiMethod注释的path属性中包含的方法参数。 如果未指定路径,则未使用@Nullable或@DefaultValue注释的任何参数将自动添加到路径(它们将是路径参数)。

所以似乎不包括" name"在@Path注释中,文档不会说明路径的格式。资源管理器正在查看的生成描述符似乎认为正确的答案是/names[0]/names[1]/names[2],有点像C风格的变量。可能是这种断开会导致您的404发生。你可以尝试包括" name"在@Path注释?