为什么 Apache CXF - Jax RS 允许 'GET' 个请求占用 'HEAD' 个请求?

Why does Apache CXF - Jax RS allows 'GET' requests to take up 'HEAD' requests?

我正在使用 Apache CXF Jax-RS 来实现 RESTfull 服务。我已经实现了一个 GET 调用,如下所示:

@GET
@Path("getSomething")
@Produces("application/xml")
public String getSomething() {
    return null;
}

这对我来说工作正常,但在测试人员能够通过 HEAD 请求使用此服务操作(POST 和其他调用失败)后,出现了一个错误。我做了一些研究,发现 HEAD 请求类似于 GET,唯一的区别是它没有 return 主体。所以我有几个关于这个的问题。

1) 为什么 JAX RS 允许使用 @GET 注释的操作接收 HEAD 请求,而它确实有一个单独的 @HEAD 注释可用?

2) 这会导致我的应用程序出现任何类型的问题吗

3) 如果我必须禁止@GET 操作进行@HEAD 操作,我可以这样做吗?

1) 定义在JAX-RS 1.0:

HEAD and OPTIONS requests receive additional automated support. On receipt of a HEAD request an implementation MUST either:

  1. Call a method annotated with a request method designator for HEAD or, if none present,
  2. Call a method annotated with a request method designator for GET and discard any returned entity.

Note that option 2 may result in reduced performance where entity creation is significant.

2) 不,因为您的方法必须是安全的,请参阅 Wikipedia:

The GET method is a safe method (or nullipotent), meaning that calling it produces no side-effects. In other words, retrieving or accessing a record does not change it.

3) 您可以使用 HEAD 注释另一个方法,参见 Jersey 2.22 User Guide:

By default the JAX-RS runtime will automatically support the methods HEAD and OPTIONS, if not explicitly implemented.