我只是尝试 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
它最终返回
404
错误。由于端点无法识别。
我在这里做错了什么?事实上,资源管理器将
name
显示为 String
,而不是 String[]
。如有任何帮助,我们将不胜感激!
首先要做的事情是:当只有一个字符串参数时,这是否有效? 需要使用一些 servlet 映射魔法来公开端点,如果项目中不存在这种魔法,那么事情就无法进行。 请参阅此链接以确保您的 web.xml 符合预期。
看看这个link,似乎如果你的方法参数是一个基本类型(不是真正的Java对象),并且如果它没有被明确包含在@Path注释中,那么你的Api中会发生什么就存在一些不确定性:
路径参数是@ApiMethod注解的path属性中包含的方法参数。 如果未指定路径,则任何未使用@Nullable或@DefaultValue注释的参数将自动添加到路径中(它们将是路径参数)。
因此,似乎通过在
@Path
注释中不包含“名称”,文档不会说明路径的格式。 资源管理器正在查看的生成描述符似乎认为正确的答案是 /names[0]/names[1]/names[2]
,有点像 C 风格的可变参数。 可能正是这种断开连接导致了 404 错误的发生。 您可以尝试在 @Path
注释中包含“名称”吗?
不应将数组作为端点方法的参数,而应将包含数组的对象(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} 这样的路径)。