为什么 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:
- Call a method annotated with a request method designator for
HEAD
or, if none present,
- 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.
我正在使用 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
andOPTIONS
requests receive additional automated support. On receipt of aHEAD
request an implementation MUST either:
- Call a method annotated with a request method designator for
HEAD
or, if none present,- 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
andOPTIONS
, if not explicitly implemented.