4

我不清楚 @Named 在 Google Cloud Endpoints 中的用途。文档说:

此注解指示在此处注入的请求中的参数名称。未使用 @Named 注释的参数被注入整个请求对象。...此示例显示了@Named 的使用:

 @ApiMethod(
   name = "foos.remove",
   path = "foos/{id}",
   httpMethod = HttpMethod.DELETE)   
public void removeFoo(@Named("id") String id){}

其中@Named 指定只在请求中注入id 参数。

如果在此示例中未使用 @Named,那么“注入”是什么?与“整个请求”?就此而言,究竟什么是“注入”?什么是“整个请求”?@Named 对象是否总是必须是 @Apimethod 中定义的路径的一部分?

谢谢。

4

1 回答 1

4

编辑:虽然我下面的回答并没有错,但它根本不完整。基本上,当您添加@Named注释时,参数将包含在请求 URL 的末尾:

http://endpointurl?parameter1=xxx&parameter2=yyy

如果您不使用@Named,该参数将被包含(注入)在 POST 数据中。通过使用一些命名参数和一些未命名参数创建一个测试端点,并使用一些请求浏览器工具(例如 Firebug),您可以非常清楚地看到它。

显然,支持@Named注解的参数类型只有少数(我认为是 int、long、String、Boolean 及其对应的数组)。

我在下面的原始答案中所说的不是错误的,但不是完整的答案...


原答案:据我了解,@Named 的目的是在请求 URL 中指明参数的名称。这样,参数可以在您的应用程序中具有名称,并且在端点中公开其他名称。

这与 GSON 中的 @SerializedName 或 JDO 中的 @Column 几乎相同。所有这些注释都允许为您的参数使用 2 个不同的名称,一个在您的应用程序中,遵循 Java 命名约定,另一个名称遵循其他约定,例如 URL 或 JSON 的...

在您的示例中,您无法注意到差异,但您可以使用以下方法:

@ApiMethod(
  name = "remove",
  path = "remove",
  httpMethod = HttpMethod.DELETE) 
public void removeFoo(@Named("my_app_id") String myAppID){}

在这种情况下,URL 中的参数名称将是:

https://mygaeappid.appspot.com/_ah/api/yourapi/v1/remove?my_app_id=1234

不,@Named 对象并不总是必须是 ApiMethod 中定义的路径的一部分。

于 2013-03-28T13:57:09.557 回答