在 GAE 端点中传递数组

问题描述 投票:0回答:2

我只是尝试 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[]
。如有任何帮助,我们将不胜感激!

java google-cloud-platform google-app-engine google-cloud-endpoints
2个回答
1
投票

首先要做的事情是:当只有一个字符串参数时,这是否有效? 需要使用一些 servlet 映射魔法来公开端点,如果项目中不存在这种魔法,那么事情就无法进行。 请参阅此链接以确保您的 web.xml 符合预期。

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

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

因此,似乎通过在

@Path
注释中不包含“名称”,文档不会说明路径的格式。 资源管理器正在查看的生成描述符似乎认为正确的答案是
/names[0]/names[1]/names[2]
,有点像 C 风格的可变参数。 可能正是这种断开连接导致了 404 错误的发生。 您可以尝试在
@Path
注释中包含“名称”吗?


1
投票

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

然后您在方法中获取对象,只需读取该属性并将其视为数组即可。

根据您的评论进行更多研究后进行编辑

事实上,当您尝试将数组作为 Path 参数传递时,它不起作用。数组的不同元素被添加到 URL 中(如问题中所示),并生成 404 Not Found 错误。技巧是您应该将此数组作为查询参数而不是路径参数传递。请参阅此文档: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} 这样的路径)。

© www.soinside.com 2019 - 2024. All rights reserved.